著者は素人のお知らせ
著者はこの分野の知見を広めてみようかなぁ~くらいの気持ちの人です。普通にメモです。
記事内で出てくるカーネルとはGPUで実行するプログラムのこと。
まとめ
CPUとGPUが合わさったプラットフォームでは帯域干渉が少ない影響が与える。本論文では効率的にCPUタスクをスケジューリングする方法を提案している。
Jetsonプラットフォームで起こる問題
JetsonのSoCのようなGPUとCPUがメインメモリを共有しているシステムではCPUでメモリ集中型タスクを実行するとGPU側に大きな影響を与えGPU性能が3分の1くらいになる。
BWLOCK++概要
BWLOCK++とはCPUのタスクからGPUカーネルを保護するためのソフトウェアフレームワークである。CPUタスクをスロットリング(性能抑制)してGPUタスクを保護する。そこでスロットリングが考慮されたCPUスケジューリングアルゴリズム (= TFS)が提案されている。具体的には以下の内容を実行している。
重要なGPUタスクが実行されている間はメモリ集中型タスクよりCPU集中型タスクを優先する。
よってメモリ集中型CPUタスク存在する中で帯域幅集中型GPUが性能を維持できることができる。CPU側のタスクのスループット損失も大幅に抑えられている。
用語の定義
-
メモリ集中型CPUタスク
- CPUで実行されメモリ帯域を多く占有するタスク。
-
CPU集中型タスク
- CPUの計算が多く占めるタスク。メモリへの負荷は低い
-
帯域幅集中型GPUタスク
- GPUで実行されメモリ帯域を多く必要とするタスク。
GPUはCUDA APIを通じて使用されその使われ方は典型的で予測可能であるためCUDA APIの呼び出しをトリガーにBWLOCK++が呼び出されるようにする。ただしソースには手を加えるのことは良くないとのことで動的リンカーとかを経由してバイナリに直接送り込む。
cudaMalloc -> cudaMemcpy -> kernel<<<...>>>> -> のような感じ
以下からBWLOCK++は構成される
- CUDA APIの実行具合を検出するダイナミックランタイムライブラリ。(ダイナミックリンカーレベルでプログラムバイナリに自動的にインストルメンテーションされる。
- CPUコアごとのバンド幅レギュレータ
- スロットルフェアスケジューラ
重要なGPUタスクが実行されている間は、CPUコアごとに単位時間あたりのメモリ転送量予算(クォータ)が割り当てられている。クォータを使い切ったコアはスロットルされる。そのためGPUタスクが実行中の間はCPU集中タスクを優先的に割り当てるようにスケジューリングする。
規制時間ごことに動作する(論文では1ms)突発的な負荷にも対応できる。また長期間にわたる飢餓を防ぐ。
BWLOCK++実装
プログラマーの介入が必要としないアプローチが支持されている。
Linuxのシステムコールを作っている。
note
LinuxのCFSスケジューラを使った。しかし副作用があるっぽい。
Armにもちゃんとあるのね(当たり前) L2D CACHE REFILL