我參加了CUDA並行編程課程,並且我看到了很多CUDA線程配置的例子,在這些例子中,我們需要將線程的數量四捨五入到最接近的32的倍數。我知道線程被分組爲warp,如果你啓動1000個線程,那麼GPU會將它舍入到1024,所以爲什麼要明確地表達呢?爲什麼要在CUDA中啓動32個線程的倍數?
2
A
回答
3
建議通常在您可能會想到選擇各種線程塊大小以解決相同問題的情況下給出。
讓我們以矢量添加爲例。假設我的矢量長度爲100000.我可以選擇通過啓動100個1000線程塊來實現。在這種情況下,每個塊將有1000個活動線程和24個不活動線程。我的線程資源平均利用率爲1000/1024 = 97.6%。
現在,如果我選擇大小爲1024的塊呢?現在我只需要啓動98塊。這些塊的前97個在線程利用率方面得到充分利用 - 每個線程都在做一些有用的事情。第98塊只有672個(1024個)線程正在做一些有用的事情。由於線程檢查(if (idx < N)
)或其他內核代碼中的構造,其他顯式非活動。所以我在這個塊中有352個不活動的線程。但我的整體平均利用率十萬〇三百五十二分之十萬= 99.6%
因此,在上述情況下,最好選擇「全」 threadblocks,由32
整除如果你正在做載體上添加的矢量長度爲1000,並且您打算在單個線程塊中執行此操作(兩者可能都是錯誤的想法),那麼無論您爲線程塊大小選擇1000還是1024,都無關緊要。
相關問題
- 1. CUDA不啓動線程?
- 2. 爲什麼java線程不啓動?
- 3. 爲什麼我不能啓動線程
- 4. 爲什麼線程緩慢啓動?
- 5. 什麼啓動JVM線程?
- 6. 爲什麼在線程中執行此任務需要10倍的時間?
- 7. 爲什麼需要線程
- 8. 爲什麼要從子shell /爲什麼parens在(someCommand&)中啓動後臺進程?
- 9. 可以在單個CUDA內核中啓動的最大線程數
- 10. 塊中的一個線程和一個warp(32個線程)有什麼區別?
- 11. 爲什麼啓動一個線程被另一個線程阻塞?
- 12. 爲什麼我需要塊維度來計算CUDA中的線程ID?
- 13. 爲什麼在pthread中需要線程特定的數據?
- 14. 爲什麼數字會自動翻倍?
- 15. 爲什麼我不能在我的Activity中啓動一個線程2x?
- 16. 啓動多個線程,爲什麼你必須等待?
- 17. 爲什麼第二個線程不能啓動?
- 18. 這個過程爲什麼不啓動?
- 19. 爲什麼動態數組總是翻倍的2倍?
- 20. 多個主機線程啓動各個CUDA內核
- 21. 爲什麼從Azure啓動任務中調用32位regsvr32?
- 22. 爲什麼Windows 10在我的程序中啓動額外的線程?
- 23. CUPTI在多線程代碼中阻止CUDA內核啓動
- 24. 爲什麼我的網站需要「啓用32位應用程序」?
- 25. 爲什麼共識數字在多線程中很重要?
- 26. 爲什麼我無法在用戶控件構造函數中啓動線程?
- 27. 一個線程需要2秒,10個線程需要16-18秒。爲什麼?
- 28. 爲什麼兩個Java線程(在某些情況下)比一個快兩倍?
- 29. 爲什麼要了解CUDA Warps?
- 30. 當爲一個int64變量時,爲什麼struct size是8的倍數在32位系統中