Windows多任务处理打破了OpenCL的性能

我正在用简单的想法写Qt应用程序:有几个支持OpenCL的设备,每个设备都有自己的控制线程来准备数据,执行OpenCL内核和处理结果。 OpenCL代码实际上是比特币挖掘内核(现在是这个 ,但没关系)。

使用2个GPU时,一切正常。 当我使用GPU和CPU时出现问题。 CPU工作在合理的速度,但GPU放缓到零性能。

Linux下没有这样的问题。 在Windows下,poclbm的行为方式相同:启动多个实例(GPU为1,CPU为1)时,GPU性能为0。

我不知道应该发布哪一部分代码,所以这将是有帮助的。 我只能提到,这个线程是一个QThreadrun() 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的性能”。