【问题标题】:QBasicTimer interference with cudaQBasicTimer 对 cuda 的干扰
【发布时间】:2014-01-03 20:40:35
【问题描述】:

我在我的程序中遇到了 CUDA 的性能问题。同一任务(对齐 3D 点云)所花费的时间并不稳定,有时可能会高出 30 倍。

我使用 Qt 作为主界面,它用我的工作类初始化一个线程。此类的目的是在我的数据上启动 cuda 计算并发送 Qt 信号,这些信号将被 GUI 捕获以更新 OpenGL 小部件的显示。

我通过在我的 OpenGL 小部件中删除 QBasicTimer 解决了我的性能问题,它的使用方式如下:

void SWGLCloudWidget::initializeGL()
{
    // ...
    m_oTimer->start(5, this);
}

它根本没有用,但我在重构后忘记删除它。 在 Qt 文档中它说:

QBasicTimer 类为对象提供定时器事件。

这是 Qt 内部使用的快速、轻量级和低级的类。如果您想在应用程序中使用计时器,我们建议使用更高级别的 QTimer 类而不是此类。请注意,此计时器是一个重复计时器,它将发送后续计时器事件>除非调用了 stop() 函数。

出于好奇,我想知道这个低级调用如何导致 CUDA 如此混乱。

【问题讨论】:

  • 你超载了void QObject::timerEvent ( QTimerEvent * event )吗?
  • 是的,它只包含一个 updateGl 调用。所以我猜刷新率是为了让 cuda 拥有 GPU 的所有权?
  • 我对定时器的其他值进行了一些测试,在 20 毫秒以下 cuda 开始不稳定。所以 gl 刷新率是问题所在,谢谢!
  • np,你正在做大部分工作。它是哪个版本的 Qt?如果你保持 5 毫秒但调用 update() 会发生什么??
  • 我有 4.8 使用 QGLWidget 的遗产。它做同样的事情,更新似乎以相同的刷新率调用 updateGL

标签: c++ qt opengl cuda


【解决方案1】:

我的解读方式:

如文档update()\updateGL()中所述

不会导致立即重绘;相反,它会安排油漆 当 Qt 返回主事件循环时处理的事件。这 允许 Qt 比调用 repaint() 会。

如果由于某种原因(其他线程、监视器刷新率限制、计算新图像所花费的时间、其他信号和插槽等),屏幕只能每X 毫秒刷新一次,并且您要求刷新率Y > X,那么 Qt 将继续排队绘制事件以损害其他事件。因此,如您所见,系统的响应速度会更慢。

这是一个拥塞问题,因为它发生在网络系统中,throughput(平均成功速率)越来越低于请求的速率。

【讨论】:

  • 如果您有 Nvidia 驱动程序并运行 linux,请尝试启用\禁用驱动程序。奇迹可能会发生:)。
  • 我在 Windows 7 中使用 cl 太糟糕了:p
猜你喜欢
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 2015-02-09
  • 2012-07-17
  • 2019-06-17
  • 2015-02-12
  • 2011-04-02
相关资源
最近更新 更多