2019年1月17日木曜日

Windowsの「プロセッサーのスケジュール」の設定について

CPU使用率に十分な余裕があるのにも関わらず、ゲームを遊んでいる時にClownfishというオーディオアプリがアンダーバッファ炸裂(ぶちぶちと音が切れまくる)しまっていた事に関するトピック。
結果的にこれはWindows設定の「プロセッサーのスケジュール」をデフォルトから「バッググランドサービス」に変更することで解決しました。
しばらく、この設定の意味することが分かっていなかったのですが息抜きがてらに調べたのでまとめておきます。

---
マルチコアCPUの消費電力はスケジューリングで変わる? - ASCII JP
http://ascii.jp/elem/000/000/672/672088/index-3.html
Long/Short - スレッド切り替え間隔を長くするか短くするか。長いほうがコンテキストスイッチのオーバーヘッドが小さくなり、短いほうがリアルタイム性は上がると推測されます。
Variable/Fixed - フォアグランドなプロセスにCPU時間を優遇するか否か。優遇する割合は次のパラメーターで設定できます。
QuantumBoost - 上記パラメータがVariableに設定されている時に利用されるパラメーターです。1倍、2倍、3倍から選べます。

Variable/FixedとQuantumBoostは被ってしまっているところがあるが互換性の都合と考えられます。
私が小学生でも知っていると冗談で馬鹿にされた「プロセッサーのスケジュール」の秘密はこのようになっていました。
> 「プログラム」と「バックグラウンドサービス」の2つの設定があるが、前者は「Short-Variable-3倍」(クライアント版Windowsのデフォルト値)を設定するもので、後者は「Long-Fixed」(サーバー版のデフォルト値)を意味

ボイスチェンジャーのようにリアルタイム性が要求されるプロセスを実行する場合は、フォアグランドが優先されるとアンダーバッファを引き起こす可能性があり得そうです。
また、リアルタイム性を上げるために切り替え間隔をShortに切り替えるのは何か効果が望めるかもしれません。とはいえ当然ながら、リアルタイム性を向上させるとオーバーヘッドが増加するのでこの辺りのバランスになりそうです。効果の程はやってみないと分からないところがあります。

8コアのようなシステムならば基本的にはプロセスアサインのstrategyがうまくできれば意識しなくても良さそうなものなのですが、この辺りはよく分かっていません。