我编写代码,并使用一个大小为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个!
任何人都可以帮忙解决它吗?
答案 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 = 2
对idx
的这个值,以及这16个线程将idy = 1, 2, ... 16
放入c [2]的每个值。
d。这个带有2
的16个线程中的每一个都将idx = 2
置于idy
中,结果取决于线程执行的顺序。