OpenCl эквивалент поиска последовательных индексов в CUDA
В CUDA, чтобы покрыть несколько блоков, и таким образом увеличить диапазон индексов для массивов, мы делаем что-то вроде этого:
Код стороны хоста:
dim3 dimgrid(9,1)// total 9 blocks will be launched
dim3 dimBlock(16,1)// each block is having 16 threads // total no. of threads in
// the grid is thus 16 x9= 144.
Код устройства
...
...
idx=blockIdx.x*blockDim.x+threadIdx.x;// idx will range from 0 to 143
a[idx]=a[idx]*a[idx];
...
...
Каков эквивалент в OpenCL для достижения вышеуказанного случая?
2 ответа
Решение
На хосте, когда вы ставите ядро в очередь, используя clEnqueueNDRangeKernel
, вы должны указать глобальный и локальный размер работы. Например:
size_t global_work_size[1] = { 144 }; // 16 * 9 == 144
size_t local_work_size[1] = { 16 };
clEnqueueNDRangeKernel(cmd_queue, kernel, 1, NULL,
global_work_size, local_work_size,
0, NULL, NULL);
В вашем ядре используйте:
size_t get_global_size(uint dim);
size_t get_global_id(uint dim);
size_t get_local_size(uint dim);
size_t get_local_id(uint dim);
для извлечения глобальных и локальных размеров работы и индексов соответственно, где dim
является 0
за x
, 1
за y
а также 2
за z
,
Эквивалент вашего idx
Таким образом, будет просто size_t idx = get_global_id(0);
Смотрите справочные страницы OpenCL.
Эквивалентности между CUDA и OpenCL:
blockIdx.x*blockDim.x+threadIdx.x = get_global_id(0)
LocalSize = blockDim.x
GlobalSize = blockDim.x * gridDim.x