CUDA分支優化

2021-07-23 03:28:09 字數 1126 閱讀 9607

標籤: 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,效能相比第一種方式有...