目錄

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 為例,步驟如下:

  1. 計算 WarpsPerBlock1024 / 32 = 32

  2. 查出 RegisterPerThread(例如 39,可用 nvcc --ptxas-options=-v 查得)

  3. 計算每個 Block 使用多少暫存器32 warps × 32 threads × 39 registers

  4. 與硬體限制(如 RegisterPerSM = 65536)比較,推估 Block 可在一個 SM 上佔多少空間

  5. 推算可同時容納多少 BlocksPerSM,再計算總 WarpsPerSM

  6. 換算出 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 ComputeCUDA 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 的配置,才能駕馭效能浪潮,達到最佳平行運算成果。

關於 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 主機租用

價格殺很大 / 量大可談

By taki

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *