最佳全局工作大小(OpenCL)是多少?

最佳全局工作大小(OpenCL)是多少?,opencl,gpu,Opencl,Gpu,我在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

我在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];

有人能给我解释一下吗,谢谢。

因为您正在访问整数大小的数据,在1D情况下,附近的线程将访问相同的缓存线。因此,当它们错过缓存时,一大堆线程将在同一行上等待被带到缓存中。 但是在2d情况下,如果您的图形设备沿着y大调方向执行线程调度,您将分散访问。因此,您有更多的并行缓存填充正在进行,当您环绕y轴时,缓存线已经加载-因此它们不再停止


您可以通过翻转数组索引来验证这一点。此外,如果您将数组大小增加到无论平铺如何都无法放入缓存中,那么所使用的维度之间应该没有任何差异。

乍一看,它看起来像是指令级并行的基本形式,请尝试阅读,或者,尽管他们在谈论CUDA,但OpenCL在编译后基本相同。这也可能仅仅是1D和2D内核实现不同占用率的结果。您测试的工作组大小和全局大小是多少?x,y,z的类型是什么?我假设int?可能是真的。非常感谢你!