我在stackoverflow中发现了一些关于这个问题的问题。但我仍然想问,以防专家在这个问题上找到新的理论和解释。
我测试并发现对于基本的1D内核:
// global size = {1024*1024, 1, 1}
// local size = {32, 1, 1}
// x, y, z are float
int i = get_global_id(0);
x[i] = y[i] + z[i];
将比2D内核慢得多:
int i = get_global_id(0);
int j = get_global_id(1);
int index = i + j * width;
x[index] = y[index] + z[index];
任何人都可以帮我解释一下,谢谢。
答案 0 :(得分:2)
因为您正在访问int大小的数据,所以在1D情况下,附近的线程将访问相同的缓存行。因此,当他们错过缓存时,一大堆线程将在同一行上等待进入缓存。 但是在第二种情况下,如果你的图形设备正在走线,那么线程将在y-main方向上调度,你将扩展访问范围。所以你有更多的并行缓存填充,当你绕过y轴时,缓存行已经加载 - 所以它们不再停止。
您可以通过翻转数组索引来验证这一点。此外,如果您将数组大小增加到无论是否平铺都无法容纳在缓存中,那么您使用的维度之间应该没有任何差异。