2010-08-23 16 views
5

Sto lavorando alla traduzione di un'applicazione CUDA (this if you must know) in OpenCL. L'applicazione originale utilizza l'API CUDA in stile C, con un singolo flusso solo per evitare l'attesa di attesa automatica durante la lettura dei risultati.Eventi OpenCL e code comandi

Ora noto che le code di comando di OpenCL assomigliano molto ai flussi CUDA. Ma in the device read command e analogamente nei comandi di scrittura e di esecuzione del kernel, noto anche i parametri per gli eventi. Quindi mi chiedo, che cosa serve per eseguire una scrittura del dispositivo, un numero di kernel (ad esempio una chiamata a un kernel e 100 chiamate a un altro kernel) e un dispositivo letto, tutto in sequenza?

  1. Se li accodo in sequenza nella stessa coda, eseguiranno in sequenza come fanno in CUDA?
  2. Se ciò non funziona, è possibile/devo sincronizzare eventi, rendendo l'elenco di attesa di ogni chiamata l'evento della chiamata precedente?
  3. Oppure devo aggiungere tutti gli eventi precedenti all'elenco di attesa di ogni chiamata, ad esempio se esiste una ricerca N^2 per le dipendenze o qualcosa del genere?
  4. Oppure devo semplicemente event.wait() per ogni chiamata individualmente, come si dice in AMD's tutorial?

Grazie!

risposta

5

Dipende dal modo in cui si crea la coda comandi. in clCreateCommandQueue c'è un parametro delle proprietà che può contenere CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, che abilita l'esecuzione non sequenziale nella coda dei comandi.

Se la proprietà è impostata, i comandi potrebbero essere eseguiti in ordine o in parallelo e l'unico modo per sincronizzarli consiste nell'utilizzare gli eventi.

Quando questa proprietà non è impostata, i comandi vengono eseguiti in sequenza nella coda.

+0

L'unico posto in cui non pensavo di guardare. Grazie! –

+0

Dovrò modificare la mia affermazione in "per lo più accettato". Sembra essere vero che un certo numero di kernel è stato accodato per calcolare in ordine. Tuttavia, le letture e le scritture del buffer sembrano eseguire out-of-order a meno che non utilizzi entrambi gli eventi * e * attende, forse anche se la lettura/scrittura è specificata come sincrona. Vedi anche l'esempio di atiopencl in BOINC (boinc.berkeley.edu) per un esempio funzionante. –

+0

Non è così che funziona CL, vedere la sezione 5.1 di OpenCL sulla creazione di code di comandi. Se vedi un comportamento diverso, si tratta di un errore di implementazione (bug). –