Come forse già visto, si effettua un trasferimento da host a dispositivo utilizzando clEnqueueWriteBuffer
e simili.
Tutti i comandi che hanno la parola 'accodamento' in loro hanno una proprietà speciale: I comandi non vengono eseguiti direttamente, ma quando Tigger utilizzando clFinish
, clFlush
, clEnqueueWaitForEvents
, utilizzando clEnqueueWriteBuffer
in modalità e qualche altro blocco.
Ciò significa che tutte le azioni si verificano contemporaneamente e che è necessario sincronizzarle utilizzando gli oggetti evento. Come tutto (può) accadere in una sola volta, si potrebbe fare qualcosa di simile (Ogni punto accade allo stesso tempo):
- trasferimento dati Un
- dati di processo Un & trasferimento dati B
- dati di processo B & trasferimento dati C & retrive dati A '
- dati di processo C & Recupero dati B'
- Recupero dati C'
Ricordare: l'accodamento di attività senza oggetti evento può comportare l'esecuzione simultanea di tutti gli elementi accodati!
Per assicurarsi che Process Data B non avvenga prima del trasferimento B, è necessario recuperare un oggetto evento da clEnqueueWriteBuffer
e fornirlo come oggetto per attendere f.i. clEnqueueNDRangeKernel
cl_event evt;
clEnqueueWriteBuffer(... , bufferB , ... , ... , ... , bufferBdata , NULL , NULL , &evt);
clEnqueueNDRangeKernel(... , kernelB , ... , ... , ... , ... , 1 , &evt, NULL);
Invece di fornire NULL, ogni comando può naturalmente attendere su alcuni oggetti e generare un nuovo oggetto evento. Il parametro next to last è un array, quindi è possibile attendere eventi per diversi eventi!
EDIT: Per riassumere i commenti qui sotto
dati Trasferimento - Che comando agisce Dove?
CPU GPU
BufA BufB
array[] = {...}
clCreateBuffer() ----->[ ] //Create (empty) Buffer in GPU memory *
clCreateBuffer() -----> [ ][ ] //Create (empty) Buffer in GPU memory *
clWriteBuffer() -arr-> [array] [ ] //Copy from CPU to GPU
clCopyBuffer() [array] -> [array] //Copy from GPU to GPU
clReadBuffer() <-arr- [array] [array] //Copy from GPU to CPU
* È possibile inizializzare il buffer direttamente, fornendo i dati utilizzando il parametro host_ptr
.
+1 per il processo che hai utilizzato per creare lo schema :) –