2017-07-20 208 views
2

我是OpenCL的初学者,试图将简单的CUDA函数转换为OpenCL。在CUDA功能,他们已经用下面的代码片段获取其操作的指数,CUDA到OpenCL:OpenCL中(blockIdx.x + blockIdx.y * gridDim.x)* blockDim.x + threadIdx.x的等价物是什么?

int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; 

是get_global_id(0)OpenCL中的上述的相同呢?

int id = get_global_id(0); 
+3

简短的回答是否定的。你有没有想到更多的是/否的答案? – talonmies

+0

@talonmies如果不是,我想找到一个替代方法来实现这一点。 – Avis

回答

4

我不熟悉的CUDA(仅OpenCL的),但它看起来像下面的是等价的:

  • get_group_id(uint dimindx)blockIdx.[xyz]
  • get_local_size(uint dimindx)blockDim.[xyz]
  • get_local_id(uint dimindx)threadIdx.[xyz]
  • get_num_groups(uint dimindx) and gridDim.[xyz]

哪里dimindx是0,1,或2,对应于.x.y,或.z分别。

get_global_id(0)get_group_id(0) * get_local_size(0) + get_local_id(0)相同,所以假设上述等价关系确实是正确的,它将与blockIdx.x * blockDim.x + threadIdx.x相同。 (和等同于指数1 .Y和索引2 .Z)

要得到相同的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_local_size(1)为1.(块的高度为1.)

以上所有内容都假设您已将内核与CUDA中的等效工作组(块)和全局维相关联。

+0

我不确定你最后的表达是否正确,'get_global_id(1)'应该可能是'get_group_id(1)' – talonmies

+0

@talonmies看起来你对这个问题的深入检查是正确的。我会解决它 - 虽然我怀疑在提问者的情况下,块的大小可能是1,否则为获得ID而看起来很奇怪。 – pmdj

+0

@talonmies我怀疑'get_global_id(1)* get_global_size(0)+ get_global_id(0)'是对其他人更有用的东西,所以我添加了一个解释以及纠正原来的效果。 – pmdj

相关问题