我正在使用 AMD Radeon HD 7700 GPU。我想使用下面的内核来验证波前大小是 64。
__kernel
void kernel__test_warpsize(
__global T* dataSet,
uint size
)
{
size_t idx = get_global_id(0);
T value = dataSet[idx];
if (idx<size-1)
dataSet[idx+1] = value;
}
在主程序中,我传递了一个包含 128 个元素的数组。初始值为 dataSet[i]=i。在内核之后,我期望以下值: dataSet[0]=0 dataSet[1]=0 dataSet[2]=1 ... dataSet[63]=62 dataSet[64]=63 dataSet[65]=63 dataSet [66]=65 ...数据集[127]=126
但是,我发现 dataSet[65] 是 64,而不是 63,这与我的预期不同。
我的理解是第一个波前(64 个线程)应该将 dataSet[64] 更改为 63。所以当执行第二个波前时,线程 #64 应该得到 63 并将其写入 dataSet[65]。但我看到 dataSet[65] 仍然是 64。为什么?