ブロックサイズ768では、1個のSMの枠のうち256スレッドぶんが無駄になりました。
ブロック数がSM数の40を超えると、超えたぶんは次の波に回り、時間はそのぶん伸びます。
GPUはSMという単位に分かれています。1個のスレッドブロックは、複数のSMにまたがらず1個のSM上で動きます。
CUDAの並列処理は、SM(ストリーミング・マルチプロセッサ)という単位が基本になります。公式はCUDA対応GPUは多数の並列プロセッサをストリーミング・マルチプロセッサ(SM)としてまとめていると説明しています。
そのうえで各SMは複数のスレッドブロックを同時に実行できるが、1個のスレッドブロックは必ず1個のSM上で動くとも述べています。
この「1個のSM上で動く」という制約が、ブロックサイズの選び方にどう効くのか実際に計算して数えました。
SM 40個、1個のSMは最大 1024スレッドまで同時に抱えられる
1個のスレッドブロックは、必ず1個のSM上で動く
ブロックサイズ SMあたりのブロック数 端数の無駄 全SM合計の同時スレッド数
64 16個 0スレッド 40,960スレッド
128 8個 0スレッド 40,960スレッド
256 4個 0スレッド 40,960スレッド
300 3個 124スレッド 36,000スレッド
768 1個 256スレッド 30,720スレッド
64・128・256のように上限を割り切れるサイズでは、無駄は0スレッドです。
768を選ぶと、SM1個あたり1ブロックしか置けず、256スレッドぶんの枠が余ります。全SM合計では30,720スレッドまで落ち込みました。
この結果から、ブロックサイズはSMの上限を割り切れる値を選ぶことが無駄をなくす基本だとわかります。
CUDA GPUs have many parallel processors grouped into Streaming Multiprocessors, or SMs. Each SM can run multiple concurrent thread blocks, but each thread block runs on a single SM.原文NVIDIA Developer Blog「An Even Easier Introduction to CUDA」 この内容の有効期限2027-02-19
GPUごとにSM数と、1個のSMが抱えられる上限スレッド数が決まっています。これがブロック設計の前提になります。
ブロックサイズを決める前に、対象GPUの上限を知る必要があります。公式は例としてTuring世代のNVIDIA T4 GPUは40個のSMと2560個のCUDAコアを持ち、各SMは最大1024個のアクティブスレッドを扱えると述べています。
この上限は、GPUの世代やモデルによって変わります。AMD GPUの記事で見たROCmのように、ベンダーごとに前提となる数値が異なる点は共通しています。
SM数と上限スレッド数がわかれば、前段の占有率の計算や、次段の速さの見積もりがどちらも組み立てられます。まずこの2つの数値を確認することが出発点です。
an NVIDIA T4 GPU based on the Turing GPU Architecture has 40 SMs and 2560 CUDA cores, and each SM can support up to 1024 active threads.原文NVIDIA Developer Blog「An Even Easier Introduction to CUDA」 この内容の有効期限2027-02-19
ブロック数はSM数までは無料で並列に処理されます。それを超えると、超えたぶんは次の波として時間に加算されます。
CUDAでブロック数を増やす効果には、はっきりした境目があります。公式は1ブロックから複数ブロックへ増やしたときの速さの伸びは、GPU上のSM数(40個)に比例すると説明しています。
この比例関係を実際に計算して確かめました。
要素数 1,048,576。ブロックサイズ 256、1波の処理に 1ms
ブロック数 必要な波の数 合計時間 1波(全SM分散)との比
1個 1波 1.0ms 1.0倍
10個 1波 1.0ms 1.0倍
40個 1波 1.0ms 1.0倍
80個 2波 2.0ms 2.0倍
4,096個 103波 103.0ms 103.0倍
ブロック数が1個でも40個でも、合計時間は1.0msのまま変わりません。40個までは同時に1波で処理できるためです。
80個になると2波必要になり、時間は2.0倍に伸びます。4,096個では103波、103.0倍まで伸びました。
この形から、ブロック数をSM数の倍数で設計すると、波の切れ目がきれいになることがわかります。半端な数だと最後の波が埋まらず、無駄が残ります。
ブロック数がSM数(40)を超えると、時間は波の数に比例して伸びる。
the speedup going from a single block to multiple blocks is proportional to the number of SMs (40) on the GPU.原文NVIDIA Developer Blog「An Even Easier Introduction to CUDA」 この内容の有効期限2027-02-19
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る