繁体   English   中英

OpenCL 内核性能很差。 为什么我的代码没有 OpenCL 会更好?

[英]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 内核性能很差。 (左轴:以毫秒为单位的执行时间,底轴:模拟蚂蚁的数量)http://abload.de/img/kernel0uu3z.png

你能给我建议吗?

如果您有兴趣,您可以在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM