如果每個塊中的線程數量已經大於CUDA內核的數量,那麼可以在每次啓動塊時同時啓動塊的網格,是否有任何性能優勢?CUDA並行塊的最優數量
回答
我覺得有;一個線程塊被分配給一個流處理多處理器(SM),並且SM進一步將每個塊的線程劃分爲32個線程(較新的體系結構可以處理較大的線程),這些線程被調度爲按順序執行(更多)。考慮到這一點,將每個計算分解成塊以便它們佔用儘可能多的SM將會更快。這也意味着完全構建塊是卡支持的每個變形的線程的多個線程(對於SM使用32線程變形的情況,該塊爲32或64個線程而不是40個線程)。
啓動延遲
啓動延遲(API調用工作開始在GPU)是一格的是Linux 3-8微秒在Windows Vista/Win7的 30-80微秒。
將功能塊分配給SM的時間爲10-100s ns。
在一個塊(32個線程)中啓動一個warp是幾個週期,並且在每個SM上並行發生。
資源限制
併發內核 - 特斯拉N/A僅1個格在一個時間 - 費米在時間 16個光柵 - 開普勒16網格(Kepler2 32個網格)
最大塊(不考慮佔用限制) -Tesla SmCount * 8(gtx280 = 30 * 8 = 240) -費米SmCount * 16(gf100 = 16 * 16 = 256) -開普勒SmCount * 16(gk104 = 8 * 16 = 128 )
參見限制佔用率計算器,每塊的線程,每個線程SM,SM每個寄存器,每個線程寄存器,...
扭曲調度和CUDA核心
CUDA核心的浮點/ ALU單位。每個SM都有其他類型的執行單元,包括加載/存儲,特殊功能,分支等。CUDA內核相當於x86處理器中的SIMD單元。它不等同於x86內核。
佔用率是每個SM對每個SM的最大翹曲數量的測量。每根SM的彎曲越多,彎曲調度程序具有合格彎曲的機會就越高。但是,佔用率越高,每個線程可用的資源就越少。作爲一個基本目標要指定的地區超過
25%,8特斯拉 扭曲50%或費米 24個經線50%或開普勒(通常更高)
你會發現有32根經線在這些計算中與CUDA核心沒有真正的關係。
爲了更好地理解這一點,請閱讀Fermi白皮書,如果您可以使用Nsight Visual Studio Edition CUDA Profiler查看問題效率實驗(尚未在CUDA Profiler或Visual Profiler中提供)以瞭解您的內核如何隱藏執行和內存延遲。
- 1. CUDA塊並行性
- 2. CUDA最大數量管理
- 3. 每個網格的最大塊數:CUDA
- 4. CUDA:網格中的最大塊數!= CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X?
- 5. CUDA並行化
- 6. Cuda並行執行
- 7. 並行的CUDA 5和CUDA 4.2
- 8. 併發CUDA內核執行的優先級
- 9. CUDA併發執行
- 10. 並行CUDA編程
- 11. CUDA並行線程
- 12. 如何以最快速度將256字節的數據塊從一個CUDA塊傳輸到另一個CUDA塊?
- 13. CUDA內核的並行性
- 14. 運行並行CUDA任務
- 15. 在CUDA代碼中查找最佳塊數和線程數
- 16. CUDA優化問題
- 17. cuda - 內核優化
- 18. Cuda優化技術
- 19. 優化CUDA插值
- 20. 用cuda優化rc4
- 21. 優化Cuda內核時間執行
- 22. CUDA中可能的最大塊數是多少?
- 23. 在GPU上優化塊數到最大駐留塊數
- 24. 在CUDA中跨塊合併訪問?
- 25. 如何跟蹤執行的CUDA塊?
- 26. cuda:線程塊之間共享'常量'
- 27. 在CUDA中並行搜索
- 28. CUDA和並行搜索
- 29. 定時並行CUDA內核
- 30. CUDA塊同步
即使對於Kepler GPU,Warp大小仍然是32個線程。 – Eugene 2012-08-08 17:13:13
另請注意,SM上同時運行的網格(塊)數量有限制(維基百科說費米和開普勒爲16,我不知道這是否是合適的數字)。所以大量的小塊不會讓應用程序正確地填充硬件。 – Eugene 2012-08-08 17:15:41