我在我的程序中遇到了 CUDA 的性能问题。同一任务(对齐 3D 点云)所花费的时间并不稳定,有时可能会高出 30 倍。
我使用 Qt 作为主界面,它使用我的工作类初始化一个线程。此类的目的是在我的数据上启动 cuda 计算并发送 Qt 信号,这些信号将由 GUI 捕获以更新 OpenGl 小部件的显示。
我通过在我的 OpenGL 小部件中删除 QBasicTimer 解决了我的性能问题,它是这样使用的:
void SWGLCloudWidget::initializeGL()
{
// ...
m_oTimer->start(5, this);
}
根本没用,但我重构后忘了删除它。 在 Qt 文档中它说:
The QBasicTimer class provides timer events for objects.
This is a fast, lightweight, and low-level class used by Qt internally. We recommend using the higher-level QTimer class rather than this class if you want to use timers in your >applications. Note that this timer is a repeating timer that will send subsequent timer events >unless the stop() function is called.
出于好奇,我想知道这个低级调用如何导致 CUDA 如此困惑。
最佳答案
我的解读方式:
如文档中所述 update()\updateGL()
does not cause an immediate repaint; instead it schedules a paint event for processing when Qt returns to the main event loop. This permits Qt to optimize for more speed and less flicker than a call to repaint() does.
如果由于某种原因(其他线程、监视器刷新率限制、计算新图像所花费的时间、其他信号和插槽等...)屏幕只能每 X
毫秒刷新一次,并且您请求 Y > X
的刷新率,然后 Qt 将继续排队绘制事件,从而损害其他事件。因此,正如您观察到的那样,系统的响应速度会更低。
这是网络系统中发生的拥塞问题,其中吞吐量
(平均成功率)越来越低于请求率。
关于c++ - QBasicTimer 干扰 cuda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20611221/