目錄
CUDA 優化
 
															為什麼 Thread 與 Block 的配置這麼關鍵?
在 CUDA 核心函式中,Thread 數與 Block 數的配置,是影響效能的關鍵因素。配置得當,可以最大化 GPU 的資源使用率,提升運算吞吐量;若配置不佳,則可能浪費寶貴的硬體資源,導致執行效能低落。
本文是「CUDA 程式調優指南」系列的第三篇,將以實例與原理兼具的方式,說明如何根據 GPU 架構與 kernel 行為,配置最適當的 Block 與 Thread 組合,並透過 occupancy 理解實際效能。
一、什麼是 ThreadsPerBlock?
在設定 CUDA kernel 啟動參數時,ThreadsPerBlock(每個 Block 中的 Thread 數量)是一個非常重要的參數。它的最大值會受到兩個主要硬體限制:
- 單個 Block 可容納的最大 thread 數(例如 1024) 
- 每個 SM(Streaming Multiprocessor)可同時支援的暫存器、shared memory、warps 數量等資源限制 
雖然 ThreadsPerBlock 常見取值為 256、512 或 1024,但實際上每個 kernel 的最適值會根據使用暫存器數量與 occupancy 的表現而異。
二、Occupancy 是什麼?
Occupancy 是衡量 GPU 資源使用效率的重要指標,定義為:
Occupancy = 一個 SM 上實際活躍 warp 數量 ÷ 該 SM 可支援的最大 warp 數量
為什麼要追求高 Occupancy?
當 thread 之間存在等待(如記憶體延遲),高 Occupancy 可讓其他 warp 接手執行,藉此「掩蓋延遲」。這對整體效能提升非常重要。
Occupancy 又可分為:
- Theoretical Occupancy:根據硬體限制與配置預測的理論值 
- Achieved Occupancy:實際執行過程中 CUDA Profiler 所觀察到的數值 
三、如何計算 Theoretical Occupancy?
以 ThreadsPerBlock = 1024 為例,步驟如下:
- 計算 WarpsPerBlock:1024 / 32 = 32 
- 查出 RegisterPerThread(例如 39,可用 - nvcc --ptxas-options=-v查得)
- 計算每個 Block 使用多少暫存器:32 warps × 32 threads × 39 registers 
- 與硬體限制(如 RegisterPerSM = 65536)比較,推估 Block 可在一個 SM 上佔多少空間 
- 推算可同時容納多少 BlocksPerSM,再計算總 WarpsPerSM 
- 換算出 Occupancy 百分比 
四、實戰舉例:Im2Col 核心的調整
以 NVIDIA GTX 1080(Compute Capability 6.1)為例:
| ThreadsPerBlock | Theoretical Occupancy | 執行時間(us) | 
|---|---|---|
| 1024 | 50% | 86 | 
| 512 | 75% | 76 | 
| 768 | 75% | 64 | 
可以看到,並非 Threads 越多越快,而是找到最適合硬體資源配置的組合才能獲得最好效能。
五、Achieved Occupancy 的現實限制
即便 Theoretical Occupancy 已算出,實際情況也可能無法達到。例如:
- 有些 threads 雖啟動但未實際參與運算 
- 控制流過於複雜,導致執行不均 
- 記憶體訪問不連續,導致 warp idle 
建議使用 Nsight Compute 或 CUDA Profiler 工具來觀察 Achieved Occupancy,並針對熱點(hotspot)kernel 做優化。
六、BlockNum 如何決定?
BlockNum(總 block 數量) = ceil(資料總量 / ThreadsPerBlock)。
但這僅是基礎公式,若想進一步優化 GPU 利用率,還需考量 BlocksPerSM(每個 SM 可容納的 block 數)。
常見影響因素有:
- GPU 架構:每個 SM 可同時執行多少個 blocks 
- 每個 block 使用多少 shared memory、暫存器 
- Block 設定是否導致過度資源爭用 
七、進階技巧:降低 Block 開銷
在使用 macro CUDA_1D_LOOP(i, n) 的情境下,若 Block 數過多,每個 thread 處理的資料量太小,會導致:
- 多餘的 shared memory 初始化成本 
- Block 之間切換開銷 
- 無法有效隱藏延遲 
建議:適度減少 BlocksPerSM、提高 ThreadsPerBlock,讓每個 thread 的工作量更合理。
八、總結與建議:
- ThreadsPerBlock 建議從 256~1024 間調整,搭配工具確認暫存器使用 
- 優先追求高 Occupancy,但避免過度設計導致浪費資源 
- 使用 profiler 工具觀察實際執行效能(Achieved Occupancy) 
- Block 數量不要盲目拉高,應考量實際佔用資源與 thread 負載 
常見問題 FAQ
不一定。雖然大 Threads 數可提升並行度,但若超過硬體資源限制,反而可能導致 Occupancy 下降,建議以 profiler 工具驗證最佳值。
可從減少 RegisterPerThread、調整 ThreadsPerBlock、簡化控制流等方向優化,提升 SM 的資源配置效率。
建議以 ceil(資料筆數 / ThreadsPerBlock) 為基礎,再觀察 BlocksPerSM 是否達成資源最佳化。
結論:Thread 與 Block,是調校效能的舵與帆
本篇文章從 ThreadsPerBlock 的基本限制、Occupancy 計算邏輯、實戰案例,到 BlocksNum 的配置與資源權衡,提供了完整且可操作的 CUDA 調校策略。
正如駕駛帆船時須根據風勢調整帆與舵,在 CUDA 程式中也須視硬體條件與 kernel 特性,調整 Threads 與 Blocks 的配置,才能駕馭效能浪潮,達到最佳平行運算成果。
延伸閱讀與資源推薦
以下是幾個推薦的 CUDA 最佳化資源與進一步學習材料:
關於 TAKI Cloud
TAKI Cloud 提供專業的 AI 伺服器租用、GPU 雲端運算並專注於AI伺服器與GPU雲端服務,提供符合國際標準的中華電信 IDC 機房與 24 小時技術支援,協助國內外 AI 團隊快速布署最新大模型,具備多年 A100 / H100 環境管理與支援經驗。
官方網站:www.taki.com.tw
本文作者:張亮
TAKI Cloud 資深系統架構師,專精於 AI 運算優化、CUDA 調校與高效能 GPU 叢集架構,擁有 10 年以上經驗,曾協助多家 AI 新創完成模型加速專案。
RTX - 3090 GPU 主機
視頻渲染、科學模擬和機器學習
支援 DeepSeek-R1 32B
實例
8卡 NVIDIA RTX-4090 24G
數量
1
全台唯一提供高階 AI / GPU 主機租用
價格殺很大 / 量大可談
RTX - 4090 GPU 主機
視頻渲染、科學模擬和機器學習
支援 DeepSeek-R1 70B
實例
8卡 NVIDIA RTX-4090 24G
數量 庫存緊張,欲租從速
1
全台唯一提供高階 AI / GPU 主機租用
價格殺很大 / 量大可談
HGX H100 GPU 主機
原價 499,999元/月 特惠價 450,000元/月
支援 DeepSeek-R1 671B 滿血版
實例
8顆 NVIDIA HGX H100 80G
數量
1
全台唯一提供高階 AI / GPU 主機租用
價格殺很大 / 量大可談
