2013-09-30 49 views
6

我一直認爲分支分歧只是由分支代碼引起的,比如「if」,「else」,「for」,「switch」等。但是我最近讀過一篇論文,其中說:在CUDA中,非合併內存訪問是否會導致分支分歧?

可以清楚地觀察到由線程中的每個第一次探索基於算法採取的不同分支的數量至少比全勘探戰略兩次更重要。這通常是由額外的非合併訪問的結果全局存儲器。因此,這樣的螺紋發散導致許多存儲器訪問必須被序列化,增加的執行的指令的總數量。

可以觀察到經序列化的使用未合併訪問的版本號是乘七十六歲之間比其對手更重要。事實上,造成未合併的一個線程訪問的分歧導致許多存儲器訪問必須被序列化,以增加執行的指令。

看起來,據筆者,未合併的訪問可能會導致不同的分支。是真的嗎? 我的問題是,有多少原因究竟是那裏的分公司分歧?提前 感謝。

+1

您能鏈接到原始參考? – talonmies

+1

+1我真的很想知道內存訪問策略如何爲分歧分支負責。請添加參考。 –

+1

本論文應爲參考。 2個paragraghes分別來自p80和p107。 http://mistic.heig-vd.ch/luong/thesis.pdf – kangshiyin

回答

3

我認爲作者是在概念和/或術語不清楚。

差異化和系列化的兩個概念是密切相關的。三岔口導致系列化,如線程在經發散組必須連續執行但序列化不會引起分歧,因爲分歧參考特別針對運行不同代碼路徑的warp中的線程。

導致序列化(而不是發散),其他的事情都是銀行的衝突和原子操作。

+1

沒有分支分歧的序列化的另一個例子是對__constant__內存的非均勻訪問。 – njuffa

+0

感謝您清理這兩個概念。因此,算法/代碼的非合併內存訪問模式與分支分支完全無關,更具體地說,與NVIDIA Profiler的「分支效率」結果無關。 – Ben

+0

@Ben:那是對的。在CUDA探查文檔說:'分支效率=({分行} - {發散分行})/ {分行}'和'發散分行=該被跨越warp'和'分行不同評估分支=分支指令executed'。換句話說,「分支效率」特別涉及經線中的分支指令,並計算它們分歧的情況(一些被採取,一些不被採用)。 –

相關問題