Управление памятью в OpenCL - PullRequest
       19

Управление памятью в OpenCL

5 голосов
/ 09 августа 2010

Когда я начал программировать в OpenCL, я использовал следующий подход для предоставления данных своим ядрам:

cl_mem buff = clCreateBuffer(cl_ctx, CL_MEM_READ_WRITE, object_size, NULL, NULL);
clEnqueueWriteBuffer(cl_queue, buff, CL_TRUE, 0, object_size, (void *) object, NULL, NULL, NULL);

Это, очевидно, потребовало, чтобы я разбил свои данные на куски, гарантируя, что каждый кусок будет соответствовать устройствуобъем памяти.После выполнения вычислений я считал данные с помощью clEnqueueReadBuffer ().Однако в какой-то момент я понял, что могу просто использовать следующую строку:

cl_mem buff = clCreateBuffer(cl_ctx, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, object_size, (void*) object, NULL);

При этом разбиение данных устарело.И, к моему удивлению, я испытал большой прирост производительности.Это то, что я не понимаю.Из того, что я получил, при использовании указателя хоста память устройства работает как кеш, но все данные все еще должны быть скопированы в нее для обработки и затем скопированы обратно в основную память после завершения.Почему использование явной копии (clEnqueRead / WriteBuffer) происходит на порядок медленнее, когда, на мой взгляд, оно должно быть в основном таким же?Я что-то пропустил?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 09 августа 2010

Да, вам не хватает CL_TRUE в вызове clEnqueueWriteBuffer. Это блокирует операцию записи, которая останавливает процессор, пока выполняется копирование. Используя указатель хоста, реализация OpenCL может «оптимизировать» копию, сделав ее асинхронной, что в целом повышает производительность.

Обратите внимание, что это зависит от реализации CL, и нет гарантии, что будет быстрее / равно / медленнее.

1 голос
/ 07 января 2018

В некоторых случаях процессор и графический процессор могут совместно использовать одну и ту же физическую память DRAM.Например, если блок памяти удовлетворяет правилам выравнивания CPU и GPU, то Intel интерпретирует CL_MEM_USE_HOST_PTR как разрешение на совместное использование физического DRAM между CPU и GPU, поэтому фактическое копирование данных не выполняется.Очевидно, это очень быстро!

Вот ссылка, которая объясняет это:

https://software.intel.com/en-us/articles/getting-the-most-from-opencl-12-how-to-increase-performance-by-minimizing-buffer-copies-on-intel-processor-graphics

PS Я знаю, что мой ответ слишком стар для OP, но другие читателиможет быть интересно.

...