在CUDA中计算线程ID

时间:2011-12-06 13:41:49

标签: cuda

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

int idx = blockIdx.x * blockDim.x + threadIdx.x;  
int idy = blockIdx.y * blockDim.y + threadIdx.y;  

为了检查它,我将idx和idy放在一维数组中,因此我可以将其复制到主机以将其打印出来。

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

奇怪的是idy总是给我3个! 任何人都可以帮忙解决它吗?

3 个答案:

答案 0 :(得分:2)

这是完全未定义的行为。 每个线程的条件都是正确的。所以8个线程(沿着y维度)试图写入单个位置。写入的值可以是任何一个值。

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

如果您确实需要看到正确的结果,我建议您尝试以下

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

答案 1 :(得分:0)

在您的测试代码中:

d[idx]=idy;

应该是:

d[idy]=idy;

答案 2 :(得分:0)

正确解决了线程ID。但是,如果要填充每个线程的唯一标识符,则必须创建大小为c的{​​{1}}和d数组,并将其填充为

N*N

在您的代码中..例如if (idx<N && idy<N) { c[idy*gridDim.x+idx]=idx; d[idy*gridDim.x+idx]=idy; } ,您有N = 16。以及idx = 2idx的这个值,以及这16个线程将idy = 1, 2, ... 16放入c [2]的每个值。

d。这个带有2的16个线程中的每一个都将idx = 2置于idy中,结果取决于线程执行的顺序。