c++ - Windows 多任务破坏了 OpenCL 性能

标签 c++ windows multithreading qt opencl

我正在用简单的想法编写 Qt 应用程序:有几个支持 OpenCL 的设备,每个设备都有自己的控制线程,用于准备数据、执行 OpenCL 内核和处理结果。 OpenCL 代码实际上是比特币挖掘内核(目前是 this one ,但这并不重要)。

使用 2 个 GPU 时一切正常。 当我使用 GPU 和 CPU 时出现问题。 CPU 以合理的速度运行,但 GPU 性能减慢至零。

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

我不确定应该发布哪部分代码,所以这会很有帮助。我只能提一下,该线程是 QThread 的子线程,其中 run() 是用繁忙循环 while( !_stop ) { mineBitcoins(); 重新实现的。 }。该循环的逻辑几乎是从 poclbm 的 BitcoinMiner::mining_thread ( here ) 复制的。

我应该朝哪个方向挖掘?谢谢。

更新: 我正在使用QtOpenCLAMD APP SDK .

最佳答案

如果您在 CPU 上运行内核并充分利用所有内核,则处理其他设备的线程可能无法跟上 GPU 的速度,从而有效地限制性能。

尝试减少 CPU 上运行内核的线程数,例如如果您的程序在具有超线程的四核上运行,请将线程限制为 7。

关于c++ - Windows 多任务破坏了 OpenCL 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9519670/

相关文章:

c++ - 复制一些大于 dst 的内容时,memcpy() 是否安全?

windows - 如何在 Windows 上更改 SVN 中的帮助语言?

linux - 套接字传入连接不能将元素 push_back 并发到全局定义的 std::vector

Java 如何线程化 GUI

C++——为什么我可以为类 Month 返回一个 int

c++ - 使用 boost::property_tree::string_path 访问值

windows - 如何在 Windows 上访问 Node 中的 stdout.columns?

.net - 托管 System::Diagnostics::Debugger::Launch 函数的非托管/ native 替代方案?

java - 为什么 DefaultExecutor 创建 2 个线程来调用命令 "php file.php"

c++ - 转换指南