【问题标题】:what is the optimal global work size (OpenCL)?什么是最佳全局工作大小(OpenCL)?
【发布时间】:2015-08-07 02:25:03
【问题描述】:

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

谁能帮我解释一下,谢谢。

【问题讨论】:

  • 乍一看,它看起来像是指令级并行的基本形式,请尝试阅读thisthis,虽然他们在谈论CUDA,但OpenCL 在编译后几乎相同。这也可能只是您的 1D 和 2D 内核达到不同占用率的结果。
  • 您测试的工作组规模和全球规模是多少? x、y 和 z 的类型是什么——我假设是 int?

标签: opencl gpu


【解决方案1】:

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

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

【讨论】:

  • 这可能是真的。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多