【发布时间】:2013-11-21 04:46:00
【问题描述】:
我正在使用 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。在内核之后,我期望以下值: 数据集[0]=0 数据集[1]=0 数据集[2]=1 ... 数据集[63]=62 数据集[64]=63 数据集[65]=63 数据集[66]=65 ... 数据集[127]=126
但是,我发现dataSet[65]是64,而不是63,这和我的预期不太一样。
我的理解是第一个波前(64个线程)应该将dataSet[64]改为63。所以当第二个波前执行时,线程#64应该得到63并将其写入dataSet[65]。但是我看到 dataSet[65] 还是 64。为什么?
【问题讨论】:
-
您不应该尝试验证经线或波前尺寸。如果您编写的代码测试经线大小为 32 和 64,那么当您使用的设备的经线大小为 8、16 或 48 时会发生什么?如果 Nvidia 或 AMD 改变它们的经线/波前尺寸会发生什么。如果您试图找到最佳的工作组规模,那么最好的解决方案是编写一个迷你基准测试来测试所有合理的配置(或至少一个足够的子集)。
标签: opencl