Twoje zrozumienie jest prawidłowe, z wyjątkiem jednego z możliwych pułapki: documentation stwierdza, że
implementacje OpenCL mogą buforować zawartość bufora wskazywanego przez host_ptr
w pamięci urządzenia. Ta buforowana kopia może być używana , gdy jądra są wykonywane na urządzeniu.
Oznacza to, że zmiany danych wykonanych przez jądro mogą nie zostać natychmiast odzwierciedlone w host_ptr
. W rzeczywistości nie ma gwarancji, że host_ptr
zawiera prawidłowe dane, gdy jest używane do buforowania.
Aby mieć aktualne i aktualne dane, należy wymusić synchronizację. Offcial dokumentacja jest trochę niejasne o tej chwili, ale buffer mapping/unmapping pewno działa:
Jeśli obiekt buforowy jest tworzony z CL_MEM_USE_HOST_PTR
zestawu w mem_flags
The host_ptr
określone w clCreateBuffer
gwarantuje zawierać najnowsze bitów w region jest odwzorowywany po wykonaniu polecenia clEnqueueMapBuffer
; a wartość wskaźnika zwrócona przez clEnqueueMapBuffer
będzie pochodzić z host_ptr
określonej podczas tworzenia obiektu bufora.
Oto przykład adaptacja Khronos group forum post:
cl_mem device_output = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, size, original_output, NULL);
// run the kernel
void* pointer = clEnqueueMapBuffer(queue, device_output, CL_TRUE, CL_MAP_READ, size, 0, 0, NULL, NULL, NULL);
// work with 'original_output'
clEnqueueUnmapMemObject(queue, device_output, pointer, 0, NULL, NULL);
clReleaseMemObject(device_output);
Jest to subtelny haczyka i byłem ugryziony przez to też, więc to dobrze, że ten wychowany. – Ani
@aland myślę, że pytam bardzo późno .. Ale zamiast mapowania pamięci, jeśli oczekuję przy użyciu zdarzenia .. będzie aktualizować moją właściwą tablicę w urządzeniu hosta? dla mnie działa (może być używać zdarzenia, aby zakończyć jądro). ale czy mogę pominąć mapowanie? –
@Vishwadeep Właśnie czekanie, aż jądro zakończy wykonywanie, jest [* nie * wystarczająco] (http://www.khronos.org/message_boards/showthread.php/6912-Clarify-CL_MEM_USE_HOST_PTR?p=22099&viewfull=1#post22099). Twoje podejście może zadziałać, zwłaszcza jeśli dobrze, że używasz CPU tylko jako urządzenia obliczeniowego, ale to wciąż nieokreślone zachowanie. – aland