我不熟悉的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中的等效工作组(块)和全局维相关联。
简短的回答是否定的。你有没有想到更多的是/否的答案? – talonmies
@talonmies如果不是,我想找到一个替代方法来实现这一点。 – Avis