1.高效公式
最大化計算強度:math/memory ,即:數學計算量/每個執行緒的記憶體
2.合併全域性記憶體(按順序讀取的方式最好)
3.避免執行緒發散
執行緒發散:同乙個執行緒塊中的執行緒執行不同內容的**
(1)kernel中做條件判斷
(2)迴圈長度不一
(1)檢視本機引數
注:kernel的載入中,自定義的執行緒數、執行緒塊的數量等都不要超過系統本身的設定
(2)kernel載入1d、2d、3d模式
(3)kernel函式的關鍵字
1.本地記憶體(變數)
2.全域性記憶體(變數)
3.共享記憶體(變數)
1.原子操作
(1)解決的問題
對於有很多執行緒需要同時讀取或寫入相同的記憶體時,保證同一時間只有乙個執行緒能進行操作
(2)特點
2.同步函式
(1)_syncthreads()
執行緒塊內線程同步;保證執行緒塊內所有執行緒都執行到統一位置。
(2)_threadfence()
乙個執行緒呼叫_threadfence後,該執行緒在該語句前對全域性儲存器或共享儲存器的訪問已經全部完成,執行結果對grid在的所有執行緒可見。
(3)_threadfence_bolck()
乙個執行緒呼叫_threadfence_block後,該執行緒在該語句前對全域性儲存器或共享儲存器的訪問已經全部完成,執行結果對block在的所有執行緒可見。
注:(2)(3)兩個函式的作用:及時通知其他執行緒,全域性記憶體或共享記憶體內的結果已經讀入或寫入完成了。
3.cpu/gpu同步 cudastreamsynchronize()/cudaeventsynchronize()
1.規約reduce
2.掃瞄scan
3.直方圖
4.壓縮與分配
(1)壓縮:在輸出中,對真值輸入分配1,對假值輸入分配0
壓縮的步驟:
(2)分配:輸出項數可以動態的從每乙個輸入項計算出
5.分段掃瞄
6.排序
(1)奇偶排序**排序、冒泡演算法)
通過比較陣列中相鄰的(奇-偶)位置數字對,如果該奇偶對是錯誤的順序(第乙個大於第二個),則交換。下一步重複該操作,針對所有的(奇-偶)位置數字對,如此交替進行下去。
(2)歸併排序
將兩個已經排序的序列合併成乙個序列的操作
(3)排序網
CUDA之thread訪問總結
問 對於結構體陣列 typedef struct float3 float3 d data id id為執行緒索引號,則對於乙個 wrap,為其中的每個執行緒讀取4位元組需要幾次訪存呢?為其中的每乙個執行緒讀取12位元組需要幾次訪存呢?答 如果只是為warp中的每個執行緒讀1個該結構體的例項的乙個分...
cuda矩陣相乘 CUDA的矩陣乘法
2 那麼下面就是不使用shared memory的並行化演算法的思路。簡單地來說,就是將上述可並行化的部分傳遞給gpu,使用cuda來計算。如下 void matrixmulondevice float m,float n,float p,intwidth int size width width ...
CUDA效能調優(一) 合併訪問 迴圈展開
1 合併訪問 當同乙個warp中的所有執行緒都執行同一條指令訪問全域性儲存器中連續的單元時,就獲得最有利的訪問模式。硬體檢測到同乙個warp中的這些執行緒訪問全域性儲存器中連續的儲存單元,並將這些單元結合成乙個合併的訪問。合併訪問可以提高dram的頻寬利用率,使dram在傳輸資料時的速度接近全域性儲...