2010-08-08 2 views
5

Когда я начал программировать в OpenCL я использовал следующий подход для предоставления данных моих ядер:памяти в 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

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

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

+0

Я знаю флаг блокировки clEnqueueRead/WriteBuffer. Однако, когда я делал эти меры, я использовал clFinish (по крайней мере, я уверен, что сделал), который должен иметь тот же эффект, что и флаг блокировки, или нет? То есть, конечно, только при обработке одного и того же количества данных. Hm, возможно, реализация CL достаточно умна, чтобы исключить часть объекта, к которому не обращаются (около 70% от этого) ... Спасибо в любом случае! – VHristov

1

В некоторых случаях процессор и графический процессор могут совместно использовать одну и ту же физическую память 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, но и другие читатели могут быть заинтересованы.

Смежные вопросы