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