OpenCL - динамическое распределение разделяемой памяти - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь перевести некоторые существующие ядра 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.

...