在CUDA中计算线程ID

在CUDA中计算线程ID,cuda,Cuda,我写我的代码,我使用一个大小为8*8的块。我使用此公式定义矩阵的索引: int idx = blockIdx.x * blockDim.x + threadIdx.x; int idy = blockIdx.y * blockDim.y + threadIdx.y; 为了检查它,我把idx和idy放在一个1D数组中,这样我就可以把它复制到主机上打印出来 if (idx<N && idy<N) { c[idx]=idx; d[idx]=idy

我写我的代码,我使用一个大小为8*8的块。我使用此公式定义矩阵的索引:

int idx = blockIdx.x * blockDim.x + threadIdx.x;  
int idy = blockIdx.y * blockDim.y + threadIdx.y;  
为了检查它,我把
idx
和idy放在一个1D数组中,这样我就可以把它复制到主机上打印出来

if (idx<N && idy<N) 
{
    c[idx]=idx;
    d[idx]=idy;
}//end if
if(idx在测试代码中:

d[idx]=idy;
应该是:

d[idy]=idy;

线程ID的求解是正确的。但如果要填充每个线程的唯一标识符,必须创建
c
d
数组,数组大小为
N*N
,并按如下方式填充

if (idx<N && idy<N) 
{
   c[idy*gridDim.x+idx]=idx;
   d[idy*gridDim.x+idx]=idy;
}

if(idx这是完全未定义的行为。该条件对每个线程都为真。因此8个线程(沿y维度)正试图写入单个位置。写入的值可以是其中任何一个

仅仅因为你看到一个特定的值并不意味着它是可以解释的一致的行为

如果你真的需要看到正确的结果,我建议你尝试以下方法

id = idy * N + idx;
if (idx<N && idy<N) 
{
    c[id]=idx;
    d[id]=idy;
}//end if
id=idy*N+idx;

如果(idxEven这不会有帮助-在这两种情况下都应该是
idx+gridDim.x*idy
让每个线程都向全局内存写入一个唯一的值谢谢你Paul,是的,它会给我另一个输出。但是这是怎么回事?!
d
的所有元素的值都是随机的。
N
的值是什么?imxp
N%8==3
。否?…那是什么nk你为你的重播欢呼。第一次我认为它是因为线程之间的速度,五月线程3是最快的。但我运行了很多次,但仍然给我3。N是块大小,在这种情况下是8。你如何初始化你的内核调用?你使用了什么值块/网格维度?图片在你的问题中非常模糊。如果你你可以发布你的完整代码,我可以看一下。例如,“c”和“d”的数据类型会有所不同,执行参数以及CPU端代码。线程是按列主顺序编号的,而不是按行主顺序编号的,所以你的答案中可能使用了错误的索引公式。谢谢你的回答。我使用这个索引ex和c给了我所有的0..c[idxblockDim.x+idy]=idx;//[idy];d[idxblockDim.x+idy]=idy;//[idx];@asma如果你使用
idy*gridDim.x+idx
你的
c
数组是
0,1,2,4,6,7,0,1,2,3,4,5,6,7…
d
0,0,0,0,0,0,0,1,1,1,1
。如果你使用
idx*gridDim.y+idy>你的情况正好相反。但是cuda列的顺序是正确的。