2013-06-25 33 views
0

我想用DirectX 11的計算着色器來做一些簡單但昂貴的計算(想想Mandelbrot Set)。計算結果放置在紋理上並且不重疊。這不是實時的,因爲它預計需要1到10秒,但它會在完成後立即顯示在UI上。使用着色器進行長時間計算而不會造成延遲

我使用WPF和SharpDX通過http://directx4wpf.codeplex.com/。該庫有一個DX11視圖對象,其中包含一個RenderScene函數,其中調用了DX渲染函數(包括計算機着色器),並且在主線程中運行,並且據我的理解,它會盡可能經常調用(將嘗試最大化FPS )。顯然,堅持電腦着色器是沒有選擇的,因爲它會阻塞主線程以及其餘的用戶界面,甚至是其他操作系統,如果它也使用GPU。

問題是,我應該如何執行這些計算,而不會在應用程序的其他部分的UI中造成任何滯後?

如果這純粹是在CPU上運行,我只會運行一個單獨的線程。然而,隨着我對GPU的初步瞭解,我目前的印象是GPU在調度/上下文切換方面不太靈活。因此,即使我在另一個線程上運行計算(在DX11中使用延遲渲染),計算仍然會阻止GPU直到完成。 這是正確的嗎?

我試圖將計算着色器的工作分成更小的塊(大約8000個線程)。這是可行的,沒有底層幾何,我可以每次調用計算着色器時添加一個偏移量。這實際上並不奏效,因爲有大量開銷。實際上,將工作分成N塊(通過連續調用N次計算着色器)似乎會導致線性減慢N倍。我不確定這是否是因爲上面鏈接的WPF庫,SharpDX ,或者僅僅是使用GPU的一個不可避免的事實。

任何人都有如何在這種情況下繼續下去的建議,可能是做了類似的示例項目,或者可能是很好的資源來閱讀?我是否做出任何錯誤的假設?

回答

0

執行10秒鐘操作會阻止您的GPU是正確的。根據我的經驗,當您的計算花費很長時間時,尤其是當您嘗試混合使用UI和DirectX內容時,您可能會從GPU驅動程序中獲得瘋狂的行爲/崩潰。我建議你繼續把計算分解成更小的線程數並尋找其他途徑來優化你的計算,甚至重構你的代碼。