2012-09-05 6 views
5

Jeśli zmienna jest przekazywana do jądra z CL_MEM_USE_HOST_PTR, czy oznacza to, że jakakolwiek zmiana w zmiennej w urządzeniu będzie również wyświetlana w pamięci hosta?OpenCL: Spójność pamięci urządzenia/hosta dla zmiennych przekazywanych do jądra za pomocą CL_MEM_USE_HOST_PTR

Jestem w scenariuszu, w którym używam procesora jako urządzenia zamiast GPU, więc wszystko przekazane do jądra zostanie oznaczone CL_MEM_USE_HOST_PTR.

Jeśli to prawda, to nie muszę już czytać wszystkiego z powrotem na hoście, co jest bardzo wygodne.

Odpowiedz

8

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); 
+2

Jest to subtelny haczyka i byłem ugryziony przez to też, więc to dobrze, że ten wychowany. – Ani

+0

@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? –

+1

@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