[英]OpenCL Kernel performance is very bad. Why my code is better without OpenCL?
我正在写一个蚂蚁模拟。 内核性能很差。 与标准的 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,你不能用不同的方式来写吗? 不要遵循 if/else 路径,因为您永远无法到达任何地方。 你需要让 GPU 只执行有用的指令。 不是数百万个 if/else。
最好只跟踪和执行网格中的蚂蚁。 你最好跟踪它们并移动它们。 已经存储了他们的坐标。 您显然还需要一张包含蚂蚁位置和状态的地图,因此您将需要一个多内核系统。
此外,从使用 int 变量进行单个布尔存储开始,您会丢失一些无用的内存传输。 这可能会导致 90% 的无用传输可能会成为 GPU 的瓶颈。
您的 OpenCL 内核具有 ifs。 当前的 GPU 不应该这样做。 AFAIK AMD GPU 有 n 组 64 个内核,它们具有相同的指令指针(它们正在执行完全相同语句的完全相同部分)。 Ifs 是通过停止一些内核、执行真分支、停止其他内核并执行假分支来实现的。 想象一下嵌套的 if 或循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.