我正在编写一个Ant模拟。 内核性能非常糟糕。与标准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内核性能非常糟糕。 (左轴:以ms为单位的执行时间,底轴:模拟蚂蚁的数量)
你能给我建议吗?
如果你感兴趣的话,你可以在git repo中找到漏洞代码(这里有OpenCL的东西:https://github.com/Furtano/BA-Code-fuer-Mac/blob/master/BA/clInitFunctions.cpp)。
谢谢:)
答案 0 :(得分:1)
您的OpenCL内核有ifs。当前的GPU不应该这样做。 AFAIK和AMD GPU有n组64个核心,它们具有相同的指令指针(它们执行完全相同的语句完全相同的部分)。 Ifs是通过停止某些内核,执行true分支,停止其他内核并执行false分支来实现的。想象一下嵌套的ifs或循环。
答案 1 :(得分:1)
你有很多if / else,你不能以不同的方式写它吗? 不要遵循if / else路径,因为你永远不会到达任何地方。 您需要让GPU只执行有用的指令。不是数以百万计的if / else。
最好只跟踪和执行网格中存在的蚂蚁。你最好跟踪它们并移动它们。存储了他们的坐标。 你显然也需要一个具有蚂蚁位置和状态的地图,所以你需要一个多核系统。
此外,从使用int变量进行单个布尔存储开始,您将失去无用的内存传输。这可能导致90%的非有用传输,这可能会阻碍GPU。