Hardware-Accelerated GPU Schedulingによる恩恵[Windows 10]

#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                   | 
 
##実験方法

今回の実験方法では、次のような**空カーネル**を連続実行し、それらの実行にかかった時間を計測しました。

```CUDA
__global__ void empty_kernel() {}

while (true) {
    empty_kernel<<<1, 1>>>();    // 計測
}

```

空カーネルはGPUに制御を渡し、すぐにCPUに制御が戻ってくる動作をします。
GPUが多忙のときは、それらの実行が遅らされ、制御がCPUに戻ってこないために時間がかかってしまいます。

サブの描画タスクとして、CUDA Sampleにある`bilateral filter`を実行しました。

`bilateral filter`の単独実行時のfpsは16です。(画像は拾い物です。)
![bilateralfilter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458877/906ba84f-f4fb-c63a-5e72-e2c8594905ff.png)



##実験結果

実験結果は以下の通りになりました。

###`bilateral filter`を実行せずに空カーネルを実行した場合、
![free.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458877/a90f8a2b-3a73-c21a-8abf-b0de4fe32613.png)

横軸は空カーネル実行の累計時間（1秒間）、縦軸は空カーネル実行１回あたりにかかった時間です。
<font color="DarkOrange">オレンジ色</font>のグラフは**Hardware-Accelerated GPU Scheduling**を`オフ`にした場合で、<font color="DarkBlue">青色</font>のグラフは`オン`にした場合の結果です。
それぞれ、コマンドプロンプトを**アクティブウィンドウ**にして実行しています。

ご覧の通り、<font color="DarkBlue">**Hardware-Accelerated GPU Schedulingを利用した方**</font>が、一回あたりの空カーネル実行時間は**短くなっている**ことがわかります。

今まで、GPUドライバーによってスケジュールされていたGPUタスクが、**Hardware-Accelerated GPU Scheduling**によって**OS**によっても最適化されたことがわかります。
（以前から、OSによってもGPUタスクスケジューリングされていたかどうかはわかりません。知っている方がいらっしゃれば、是非コメントをお願いします。）

###`bilateral filter`と同時に実行した場合（active）

次は、`bilateral filter`と同時に実行した場合の結果です。
今回も、空カーネル実行のコマンドプロンプトを**アクティブウィンドウ**にして実行しています。
![on_active_window_11or16fps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458877/a72c5b42-d826-7854-4fec-9c96cf796b08.png)

**なんんと、結果が大きく異なりました！**

<font color="DarkOrange">**Hardware-Accelerated GPU Schedulingを使用しなかった場合**</font>、サブタスクの`bilateral filter`のfpsは**16fpsのまま**で、空カーネルの実行は**アクティブウィンドウにもかかわらず**、**<font color="Red">数百倍</font>遅くなっています**。
つまり、サブのタスク（`bilateral filter`）によってメインタスク（空カーネル実行）が**外乱を受けている**と考えられます。

一方、<font color="DarkBlue">**Hardware-Accelerated GPU Schedulingを使用した場合**</font>、**メインタスク（空カーネル実行）の実行時間は比較的小さく落ち着いており**、サブタスクの`bilateral filter`の**fpsが11に低下しました**。
これは、**Hardware-Accelerated GPU Schedulingのおかげで外乱が抑えられている**と考えられます。

###`bilateral filter`と同時に実行した場合（non-active）

次に、先ほどの実験の**メインタスクとサブタスクを逆にしてみました**。
![on_sub_window_16fps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458877/b0a87b1b-de3e-aa34-14fa-1ad336363439.png)

今回は、**メインタスク（`bilateral filter`）のfpsは16で一定でした**。

しかし、<font color="DarkOrange">**Hardware-Accelerated GPU Schedulingを使用しなかった場合**</font>に比べて<font color="DarkBlue">**Hardware-Accelerated GPU Schedulingを使用した場合**</font>の方が**GPUタスクが競合していると考えられる部分（図で山になっているところ）**では、**比較的安定してサブタスク（空カーネル）が実行されています**。

これらより、**Hardware-Accelerated GPU Scheduling**によって、**サブタスクにおいてもGPUタスクのスケジューリングは最適化されている**と考えられます。

###GPUタスクを必要としないタスク（textファイルの表示）と同時に空カーネルを実行した場合

最後に、`bilateral filter`ではなく、GPU処理をほとんど必要としないタスク（textファイルの表示）と同時に空カーネルを実行した場合についての結果も載せておきます。

####textファイルがサブタスクの場合
![on_active_window_with_text_file.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458877/80626e4b-41e4-494c-18da-914f668d1b72.png)

####textファイルがメインタスクの場合
![on_sub_window_with_text_file.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458877/3939d97e-e3b5-5ac5-1181-c3b733a47ea6.png)

どちらにおいても、空カーネルを単独実行した**最初の実験とほとんど同じ結果でした**。

したがって、**GPUを利用するタスクがアクティブウィンドウで実行されているかどうかにかかわらず**サブタスクであっても**GPU処理が繁忙でない時（GPU処理性能が余っている）はフルにGPUを利用することができる**と言えます。

#まとめ

今回、新しくWindows 10で実装された**Hardware-Accelerated GPU Scheduling**の挙動について空カーネル実行を利用して調べてみました。

結果としては、従来のドライバーによるGPUタスクスケジューリングに加えて、OS側でGPUタスクスケジューリングが最適化されていることがわかりました。
それによって、**GPUを利用するサブタスクによるメインタスクへの外乱を低減しただけでなく、サブタスクのGPU利用においても最適化されていることがわかりました**。

今後、**Hardware-Accelerated GPU Scheduling**に対応したPCゲームのfps向上が期待されます。