2012-07-02 16 views
7

Sono principiante nella programmazione parallela. Ho una domanda che potrebbe sembrare sciocca ma non ho avuto una risposta definitiva quando ho cercato su Google.La GPU legge dalla CPU o dalla CPU nella GPU?

Nel calcolo GPU è presente un dispositivo, ad esempio la GPU e l'host, ovvero la CPU. Ho scritto un semplice programma mondiale Hello che assegnerà un po 'di memoria sulla gpu, passerà due parametri (diciamo src [] e dest []) al kernel, copia src string ie Hello world a dest string e ottieni la stringa dest da gpu a il padrone di casa.

La stringa "src" viene letta dalla GPU o la CPU scrive nella GPU? Inoltre, quando torniamo alla stringa da GPU, la GPU sta scrivendo alla CPU o alla CPU che legge dalla GPU?

Nel trasferire i dati avanti e indietro non ci può essere quattro possibilità 1. CPU su GPU - CPU scrive alla GPU - GPU legge modulo CPU 2. GPU per CPU - GPU scrive alla CPU - CPU legge da GPU

Qualcuno può spiegare quali di questi sono possibili e quali no?

risposta

7

Nelle versioni precedenti di CUDA e nei corrispondenti modelli hardware, la GPU era più strettamente un coprocessore di proprietà della CPU; la CPU ha scritto le informazioni alla GPU e ha letto le informazioni quando la GPU era pronta. Al livello più basso, questo significava che stavano davvero accadendo tutte e quattro le cose: la CPU scriveva i dati su PCIe, la GPU leggeva i dati da PCIe, la GPU scriveva i dati su PCIe e la CPU rileggeva il risultato. Ma le transazioni sono state avviate dalla CPU.

Più recentemente (CUDA 3? 4? Forse anche a partire dal 2?), Alcuni di questi dettagli sono nascosti dal livello dell'applicazione, in modo che, in modo efficace, il codice GPU possa causare l'avvio dei trasferimenti più o meno allo stesso modo di la CPU può. Considerare l'indirizzamento virtuale unificato, in base al quale i programmatori possono accedere a uno spazio di indirizzi virtuali unificato per la memoria della CPU e della GPU. Quando la GPU richiede memoria nello spazio CPU, questo deve iniziare un trasferimento dalla CPU, essenzialmente dalla CPU. Viene inoltre mantenuta la possibilità di inserire dati nella GPU dal lato CPU. Fondamentalmente, tutti i modi sono possibili ora, al livello più alto (a livelli bassi, è in gran parte lo stesso tipo di protocollo di sempre: entrambi leggono e scrivono sul bus PCIe, ma ora anche le GPU possono avviare le transazioni).

+1

Che, tramite vari controller sincronizzati si riduce a DMA (http://en.wikipedia.org/wiki/Direct_memory_access). – Ani

+0

Grazie mille. È bello sapere che la GPU può anche avviare le transazioni. Quindi c'è un modo per sapere chi ha effettivamente avviato le transazioni usando una delle routine di libreria in Opencl? o le routine con cui posso forzare la CPU o la GPU per eseguire la transazione ..? – Nike

+0

Non conosco OpenCL come avrei dovuto; Detto questo, sarei sorpreso se CUDA non ti desse * un * modo * per verificare dove una variabile viveva nello spazio di indirizzi virtuali unificato. Questo tipo di informazioni potrebbe essere utile, anche al di fuori del caso d'uso dei trasferimenti esplicitamente gestiti (che le versioni più recenti dovrebbero ancora supportare). – Patrick87

1

In OpenCL l'host (CPU) controlla esclusivamente tutti i trasferimenti di dati tra GPU e GPU. L'host trasferisce i dati alla GPU utilizzando i buffer. L'host trasferisce (legge) indietro dalla GPU utilizzando i buffer. Per alcuni sistemi e dispositivi, il trasferimento non copia fisicamente i byte poiché l'host e la GPU utilizzano la stessa memoria fisica. Questo è chiamato zero copy.

2

In realtà nessuno di questi. Il codice CPU avvia la copia dei dati, ma mentre i dati vengono trasferiti dal controller di memoria nella memoria della GPU tramite qualsiasi bus sul sistema. Nel frattempo, la CPU può elaborare altri dati. Analogamente, quando la GPU ha terminato di eseguire i kernel avviati, il codice della CPU avvia la copia dei dati, ma nel frattempo sia GPU che CPU possono gestire altri dati o eseguire altro codice.

Le copie sono denominate asincrone o non bloccanti. È possibile opzionalmente fare copie di blocco, in cui la CPU attende che la copia sia completata.

Quando si avvia un'attività asincrona, di solito si registra un "evento", che è una sorta di flag che è possibile verificare in seguito, per vedere se l'attività è stata completata o meno.

1

Ho appena scoperto in questo forum http://devgurus.amd.com/thread/129897 che utilizza CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR in clCreateBuffer alloca la memoria sull'host e non verrà copiata sul dispositivo.

Potrebbero esserci problemi con le prestazioni ma questo è quello che sto cercando. I vostri commenti per favore ..

Problemi correlati