CUDA到OpenCL的等价物是什么(blockIdx.x+;blockIdx.y*gridDim.x)*blockDim.x+;OpenCL中的threadIdx.x?

CUDA到OpenCL的等价物是什么(blockIdx.x+;blockIdx.y*gridDim.x)*blockDim.x+;OpenCL中的threadIdx.x?,cuda,opencl,Cuda,Opencl,我是OpenCL的初学者,试图将一个简单的CUDA函数转换为OpenCL。在CUDA函数中,他们使用下面的代码片段获取操作索引 int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; get_global_id(0)是否等同于OpenCL中的上述内容 int id = get_global_id(0); 我对CUDA(仅OpenCL)不熟悉,但它看起来是等效的: get\u group\u id(ui

我是OpenCL的初学者,试图将一个简单的CUDA函数转换为OpenCL。在CUDA函数中,他们使用下面的代码片段获取操作索引

int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x;
get_global_id(0)是否等同于OpenCL中的上述内容

int id = get_global_id(0);

我对CUDA(仅OpenCL)不熟悉,但它看起来是等效的:

  • get\u group\u id(uint dimindx)
    blockIdx.[xyz]
  • 获取本地大小(uint dimindx)
    块大小。[xyz]
  • get\u local\u id(uint dimindx)
    threadIdx.[xyz]
  • get\u num\u group(uint dimindx)
    gridDim.[xyz]
其中,
dimindx
是0、1或2,分别对应于
.x
.y
.z

get\u global\u id(0)
get\u group\u id(0)*get\u local\u size(0)+get\u local\u id(0)
相同,因此假设上述等价关系确实正确,它将与
blockIdx.x*blockDim.x+threadIdx.x
相同。(并等效于指数1和指数2和指数y)

要获得相同的ID值,我认为您可能需要以下内容:

int id = get_group_id(1) * get_global_size(0) + get_global_id(0);
请注意,原始CUDA代码没有明确考虑
threadIdx.y
。我怀疑这可能是因为您的
blockDim.y
是1,或者是因为您真正试图获取块中最顶端的项(而不是与当前线程对应的项)

更常见的情况可能是将当前工作项的索引放入包含2D元素数组的缓冲区中的数组中:

int id = get_global_id(1) * get_global_size(0) + get_global_id(0);
如果
get\u local\u size(1)
为1,则这当然等同于前面的表达式。(块的高度为1。)


以上所有假设您已将内核与CUDA中相同的工作组(块)和全局维度排入队列。

简短的答案是否。您是否考虑到了比是/否更重要的答案?@Talonmes如果不是,我想找到另一种方法来实现这一点。我不确定您的上一个表达式是否正确,
get\u global\u id(1)
应该是
get\u group\u id(1)
@talonmies看起来你对这个问题进行了更深入的检查。我会解决它-虽然我怀疑在询问者的情况下,块大小可能是y方向上的1,否则获取ID似乎是件奇怪的事情。@Talonmes我怀疑
get\u global\u ID(1)*get\u global\u size(0)+get\u global\u ID(0)
对其他人更有用,因此,我添加了一个解释,并更正了原来的解释。