在CUDA中查找连续索引的OpenCl等价物
在CUDA中,为了覆盖多个块,从而增加阵列的索引范围,我们执行以下操作: 主机端代码:在CUDA中查找连续索引的OpenCl等价物,cuda,opencl,cuda.net,opencl.net,Cuda,Opencl,Cuda.net,Opencl.net,在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. 设备
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中实现上述情况的等价物是什么?CUDA和OpenCL之间的等价物是:
blockIdx.x*blockDim.x+threadIdx.x = get_global_id(0)
LocalSize = blockDim.x
GlobalSize = blockDim.x * gridDim.x
在主机上,当您使用
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
对于x
为0
,1
对于y
和2
对于z
因此,您的idx
的等价物将只是size\t idx=get\u global\u id(0)代码>
请参阅。您可能需要更改设备端代码。您启动的配置的idx范围为0到11。您可能需要执行idx=(blockIdx.y*gridDim.x+blockIdx.x)*(blockDim.x*blockDim.y)+threadIdx.y*blockDim.x+threadIdx.x;它的范围在0到143之间。哦,这是由mnistake。。。编辑的块dim为一个dim,因此我这样做:主机端:localWorkSize[0]=16;globalWorkSize[0]=9*16;设备端:int i=get_global_id(0)a[idx]=a[idx]*a[idx]。。。