2012-10-25 64 views
1

我正在使用DirectCompute在GPU上執行通用計算。目前,我試圖在分辨率爲1920x1080的紋理上進行操作。我有一個Dispatch(2,1080,1)和numthreads(960,1,1),它們根據我的計算完全覆蓋每像素一個線程的圖像。GPU上的線程

現在,據我所知,所有的線程應該同時運行,對吧?但是,在我的代碼中,如果像素是黑色的,我不做任何計算。所以我注意到當我的大部分圖像是黑色時,性能都有了明顯的提高。但是,如果一個對象阻塞了屏幕,則性能會急劇下降。

我的問題是:如果所有線程並行運行,處理幀的速度將由最差的執行線程決定,實質上黑色像素上運行的線程將空閒,對不對?那麼爲什麼我會在處理更多像素時看到速度變慢呢?他們應該同時這樣做。或者我有這個錯誤?

任何幫助,將不勝感激。

回答

2

並非所有線程都同時執行。確切的數字可能已經發生了一些變化,但幾年前,高端CPU一次能夠保持16k個線程在運行,但是「僅」幾百個線程實際上是同時執行的。 (然後再細分爲更小的子組,並且這樣的子組中的每個線程以確切的鎖步,按指令的指令,按分支的分支運行)其餘的被暫停,等待I/O或以其他方式被阻塞。

因此,如果你有一個算法需要200萬次執行,那麼只有一小部分將隨時以線程形式存在,其中只有一小部分實際上是在單個批處理中執行的。在當前正在執行的線程中,有些線程被迫以確切的鎖步運行(所以不存在其中一個線程早退,整個組必須遵循相同的路徑),但不同的組可以在不同的時間終止。

是的,線程在GPU上很複雜。

+0

我想這解釋了很多我想知道的。感謝您的回答。我將不得不對互聯網上的GPU線程做更多的研究。 – l3utterfly

0

如果你有一個非常沉重的算法,並且正在使用你的圖像進行緩衝渲染,它可能會造成失速。強迫後緩衝器等待圖像。嘗試將其渲染到下一幀。所以你是「背後」。

算法看起來像怎麼樣?

+0

嗯,我正在做雙緩衝,所以我總是顯示一個圖像,並在同一時間做下一個計算。但是,我認爲問題在於我的算法太慢。但是賈爾夫所說的非常有啓發性。我的算法?我正在探索實時光線跟蹤領域,並且剛剛編寫了一個蠻力算法來測試我的GPU的功能。很明顯,需要大量的選擇。 – l3utterfly