CUDAのGPU資源割り当て機能Green Contextsは、計算ユニットを処理ごとに分け、選んだ資源へ実行を向ける。ストリームの優先度だけでは制御できない計算資源の競合に加え、処理キューの共有も明示的に管理する。
優先度だけでは空かない計算ユニットを分ける
GPU上で遅延に敏感な処理と大量の計算を担う処理を並行させるとき、ストリームの優先度には制御できない境界がある。NVIDIAによると、高優先度の処理でも、計算ユニットであるsmですでに動いているブロックを中断することはできず、実行中のブロックが終わって資源が空くのを待つ。
Green Contextsは、使用するsmを部分集合として割り当て、そのコンテキスト経由の処理を指定したsmへ送る。これにより、異なる処理に別々のsm群を割り当て、同じ計算ユニットを奪い合わない構成を取ることができる。
ストリーム作成時に使用資源を明示する
割り当てた資源と実際の処理を結ぶのが、ストリームの作成手順だ。従来のRuntime APIでは、ストリームの実行先は、作成時に呼び出しスレッドが選択していたデバイスやコンテキストの状態から決まっていた。
Green Contextsでは、cudaGreenCtxCreate()で得たハンドルをcudaExecutionCtxStreamCreate()へ直接渡してストリームを作る。そのストリームへ投入する処理は、選んだコンテキストの資源に関連付けられる。この機能はCUDA 12.4からDriver APIで提供され、CUDA 13.1からはRuntime APIでも利用できるようになった。
処理キューの共有による直列化も制御する
smを割り当てるだけでなく、処理を送るキューの共有も並行実行に関わる。従来の実行モデルでは、独立したストリームの処理が同じworkqueueへ割り当てられ、計算資源に余裕があっても意図せず直列に実行される場合がある。
NVIDIAは、Green Contextsでworkqueue資源を明示的に確保すると、アプリケーションが期待する並行実行を指定し、不要な依存関係を減らすことができるとしている。コンテキストの作成と破棄も、無関係なGPU処理を暗黙に同期させない。
計算資源とメモリーを同じGPU内領域へ配置する
実行先の指定は、GPU内でメモリーを置く場所とも組み合わせることができる。CUDA 13.4は、smとデバイスメモリーを含むGPU内の領域であるLocality domainへ、プログラムからアクセスする機能を公開した。
アプリケーションは、この領域にデバイスメモリーを割り当て、同じ領域のsm資源を使うGreen Contextsを作成することができる。処理が使うsmと、その処理がアクセスするメモリーの配置を、同じLocality domainにそろえられる。