Como ya habrás visto, realizas una transferencia de host a dispositivo usando clEnqueueWriteBuffer
y similar.
Todos los comandos que tienen la palabra clave 'en cola' en ellos tienen una propiedad especial: Los comandos no se ejecutan directamente, pero cuando Tigger usando clFinish
, clFlush
, clEnqueueWaitForEvents
, utilizando clEnqueueWriteBuffer
en el modo de bloqueo y algunos más.
Esto significa que todas las acciones se realizan a la vez y debe sincronizarse con los objetos de evento. Como todo (puede) ocurrir a la vez, se podría hacer algo como esto (Cada punto sucede al mismo tiempo):
- datos transferir una
- Proceso de Datos Un & transferencia de datos B
- Proceso de Datos B & transferencia de datos C & retrive datos A '
- Proceso de datos C & recuperar datos B'
- recuperar datos C'
Recuerde: ¡Encarrar tareas sin objetos de evento puede dar como resultado la ejecución simultánea de todos los elementos puestos en cola!
Para asegurarse de que Process Data B no se produce antes de Transferir B, debe recuperar un objeto de evento de clEnqueueWriteBuffer
y proporcionarlo como un objeto para esperar a f.i. clEnqueueNDRangeKernel
cl_event evt;
clEnqueueWriteBuffer(... , bufferB , ... , ... , ... , bufferBdata , NULL , NULL , &evt);
clEnqueueNDRangeKernel(... , kernelB , ... , ... , ... , ... , 1 , &evt, NULL);
lugar de suministrar NULL, cada comando puede, por supuesto, esperar en ciertos objetos y generar un nuevo objeto de evento. El parámetro junto al último es una matriz, por lo que puede esperar varios eventos.
EDIT: Para resumir los comentarios a continuación
Transferencia de datos - ¿Qué actos de comandos donde?
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
* Es posible inicializar el buffer directamente por el suministro de datos utilizando el parámetro host_ptr
.
+1 para el proceso que ha usado para hacer el diagrama :) –