Emulatore GPU per la programmazione CUDA senza hardware [chiuso]


111

Domanda: esiste un emulatore per una scheda Geforce che mi consenta di programmare e testare CUDA senza avere l'hardware effettivo?


Informazioni:

Sto cercando di velocizzare alcune mie simulazioni in CUDA, ma il mio problema è che non sono sempre vicino al mio desktop per fare questo sviluppo. Vorrei invece lavorare sul mio netbook, ma il mio netbook non ha una GPU. Per quanto ne so, hai bisogno di una GPU compatibile con CUDA per eseguire CUDA. C'è un modo per aggirare questo problema? Sembrerebbe che l'unico modo sia un emulatore della GPU (che ovviamente sarebbe dolorosamente lento, ma funzionerebbe). Ma qualunque sia il modo per farlo, mi piacerebbe sentire.

Sto programmando su Ubuntu 10.04 LTS.


Risposte:


39

Per coloro che cercano la risposta nel 2016 (e anche nel 2017) ...


disconoscimento

  • Dopo tutto, non sono riuscito a emulare la GPU.
  • Potrebbe essere possibile utilizzare gpuocelotse soddisfi il suo elenco di dipendenze.

Ho provato a ottenere un emulatore per BunsenLabs (Linux 3.16.0-4-686-pae # 1 SMP Debian 3.16.7-ckt20-1 + deb8u4 (2016-02-29) i686 GNU / Linux).

Ti dirò cosa ho imparato.


  1. nvccutilizzato per avere -deviceemuun'opzione di nuovo in CUDA Toolkit 3.0

    Ho scaricato CUDA Toolkit 3.0, l'ho installato e ho provato a eseguire un semplice programma:

    #include <stdio.h>
    
    __global__ void helloWorld() {
        printf("Hello world! I am %d (Warp %d) from %d.\n",
            threadIdx.x, threadIdx.x / warpSize, blockIdx.x);
    }
    
    int main() {
        int blocks, threads;
        scanf("%d%d", &blocks, &threads);
        helloWorld<<<blocks, threads>>>();
        cudaDeviceSynchronize();
        return 0;
    }

    Notare che in CUDA Toolkit 3.0 nvccera in /usr/local/cuda/bin/.

    Si è scoperto che avevo difficoltà a compilarlo:

    NOTE: device emulation mode is deprecated in this release
          and will be removed in a future release.
    
    /usr/include/i386-linux-gnu/bits/byteswap.h(47): error: identifier "__builtin_bswap32" is undefined
    
    /usr/include/i386-linux-gnu/bits/byteswap.h(111): error: identifier "__builtin_bswap64" is undefined
    
    /home/user/Downloads/helloworld.cu(12): error: identifier "cudaDeviceSynchronize" is undefined
    
    3 errors detected in the compilation of "/tmp/tmpxft_000011c2_00000000-4_helloworld.cpp1.ii".

    Ho scoperto su Internet che se avessi usato gcc-4.2o similmente antico invece gcc-4.9.2gli errori potrebbero scomparire. Mi sono arreso.


  2. gpuocelot

    La risposta di Stringer ha un collegamento a un gpuocelotsito web del progetto molto vecchio . Quindi all'inizio ho pensato che il progetto fosse stato abbandonato nel 2012 o giù di lì. In realtà, è stato abbandonato pochi anni dopo.

    Ecco alcuni siti Web aggiornati:

    Ho provato ad installare gpuocelot seguendo la guida . Tuttavia, ho avuto diversi errori durante l'installazione e ho rinunciato di nuovo. gpuocelotnon è più supportato e dipende da una serie di versioni molto specifiche di librerie e software.

    Potresti provare a seguire questo tutorial da luglio 2015 ma non garantisco che funzionerà. Non l'ho provato.


  3. MCUDA

    Il framework di traduzione MCUDA è uno strumento basato su Linux progettato per compilare efficacemente il modello di programmazione CUDA su un'architettura CPU.

    Potrebbe essere utile. Ecco un collegamento al sito web .


  4. Rifiuti CUDA

    È un emulatore da usare su Windows 7 e 8. Non l'ho provato però. Non sembra più essere sviluppato (l'ultimo commit è datato 4 luglio 2013).

    Ecco il link al sito web del progetto: https://code.google.com/archive/p/cuda-waste/


  1. CU2CL

    Ultimo aggiornamento: 12.03.2017

    Come sottolineato da Dashesy nei commenti, CU2CL sembra essere un progetto interessante. Sembra essere in grado di tradurre il codice CUDA in codice OpenCL. Quindi, se la tua GPU è in grado di eseguire codice OpenCL, il progetto CU2CL potrebbe essere di tuo interesse.

    link:


4
È un peccato! Non fornendo un percorso lento è molto difficile creare e testare applicazioni su qualsiasi macchina. Ciò significa che gli sviluppatori dovrebbero evitare di aggiungere dipendenza a Cuda. È ancora utilizzabile da hobbisti e ricercatori, per progetti una tantum. Non per applicazioni reali per i clienti.
dashesy

3
CU2CL sembra essere attivo e vale anche la pena guardarlo.
dashesy

1
1. nvcc -deviceemu
Nathan

2
4. ha CUDA Wastefunzionato
Nathan

2
5. ha CU2CLfunzionato
Nathan il

41

Questa risposta potrebbe essere troppo tardi, ma vale comunque la pena notare. GPU Ocelot ( di cui sono uno dei contributori principali ) può essere compilato senza i driver di dispositivo CUDA (libcuda.so) installati se si desidera utilizzare i backend Emulator o LLVM. Ho dimostrato l'emulatore su sistemi senza GPU NVIDIA.

L'emulatore tenta di implementare fedelmente le specifiche PTX 1.4 e PTX 2.1 che possono includere funzionalità che le GPU meno recenti non supportano. Il traduttore LLVM si impegna per una traduzione corretta ed efficiente da PTX a x86 che, si spera, renderà CUDA un modo efficace di programmare CPU multicore e GPU. -deviceemuè stata una funzionalità deprecata di CUDA per un bel po 'di tempo, ma il traduttore LLVM è sempre stato più veloce.

Inoltre, nell'emulatore sono incorporati diversi correttori di correttezza per verificare: gli accessi alla memoria allineati, gli accessi alla memoria condivisa sono sincronizzati correttamente e il dereferencing della memoria globale accede alle aree allocate di memoria. Abbiamo anche implementato un debugger interattivo a riga di comando ispirato in gran parte da gdb per eseguire un singolo passaggio attraverso i kernel CUDA, impostare breakpoint e watchpoint, ecc ... Questi strumenti sono stati sviluppati specificatamente per accelerare il debugging dei programmi CUDA; potresti trovarli utili.

Mi dispiace per l'aspetto solo Linux. Abbiamo avviato un ramo Windows ( così come un port per Mac OS X ) ma il carico di ingegneria è già abbastanza grande da sottolineare le nostre attività di ricerca. Se qualcuno ha tempo e interesse, potrebbe desiderare di aiutarci a fornire supporto per Windows!

Spero che questo ti aiuti.


3
Ciao, sei ancora in giro? Esiste documentazione su come si costruisce un programma con Ocelot su un ambiente di compilazione CUDA esistente? Inoltre, Ocelot funziona con Thrust?
Kerrek SB

Il codice sorgente GPU Ocelot più recente può essere trovato tramite GitHub gtcasl / gpuocelot .
l --marc l

36

Puoi controllare anche il progetto gpuocelot che è un vero emulatore nel senso che verrà emulato PTX (bytecode in cui viene convertito il codice CUDA).

C'è anche un traduttore LLVM, sarebbe interessante testare se è più veloce di quando si usa -deviceemu.


La parte triste è che è solo per Linux. Il che, sebbene io sia un utente Linux di default. una piccola parte dello sviluppo che faccio è su macchine Windows. -Deviceemu è stato deprecato, quindi la risposta di jskaggz non si adatta perfettamente. nel complesso, questa sembra essere la risposta migliore.
Narcolapser

14

Il toolkit CUDA ne aveva uno integrato fino al ciclo di rilascio di CUDA 3.0. Se usi una di queste versioni molto vecchie di CUDA, assicurati di usare -deviceemu quando compili con nvcc.


4
L'emulatore CUDA è deprecato, probabilmente starai meglio guardando gpuocelot.
Tom,

1
Inoltre l'emulatore CUDA utilizza un thread del sistema operativo nativo per thread CUDA logico che è terribilmente inefficiente.
Stringer

9

https://github.com/hughperkins/cuda-on-cl ti consente di eseguire programmi NVIDIA® CUDA ™ su GPU OpenCL 1.2 (divulgazione completa: sono l'autore)


Posso eseguirlo anche su una CPU?
Mateusz Piotrowski

Solo GPU. Ha bisogno della GPU OpenCL 1.2 o migliore.
Hugh Perkins

1
Probabilmente puoi eseguirlo sulla CPU, usando jr” / Oclgrind , ma immagino che probabilmente non è quello che intendevi ;-). Immagino che Coriander (il nuovo nome) probabilmente possa funzionare anche su CPU OpenCL, ma non l'ho mai testato. Potrebbe essere necessario un po 'di sollecitazione.
Hugh Perkins,

3

Fai attenzione quando stai programmando usando -deviceemu poiché ci sono operazioni che nvcc accetterà in modalità di emulazione ma non quando è effettivamente in esecuzione su una GPU. Questo si trova principalmente con l'interazione dispositivo-host.

E come hai detto, preparati per un'esecuzione lenta.


0

GPGPU-Sim è un simulatore GPU in grado di eseguire programmi CUDA senza utilizzare GPU. Ho creato un'immagine docker con GPGPU-Sim installato per me stesso nel caso in cui fosse utile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.