【HW】複数枚のGPUを搭載したWindowsのGPUの扱いについて 
複数GPUを搭載している環境だと、WindowsのバージョンによってセカンダリGPUの扱いが違うというのがあるのでそのメモです。前回の内容に入れようと思った内容だったのですが長くなりすぎたので分けました。

昔は表示しているディスプレイごとに使うGPUが違った


 古のXPからWin7、W10の何処かのバージョンまでは、グラボが複数あってそれぞれ画面を出力している場合、その画面を表示しているGPUが実際にその内容を処理していました。 そのため、ゲーム用に使うGUPは画面を1枚だけつなぎ、それ以外の雑多な内容を表示するためのをGPUを別に搭載することによって一種の負荷分散が出来ました。
 少なくとも、1080を買った直後は「ゲーム用GPUは画面を1枚だけ出すのが一番パフォーマンスが出る」という動きをしていた記憶があります。

 逆に、セカンダリGPUが貧弱だと、ウィンドウモードで起動したゲームをセカンダリ側に持っていくとカクカクになるという動きをしていました。XPや7ではウィンドウモードで起動したゲームが少しでもディスプレイの境界をまたぐとFPSがガタ落ちしたのを覚えています。

すべての処理がプライマリGPU処理に


 それがWindows10のどこかのバージョン(20H2くらい?)からすべての内容はプライマリGPUで処理し、その結果を各ボードのRAMにコピーする、という挙動になっていました。その結果、 利点としてはHEVCなどの重いコーデックを使った動画やウィンドウモードで起動したゲームなどを、低性能なセカンダリGPUにつながっているディスプレイ領域にもっていってもそれなりに動く、という挙動になりました。




 上記はゲーム性能としてとしては貧弱なM2000に繋がったディスプレイにARKという重いゲームをウィンドウモードで起動して持ってきていますが、実態としては7900XTXで処理しているので100FPSを超えて表示できています。
 ラグなどもなく、ディスプレイのリフレッシュレート以上のFPSが出ているので、詳しくないとその事に気が付かないくらい違和感がありません。

 昔Twitterなどで「GPUが搭載されていてもオンボード側のHDMIなどにディスプレイを繋いでいて意味がない!」というような投稿がありましたが、その状態でもプライマリGPUがディスクリートGPUに指定されているならVRAMコピーを挟むもののGPU性能の8割位は出ていたと推測できます。
 非効率ではあるものの上記のARKの例のようにゲームなどは普通に動くので、実際のところ気がついていなかったのではないかと思います。Win7とか10のでたての頃は明らかにパフォーマンスが出なかったと思いますが。

 この仕組みの欠点としては、どうやってもプライマリGPUの負荷だけが上がるようになってしまうこと、ある程度以上のセカンダリを積んでいると、GPUのその余ったリソースを有効活用できないことです。
 また、マルチモニタ環境でセカンダリGPUに繋がったディスプレイでなにか作業をすると、まずプライマリGPUで描写→セカンダリGPUのVRAMにコピーという無駄なステップが増えてしまうという問題もありました。

無理やりプログラムが使うGPUを指定する


 プロセスが利用するGPUは、プロセスが立ち上がるときにWindowsでプライマリになっているディスプレイ(「このディスプレイをメインディスプレイにする」に指定されているディスプレイ)がつながっているGPUとなります。

 ずっと起動しているとあまりにもプライマリGPUのVRAMを消費するので、その仕組を利用して、ブラウザなどを起動する前にセカンダリGPUに繋がっている適当なモニタをプライマリにする→ブラウザなどを起動する→もとに戻す、という手順でVRAMを食うブラウザなどが利用するGPUを無理やり変更していたこともありました。
 ただ、これをするとFirefoxがWebGLやGoogleMapをレンダリングできなくなるというような問題があったので微妙なところでした。

 まあ、こまめに再起動すればいいという話はありますが、基本起動しっぱなしだと、作業中の窓やブラウザのタブを閉じたくないのでVRAMの負荷分散をしたいという動機が強くなります。

Win10から処理するGPUを指定できるようになったが…


 Windows10の21H2くらいからプロセスを処理させるGPUを指定できたのですが、試したところ省電力、高パフォーマンスというくくりは、UDHグラフィックスなどのiGPUを省電力GPU、それ以外のディスクリートGPUは高パフォーマンスGPUというくくりでした。
 なので、両方ともディスクリートであるM2000と1080という組み合わせの場合、どちらかを省エネグラボに指定する、ということは出来ませんでした。
https://forest.watch.impress.co.jp/docs/news/1270962.html

 M2000を省電力、1080を高パフォーマンスと指定できる方法がないかと探したのですが、結局iGPU以外は省電力GPUとして指定することは出来ませんでした。

Win11でいつの間にかプロセスのGPU割当機能が追加された


 7900XTXに換装後も4k複数枚でブラウザを起動したままにしていると相変わらずVRAMを10GBとか消費することがある(ブラウザを閉じてもDWMが4GBくらい抱えたままになる)のは解消しませんでした。メモリに余裕があるとはいえ流石にどうにかしたいです。

 WindowsUpdateを当てたらマシにならないかとWindowsUpdateを当てることにしたのですが、上記のグラフィックスのInsider previewを試すためにDevチャンネルにしたままなのを忘れていて、久しぶりにUpdateを当てたらWin11のInsider previewが降ってくるという事故を起こしてしまいました。
 意図せずWin11(のInsider preview)になってしまったのですが、ロールバックする前に今の環境をWin11にした場合の挙動を確認することにしました。

 仕事では13世代のi5を使う関係でW11を使っていますが、W10に比べてすべての動作が緩慢なのでW11をメイン機に入れたくないと思っていたところ、いざ実際に普段のマシンで使ってみると「あれ…なんか逆に調子いい?」という感じだったので、そのまま利用を続行しました。CPUはRyzen 5 5600XなのでP/Eコアというものはなく、OSはどちらを使っても問題ないはずなのですが…。

 そして、いろいろな設定を巡っているといつの間にかプログラムを処理するGPUを指定できるようになっていました。




 W11も初期のバージョンはこの「特定のGPU」という選択肢がなかったように思いますが、いつの間にか増えていました。確認したバージョンは Insider Preview Build 23612 (Dev Channel)となりますが、ビルド的に多分22H2くらいにも入っている気がします。

 その結果、ブラウザでなにか調べたり動画を見たりするときにはセカンダリGPUのVRAMやビデオデコーダがが使われるようになり、いい感じに動くようになりました。




 もっと前にこれができるようになっていてほしかったですが、ようやく欲しかった機能が実装されました。

まとめ


 プライマリGPUがミドルクラス〜ローエンドのグラボを使っていて、補助GPUを使って少しでもプライマリ側の負荷を下げたい、というときにはこのオプションは有効だと思います。

 現行のミドルクラスならベース性能がかなり上がっているのでその必要もない気はしますが、VRAMが8GBクラスのものだとゲーム用にメモリを空けるためにブラウザ処理用の補助GPUが欲しくなる気もします。
 ちなみに4kだとゲームを起動すると8GB位のメモリはあっという間に使うので、4kでゲームをしたいなら12GB、できれば16GB以上は必要だと感じました。

 動画のHWエンコードソフトから使うGPUを選べないような場合も、強制的に使うGPUを指定することによって負荷分散ができるようになります。1080とM2000を組み合わせたときにはOBSやD3DGearのHEVC録画はGPUを分けたほうがゲームのFPSは安定していました。

 また、プライマリGPUの性能が高いのであれば、CPUがiGPUを持っている場合マザボ側のポートもそれなりに使えるようになること、 NVS810 のような1スロットで8枚DPをはやせるGPUを使うときに、GPUの性能としては低くてもプライマリGPUの性能を借りることによってある程度快適に使えるので、ある種のディスプレイハブとして使うといった柔軟性がかなり高くなったと思います。
 

 こういったカーネル周りに手が入って良くなっている感じはするので、事故で上げてしまったW11はW10に戻さずに使うことにします。

以上


[ 1 コメント ] ( 648 回表示 )   |  このエントリーのURL  |  $star_image$star_image$star_image$star_image$star_image ( 3 / 754 )  |  

<戻る | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 進む> 最後へ>>