【问题标题】:Why is there such a huge performance difference between different kernel execution patterns in OpenCL?为什么 OpenCL 中不同的内核执行模式之间存在如此巨大的性能差异?
【发布时间】:2015-11-02 02:32:41
【问题描述】:

我的实现执行 3 个 OpenCL 内核:

KernelA()、KernelB() 和 KernelC()

它们都对相同的数据进行操作,内核 C 依赖于由 A 和 B 生成的数据。

对于评估,我先执行 A 和 B,然后对相同的输入数据执行 Kernel C 多次。

我注意到: 当我重复执行 C 时,它非常快。 在相同的数据上,它的速度快了 3 倍。 (15 毫秒对 45 毫秒)

这很有趣,因为我无法解释这种行为。 没有 RAM-GPU 内存传输或任何东西。 仅使用全局、常量和私有内存。 数据非常大:全局工作组大小为 640x480,本地工作组大小为 32x2(暴力评估的最佳结果)。

我的 GPU 是 Nvidia Quadro NVS 4200 和 Qualcom Adreno 430。

由于数据缓存,我无法解释这一点,因为有大量工作组在不同的数据上执行。我也在每次计算后执行 cl_flush() 。 那么为什么会有如此巨大的性能差异呢?

【问题讨论】:

  • I can't explain this because of data caching 为什么不呢?如果你重复执行 C,你显然会比 A->B->C 更少的缓存未命中。请澄清你的问题。此外,32x2 的工作组大小在桌面 GPU 上可能不是最理想的。
  • 工作组大小是性能最好的一个,通过暴力破解所有可能的配置来确定。我排除了内存缓存,因为工作组每次计算都会使用不同的数据执行数千次。

标签: performance caching opencl gpu gpgpu


【解决方案1】:

clFlush() 强制命令转到 GPU,但不会等到它们完成。 在运行内核 C 之前,您应该调用 clFinish(),以确保所有命令都已完成。

否则,内核 C 正在等待 GPU 完成内核 A 和 B 的执行。

【讨论】:

  • 谢谢。我刚刚查看了我的代码,我正在使用 clFinish()。我在发布问题时混淆了这些命令。
猜你喜欢
  • 2011-12-03
  • 2021-10-27
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 2012-10-18
相关资源
最近更新 更多