Я пытаюсь перевести некоторые существующие ядра CUDA в OpenCL, и проблема в том, что я обязан использовать OpenCL 1.2, поэтому невозможно использовать неоднородный размер рабочей группы , что означает, что Я должен позволить enqueueNDRangeKernel
определить размер локальной рабочей группы (чтобы избежать неделимого размера рабочей группы по сравнению с глобальным размером работы).
Как упомянуто в этой презентации , я использую __local int *
, который является аргументом функции ядра, в качестве указателя общей памяти с размером, который определен в коде хоста с использованием <Kernel>.setArg
.
В некоторых из этих ядер CUDA я выделил динамическую разделяемую память с размером, который зависит от Thread-Block или размера локальной рабочей группы. Когда я пытаюсь перевести эти ядра в OpenCL, я не знаю, как получить размер локальной рабочей группы, который устанавливается enqueueNDRangeKernel
, передавая значение NULL для аргумента local
, чтобы оно автоматически определяло размер локальной рабочей группы.
Чтобы было понятнее, все, что я хочу, это перевести этот фрагмент кода CUDA в OpenCL:
dim3 block_size, grid_size;
unsigned int smem_size;
block_size.x = 10;
block_size.y = 10;
block_size.z = 2;
// smem_size is depandant on ThreadBlock size.
smem_size = (block_size.x * block_size.y * block_size.z) * 5;
myCudaKernel<<< grid_size, block_size, smem_size >>>(...);
* Кстати, мне нужно общее решение, которое можно использовать и для трехмерных рабочих групп.
* У меня есть видеокарта Nvidia.