QEMU/KVM でGPUパススルーをする
最近はGPUの性能向上や、ソフトウェアの改良により、仮想環境下のWindowsでも一般的な3Dゲーム程度ならば十分な性能を発揮できるようになってきました。ただし、そのためには仮想環境内のOSからGPUを直接触れる必要があります。この技術をGPUパススルーと言います。
NVIDIA社のGeForceシリーズ、AMD社のRadeonシリーズのどちらでもパススルーは可能ですが、いろいろな事情によりRadeonの方がやりやすいようです。
この記事は Radeon 5700XT についての記事です。その他の製品についても当てはまるかもしれませんが、当てはまらないかもしれません。情報のご利用は自己責任で。
基本的に、Arch Linux の記事
の通りにすればOKなので、まずは記事を読んでくださいな。
ここでは記事に書かれていないコツを紹介します。
GPUパススルーのコツ
ホストのカーネルにパッチが必要
この記事を書いている現在の時点(2020年10月)でLinuxカーネルに対してパッチが必要です。
これはRadeonシリーズに存在する、俗にPCIeリセットバグと呼ばれるバグを迂回するために必要です。
通常、仮想マシンの終了時にデバイスに対してリセットを送るのですが、Radeonシリーズはこの命令を受けると変な状態にロックしてしまうバグがあるようです。実マシンではPCIeの電源が切断されるので問題にならないのですが、仮想マシンの場合は電源断を仮想的に行なう(BACO)ため、問題になります。
この現象を回避するため、デバイスのリセットを特殊な手続きで行う必要があります。そのためのパッチが有志の方から提供されています。このパッチを適用することで、仮想マシンの再起動(終了、起動サイクル)が可能になります。
ドライバインストール後はホストを再起動
Radeon のドライバはインストール直後にマシンの再起動を求められます。また、カウントダウンが始まり、自動的に仮想マシンが再起動しようとします。
この時、(恐らくハードウェアをリセットする必要があるため)ホストを再起動してください。仮想マシンの再起動だけだとドライバをうまくインストールできないようです。警告なども特にありませんが、一度失敗してしまうと、ドライバの再インストールが必要です。
春のドライバアップデートで動作不能になった
2020年春ごろのドライバアップデートからうまく動作しなくなりました。ディスプレイへの画面出力がうまく行なわれず、ディスプレイからは無信号状態として扱われてしまいます。
この現象、ドライバの不具合などの可能性もあるため、しばらく放置していたのですが、複数回のアップデートを重ねても一向に直る気配がないため、本腰を入れて解決策を探しました。
いろいろと試行錯誤した結果、どうやらGPUドライバを騙す必要がありそうです。
llbvirtを使っている場合はマシンのXMLファイルの/domain/features/hyperv
に<vendor_id state="on" value="101"/>
などと書き加える必要がありました。QEMUをそのまま使っている場合は相当のオプションを付加する必要がありそうです。
Arch Linux の記事
とほぼ同じ操作が必要なようです。ただし、<hidden state='on'/>
は必要ありませんでした。
これによって以前と同様にGPUを使うことができるようになりました。さらに、以前はドライバユーティリティに項目が出現せず、使用できなかった録画機能(Radeon ReLive)も使えるようになりました。こういうこともあるんですね…
GPU回りはプロプラで固められていますし、正常動作するようになったので、こんな所で満足することにします。