在CUDA中查找连续索引的OpenCl等价物

在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. 设备

在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中实现上述情况的等价物是什么?

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]。。。