Во время моей работы с OpenCL я обнаружил очень важное различие между
cl_mem CT = clCreateImage3DContext, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR , Volume_format, X, Y, Z, rowPitch, slicePitch, sourceData, &error);
и
cl_mem CT = clCreateImage3D(Context, CL_MEM_READ_ONLY , Volume_format, X, Y, Z, 0, 0, 0, &error);
error = clEnqueueWriteImage(CommandQue, CT, CL_TRUE, origin, region, rowPitch, slicePitch, sourceData, 0, 0, 0);
. При первом подходе OpenCL скопирует указатель хоста не напрямую в GPU.Сначала он выделит второй временный буфер на хосте, который может вызвать проблемы, если вы загружаете большие вещи, такие как CT, в GPU.На короткое время необходимая память в два раза больше размера КТ.Также данные не копируются во время этой функции.Он копируется во время установки аргумента в функцию ядра, которая использует объект трехмерного изображения.
Второй подход позволяет напрямую копировать данные в графический процессор.Нет дополнительных выделений, сделанных OpenCL.Я думаю, что это, вероятно, то же самое для обычных объектов буфера.