我正在用简单的想法写Qt应用程序:有几个支持OpenCL的设备,每个设备都有自己的控制线程来准备数据,执行OpenCL内核和处理结果。 OpenCL代码实际上是比特币挖掘内核(现在是这个 ,但没关系)。
使用2个GPU时,一切正常。 当我使用GPU和CPU时出现问题。 CPU工作在合理的速度,但GPU放缓到零性能。
Linux下没有这样的问题。 在Windows下,poclbm的行为方式相同:启动多个实例(GPU为1,CPU为1)时,GPU性能为0。
我不知道应该发布哪一部分代码,所以这将是有帮助的。 我只能提到,这个线程是一个QThread
的run()
while( !_stop ) { mineBitcoins(); }
了一个忙碌循环的孩子while( !_stop ) { mineBitcoins(); }
while( !_stop ) { mineBitcoins(); }
。 这个循环的逻辑几乎是从poclbm的BitcoinMiner::mining_thread
( 这里 )复制的。
我应该挖掘哪个方向? 谢谢。
upd:我正在使用QtOpenCL和AMD APP SDK 。
如果在CPU上充分利用所有内核的情况下运行内核,则处理其他设备的线程可能无法跟上GPU,从而限制性能。
尝试减少CPU上运行内核的线程数量,例如,如果程序在带有超线程的四核上运行,请将线程数限制为7。
不要使用主机设备作为opencl设备。 如果您确实也有,则通过创建子设备来限制为CL分配的计算单元(用作主机的CPU)的数量。
我不知道你是否在同一个上下文中使用这两个设备。 但是如果是这样的话,上下文中的内存一致性可能是您的问题,以及不同的OpenCL实现如何处理它。
OpenCL尝试维护更新的内存(至少在Windows中)的内存,并且可以使GPU连续地将所使用的内存复制回“CPU侧”。
我尝试了很久以前,结果就像在你的情况下“在GPU中〜= 0的性能”。