我写我的代码,我使用一个大小为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
奇怪的是idy
总是给我3!有人能帮忙解决吗?
这是完全未定义的行为。对于每个线程,该条件为真。所以8个线程(沿着y维度)正试图写入一个单个位置。写入的值可以是上述任意值。
仅仅因为你看到了一个特定的值并不意味着它是可以解释的一致行为。
如果你真的需要看到合适的结果,我建议你试试下面的
id = idy * N + idx;
if (idx<N && idy<N)
{
c[id]=idx;
d[id]=idy;
}//end if
在测试代码中:
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;
}
在你的代码…例如N = 16
和idx = 2
。这个值是idx
对idy = 1, 2, ... 16
的值,如果这16个线程将2
放入c[2]。
对于d.这16个具有idx = 2
的线程都将其idy
放在d[2]
中,结果取决于线程执行的顺序。