c++ - QBasicTimer 干扰 cuda

标签 c++ qt opengl cuda

我在我的程序中遇到了 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/

相关文章:

c++ - 如何让 QNetworkReply 返回自定义数据?

c++ - 如何正确读取触摸事件并在QWidget Qt上获得位置

c++ - findChild 没有找到刚刚添加到 QMenuBar 的菜单

c++ - OpenGL 新纹理在删除后替换旧纹理

c++ - 访问 STL 容器时如何让 Vim 识别对象类型,以便自动完成

c++ - 优化 volatile 堆栈变量的存储/构造是否合法?

C++——一个关于内存管理的问题

c++ - 使用 C++ 设置 OpenALPR, undefined reference 。

c - 为 SDL 1.2 创建当前 OpenGL 上下文

c++ - 谢尔宾斯基垫片