cuda優化-展開循環

最近看到了一些循環展開優化程序性能的知識,總結一下。循環展開,即 #pragma unroll N(N爲要展開的數值)。一般來說,循環展開主要是爲了減少CUDA運行的分支衝突,由於GPU中SM架構的特殊性以及WARP(Half-warp)執行的嚴格並行性,使得循環語句有着交的的分支衝突,通過循環展開,可以有效的降價分支衝突。如:

就是完全循環展開後的形式,但是也可以不完全循環展開,只展開循環體中的一部分。這樣也可以有效的提高性能。

但是循環展開會使得寄存器的使用增加,因爲編譯時已知使用常量索引(意味着要完全循環展開嗎)的數組通常位於寄存器中,但是如果使用變量索引,則不能位於寄存器中。需要循環展開才能在寄存器存儲器(不是較慢的全局存儲器)中保存數組元素。但是,展開循環可能使寄存器的使用量大大上升,這將導致在局部內存中保存變量——抵消了循環展開的諸多好處。可以使用nvcc選項“—maxrregcount=value”告訴編譯器使用更多寄存器(注意:可以指定的最大寄存器數量爲128)。這需要在“使用更多的寄存器”和“創建更少的線程”之間權衡利弊,有可能會妨礙隱藏存儲器延遲。在某些架構中,使用該選項可能造成資源不足,從而導致內核無法啓動。因此可以說,要慎重使用循環展開!

發佈了48 篇原創文章 · 獲贊 81 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章