2013-12-16 46 views
2

我在程序中遇到了與CUDA有關的性能問題。相同任務(對齊3D點雲)所花費的時間並不穩定,有時可能高出30倍。QBasicTimer干擾cuda

我使用Qt作爲主界面,它用我的工人類初始化一個線程。這個類的目的是對我的數據啓動cuda計算併發送Qt信號,這些信號將被GUI捕獲以更新OpenGl小部件的顯示。

我已經在我的OpenGL窗口小部件卸下QBasicTimer解決了我的表演問題,它被用來像這樣:

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

它沒有用都沒有,但我忘了一些重構之後將其刪除。 在Qt文檔中,它說:

QBasicTimer類爲對象提供計時器事件。

這是一個Qt內部使用的快速,輕量級和低級別的類。如果你想在你的應用程序中使用定時器,我們推薦使用更高級的QTimer類而不是這個類。請注意,該定時器是一個重複定時器,它將發送後續定時器事件>除非調用stop()函數。

我想知道這個低級調用如何導致CUDA如此混亂,僅僅是爲了我的好奇心。

+0

你重載'void QObject :: timerEvent(QTimerEvent * event)'? – UmNyobe

+0

是的,它只包含一個updateGl調用。所以我想刷新率是爲了讓cuda獲得GPU的所有權? – Ulpaso

+0

我用定時器的其他值做了一些測試,在20ms以下,cuda開始變得不穩定。所以gl刷新率是問題,謝謝! – Ulpaso

回答

0

的方式我解釋:

如文檔中描述的update()\updateGL()

不會導致立即重繪;相反,當Qt返回到主事件循環時,它會安排一個油漆 事件進行處理。這個 允許Qt優化以獲得更多的速度和更少的閃爍,比repaint()所做的調用 。

如果由於某種原因(其它線程,顯示器的刷新率的限制,花費的時間計算新的圖像,其它信號和槽等)的屏幕可以刷新只有每X毫秒,你問一個刷新速率爲Y > X,那麼Qt將保持隊列繪畫事件不利於其他事件。因此,如您所觀察的那樣,系統的響應速度會更慢。

這是擁塞的問題,因爲它的網絡系統,其中throughput(平均成功率)高於請求的速率越來越低的情況發生。

+0

它是有道理的,謝謝你的時間! – Ulpaso

+0

如果您有Nvidia驅動程序並運行linux,請嘗試啓用\ disabled的驅動程序。奇蹟可能會發生:)。 – UmNyobe

+0

太糟糕了,我使用Windows與Windows七:第 – Ulpaso