#Hardware Accelerated GPU SchedulingによるGPUパフォーマンスの向上を調べてみました
2020年5月にアップデートされたWindows 10の新機能、Hardware-Accelerated GPU Schedulingの挙動について調べてみました。
#結論
- Hardware-Accelerated GPU Schedulingによって、アクティブウィンドウ(メインタスク)のGPU利用(描画を含む)がより優先されるようになった
- メインタスクだけでなく、サブタスクのGPU利用も効率化されている
- 対応したゲームのFPSが向上するかも??
#実験
##環境
実験環境は以下の通りです。
OS | Windows 10 Pro (20246) |
CPU | Intel Core i7-7700 |
GPU | Geforce GTX 1080 |
GPU グラフィックス driver | v456.71 |
CUDA | v10.1 |
##実験方法
今回の実験方法では、次のような空カーネルを連続実行し、それらの実行にかかった時間を計測しました。
__global__ void empty_kernel() {}
while (true) {
empty_kernel<<<1, 1>>>(); // 計測
}
空カーネルはGPUに制御を渡し、すぐにCPUに制御が戻ってくる動作をします。
GPUが多忙のときは、それらの実行が遅らされ、制御がCPUに戻ってこないために時間がかかってしまいます。
サブの描画タスクとして、CUDA Sampleにあるbilateral filter
を実行しました。
bilateral filter
の単独実行時のfpsは16です。(画像は拾い物です。)
##実験結果
実験結果は以下の通りになりました。
###bilateral filter
を実行せずに空カーネルを実行した場合、
横軸は空カーネル実行の累計時間(1秒間)、縦軸は空カーネル実行1回あたりにかかった時間です。
オレンジ色のグラフはHardware-Accelerated GPU Schedulingをオフ
にした場合で、青色のグラフはオン
にした場合の結果です。
それぞれ、コマンドプロンプトをアクティブウィンドウにして実行しています。
ご覧の通り、Hardware-Accelerated GPU Schedulingを利用した方が、一回あたりの空カーネル実行時間は短くなっていることがわかります。
今まで、GPUドライバーによってスケジュールされていたGPUタスクが、Hardware-Accelerated GPU SchedulingによってOSによっても最適化されたことがわかります。
(以前から、OSによってもGPUタスクスケジューリングされていたかどうかはわかりません。知っている方がいらっしゃれば、是非コメントをお願いします。)
###bilateral filter
と同時に実行した場合(active)
次は、bilateral filter
と同時に実行した場合の結果です。
今回も、空カーネル実行のコマンドプロンプトをアクティブウィンドウにして実行しています。
なんんと、結果が大きく異なりました!
Hardware-Accelerated GPU Schedulingを使用しなかった場合、サブタスクのbilateral filter
のfpsは16fpsのままで、空カーネルの実行はアクティブウィンドウにもかかわらず、数百倍遅くなっています。
つまり、サブのタスク(bilateral filter
)によってメインタスク(空カーネル実行)が外乱を受けていると考えられます。
一方、Hardware-Accelerated GPU Schedulingを使用した場合、メインタスク(空カーネル実行)の実行時間は比較的小さく落ち着いており、サブタスクのbilateral filter
のfpsが11に低下しました。
これは、Hardware-Accelerated GPU Schedulingのおかげで外乱が抑えられていると考えられます。
###bilateral filter
と同時に実行した場合(non-active)
次に、先ほどの実験のメインタスクとサブタスクを逆にしてみました。
今回は、メインタスク(bilateral filter
)のfpsは16で一定でした。
しかし、Hardware-Accelerated GPU Schedulingを使用しなかった場合に比べてHardware-Accelerated GPU Schedulingを使用した場合の方が**GPUタスクが競合していると考えられる部分(図で山になっているところ)**では、比較的安定してサブタスク(空カーネル)が実行されています。
これらより、Hardware-Accelerated GPU Schedulingによって、サブタスクにおいてもGPUタスクのスケジューリングは最適化されていると考えられます。
###GPUタスクを必要としないタスク(textファイルの表示)と同時に空カーネルを実行した場合
最後に、bilateral filter
ではなく、GPU処理をほとんど必要としないタスク(textファイルの表示)と同時に空カーネルを実行した場合についての結果も載せておきます。
どちらにおいても、空カーネルを単独実行した最初の実験とほとんど同じ結果でした。
したがって、GPUを利用するタスクがアクティブウィンドウで実行されているかどうかにかかわらずサブタスクであってもGPU処理が繁忙でない時(GPU処理性能が余っている)はフルにGPUを利用することができると言えます。
#まとめ
今回、新しくWindows 10で実装されたHardware-Accelerated GPU Schedulingの挙動について空カーネル実行を利用して調べてみました。
結果としては、従来のドライバーによるGPUタスクスケジューリングに加えて、OS側でGPUタスクスケジューリングが最適化されていることがわかりました。
それによって、GPUを利用するサブタスクによるメインタスクへの外乱を低減しただけでなく、サブタスクのGPU利用においても最適化されていることがわかりました。
今後、Hardware-Accelerated GPU Schedulingに対応したPCゲームのfps向上が期待されます。