《Learning CUDA Programming》讀書筆記(三)

CUDA occupancy:

一般等於:Active Thread Blocks per Multiprocessor / Max Threads per Multiprocessor;分子是用戶kernel和GPU硬件條件共同決定的,分母完全由GPU硬件條件決定;

這個occupancy越高(越接近100%),則GPU的SM上駐留的(叫做active)threads就越多,(實際同時運行的threads數目取決於SM的core數目,遠小於active threads), 就越有可能把更多的IO給hide起來;(也不一定,如果這個kernel的threads不怎麼IO,則這個率低些也不影響計算單元忙碌程度;如果死勁訪存IO,這個率100%也照樣有處理器空閒發生,即所有線程都在訪存中)

CUDA提供了一個Excel表(CUDA Occupancy Calculator),只要填入當前GPU硬件型號和kernel thread所用的寄存器、block用的shared memory(這兩者可以從nvcc的輸出裏得到)、block的threads個數,表格自動給出occupancy等信息;

佔用率一般受三個條件的限制:
1.SM最大併發thread數,SM最大併發Warp數,SM最大併發block數
2.shared memory資源限制
3.register資源限制

函數頭__launch_bound__和編譯選項--maxrregcount,可以影響編譯器優化寄存器的使用,以達到儘量高的執行效率(優化得太猛也容易導致register退化到顯存,手動tune的難度較高)

Profiler裏顯示的Achieved Occupancy,纔是運行時候的真實值;

Reduce操作的GPU並行:

1. Global Memory版本:加和多輪,每輪起一次kernel,只用顯存;沒法只用一個kernel內嵌循環的原因是無法在kernel內部對grid進行同步;

2. Shared Memory版本:每輪每個block先把自己這段讀進自己block的shared-memory,sync, 然後循環加和,循環內部有sync,最後把自己block得到的結果寫到顯存數組[blockIdx]位置處;下一輪的block數目由待加和的數組長度決定;

3. 把取餘%操作換成位運算,有一定速度提升;

(4. 博客裏看到過的,用原子操作來把block結果加和到顯存變量上,可以一個kernel就結束了,不需要多輪)

優化過程中,nvprof起到指導性作用!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章