標籤: cuda
分支優化
warpsm
2015-07-16 10:24
293人閱讀收藏
舉報
cuda(26)
在cuda中,分支會極大的減弱效能,因為sm沒有分支**,因此只能讓束內線程在每個分支上都執行一遍,當然如果某個分支沒有執行緒執行,就可以忽略,因此要減少分支的數目。可以簡單的說:
1. 同乙個warp中的所有執行緒執行相同的命令。
2. 並不是所有執行緒都會執行。
產生分支的乙個常見場景就是if,else
語句的使用,比如常用的邊界判定。下面從乙個實力說起。看如下**:
int tid = threadidx.x;
if(tid == 0)
var = var + 1;
else
var = var + 2;
var = 3 * var;
上述**在乙個warp中執行的情況如下圖所示:
第一行所有執行緒執行int tid = threadidx.x;
。
所以第二行if(tid == 0) var = var + 1
判斷,由於只有執行緒0執行var = var + 1;
第三行是執行緒0到執行緒31執行else var = var + 2;
第四行所有執行緒執行var = 3 * var;
上述**有兩個方面的缺陷:
1. cuda執行緒執行if,else
語句的效率非常低。
2. 由於判斷產生了分支,導致第二行和第三行是序列執行的。
解決方法:
1. 通過查詢表去掉分支
2. 通過計算去掉分支,例如:上述**可以轉換為:var = 3*(var+1+(var>0))
因此,我們在程式設計的時候要盡量是warp塊完美對齊,也就是說乙個warp裡都滿足條件或者都不滿足條件,如果實在無法對齊,也就是說產生分支的時候,可以用上述的方法解決分支問題。
CUDA 學習優化思路
參考 cpu中memory l3 cache傳輸頻寬為20gb s,除以64bytes line得到傳輸記錄速度約300m line s,約為300m 8 2.4g double s.一般地,浮點數操作需要兩個輸入 1個輸出,那麼loading 3個數 3 lines 的代價為 100mflops。...
cuda程式設計 效能優化
做了幾個月的gpu的效能優化,一直沒來得及總結,先把大概要點總結一下,後面有空進行進一步完善。tesla v100 cuda 9.0 linux c 資料格式要進行設計,把每個部分精簡至最小,減少對gpu視訊記憶體的占用,同時縮小資料的比對時間。從記憶體load到快取,減少load的時間消耗,可採用...
CUDA學習3 優化部分
基本概念 記憶體延遲掩藏 這裡我們假設乙個warp中線程數為2 實際不一定,如tesla為32個 有兩種規約的方式,左邊這種是採取鄰接的配對方式,右邊這種採用的是交錯的配對方式。從圖中我們可以看出,如果採用右邊這種配對方式,那麼在第一次配對完成之後我們就可以釋放出一半的warp,效能相比第一種方式有...