【问题标题】:OpenCL Kernel performance is very bad. Why my code is better without OpenCL?OpenCL 内核性能很差。为什么我的代码没有 OpenCL 会更好?
【发布时间】:2014-05-22 22:13:32
【问题描述】:

我正在编写 Ant-Simulation。 内核性能非常糟糕。与标准 c++ 解决方案相比,它具有很大的性能劣势。

我不明白为什么。内核中的操作大多没有控制结构(如 if/else)。

内核:

https://github.com/Furtano/BA-Code-fuer-Mac/blob/master/BA/Ant.cl

https://github.com/Furtano/BA-Code-fuer-Mac/blob/master/BA/Pheromon.cl

我做了一个基准测试,OpenCL 内核性能很差。 (左轴:以毫秒为单位的执行时间,下轴:模拟蚂蚁的数量)

你能给我建议吗?

如果你有兴趣,你可以在 git repo 中找到漏洞代码(OpenCL 的东西在这里发生:https://github.com/Furtano/BA-Code-fuer-Mac/blob/master/BA/clInitFunctions.cpp)。

谢谢:)

【问题讨论】:

  • "内核中的操作大多没有控制结构(如 if/else)。我看到很多控制结构,例如iffor 等。据我了解,每个执行实例都必须执行相同的指令(例如 SIMD/SIMT)。这意味着如果一个实例在 for 循环中,但所有其他实例都采用了 if 的错误分支并且不在 for 循环中,则它们必须等待它,以便它们都可以留在同一条指令上。
  • 您确定选择的平台是您的 GPU 吗?也许在您的问题中添加一些控制台输出。
  • 是的,我想是这样(不确定)看这里:github.com/Furtano/BA-Code-fuer-Mac/blob/master/BA/…
  • @Furtano 在选择平台的代码中,您有一条注释说明“只需选择第一个可用平台”,它可能是也可能不是 GPU。您的代码是否向控制台输出任何内容?
  • @AnthonyVallée-Dubois 没有输出

标签: c++ performance kernel opencl simulation


【解决方案1】:

你有很多 if/else,你不能用不同的方式写吗? 不要遵循 if/else 路径,因为您永远无法到达任何地方。 你需要让 GPU 只执行有用的指令。不是数以百万计的 if/else。

最好只跟踪并执行网格中的蚂蚁。你最好跟踪它们并移动它们。存储了他们的坐标。 您显然还需要一张带有蚂蚁位置和状态的地图,因此您需要一个多内核系统。

此外,您会丢失一些无用的内存传输,从使用 int 变量进行单个布尔存储开始。这会导致 90% 的无用传输成为 GPU 瓶颈。

【讨论】:

    【解决方案2】:

    您的 OpenCL 内核有 ifs。当前的 GPU 不应该这样做。 AFAIK AMD GPU 有 n 组 64 个内核,它们具有相同的指令指针(它们正在执行完全相同的语句的完全相同的部分)。 Ifs是通过停止一些核心,执行真分支,停止其他核心并执行假分支来实现的。想象一下嵌套 if 或循环。

    【讨论】:

    • 所以我从一个内核中删除了 ifs,只执行了这个内核。性能仍然很差(没有收获:()。
    • 循环也很慢
    • 我在内核 1 中没有循环和 ifs。没有性能提升(更改版本不在 github 上)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2012-09-01
    • 2014-05-13
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多