Windows Server 2016における新機能の一つに、Hyper-V仮想マシンにおけるDiscrete Device Assignment(DDA)の対応があります。DDAの実装により、Hyper-V上の仮想マシンでPCIeデバイスを利用できるようになります。本記事は、WS2016上のHyper-V仮想マシンで、GPUパススルーを試した記録です。クライアントHyper-V(Windows 10)でDDAが利用可能かどうかは未検証です。
目次
概要
RemoteFX vs DDA
DDAでGPUパススルーをするにあたって、おそらく一番の疑問はRemoteFXと何が違うの?ということです。詳しい記事はそのうち書きたいと思いますが、簡略化するとRemoteFXはGPUを仮想化して一つのGPUを複数の仮想マシンで共有するのに対し、DDAは一つのGPUを一つの仮想マシンで割り当てて占有することを可能にするテクノロジーとなります。
DDAの利点
RemoteFXを利用する場合、仮想マシンは仮想化されたGPUにアクセスしますが、DDAの場合はGPUに直接アクセスします。従ってGPU仮想化のオーバーヘッドを抑えることが出来るため、ネイティブ環境に劣らないパフォーマンスを出すことが出来ます。DDAの場合はゲスト側にベンダーのドライバを導入する必要があり、使用するGPUのドライバがDDAをサポートする必要があります。
DDAの動作環境
Microsoft社による解説ページによると、DDAを利用するには
- Intel VT-xとIntel EPT、もしくはAMD-VとAMD NPTをサポートする64ビットCPU
- 割り込み再マッピングとDMA再マッピングをサポートするIntel VT-Dか、AMD IOMMUをサポートするチップセット
- Access Control Services(ACS)をサポートするPCI Expressルートデバイス
が必須とあります。ページにもあるように、Single Root I/O Virtualization(SR-IOV)をサポートする環境であれば、問題ないように思えます。
作業手順
ゲスト側の作業
- あらかじめGPUを追加する仮想マシンをシャットダウンしておく。
ホスト側の作業
サーバーをシャットダウンして、GPUを取り付ける。
サーバーを起動後、管理者権限をもつPowershellコンソールを開く。
以下のコマンドで、GPUに対応するインスタントID(デバイスID)を探す。
Get-PnpDevice -PresentOnly | where {$_.InstanceID -like 'PCI*'} | select InstanceID,FriendlyName | sort FriendlyName
該当しそうなデバイスが見つかったら、PCI ID RepositoryにベンダーID(VEN_以降の4桁コード)とデバイスID(DEV_以降の4桁コード)を入力して、パススルーしたいデバイスかどうか確認する。
→今回使用したのはATI FirePro V4800なので、ステップ3で選択したデバイスが正しかったことがわかる。インスタンスID(PCI…から最後の4桁コードまで全部)を適当な変数に代入しておく。
$deviceID = '見つけたインスタンスID'
インスタンスIDを使って当該デバイスのロケーションパスを取得、適当な変数に代入する。
$locationPath = (Get-PnpDeviceProperty -KeyName DEVPKEY_Device_LocationPaths -InstanceID $deviceID).Data[0]
GPUをホスト上で無効化する。以下のコマンドを入力後、エンターキーを入力して続行。
Disable-PnpDevice -InstanceId $deviceID
GPUをホストからアンマウント。
Dismount-VMHostAssignableDevice -force -LocationPath $locationPath
GPUを仮想マシンに割り当てる。
Add-VMAssignableDevice -VMName '仮想マシンの名前' -LocationPath $locationPath -Verbose
ドライバのインストール
通常通りに仮想マシンを起動する。
まとめ
DDAによって問題なくGPUパススルー出来ましたが、残念ながらゲスト側でドライバが動作しませんでした。AMDのこちらのスレッドによると、AMDのFireProドライバはDDAをサポートしていないとのことです。対応する新ドライバは2018年初頭にリリース予定とのことですが、2018年1月の時点においてまだ開発中のようです。今回試したV4800は古く対応されるかわかりませんが、新ドライバがリリースされたらFirePro WシリーズのGPUも試してみたいと思います。
参考URL
https://docs.microsoft.com/en-us/windows-server/virtualization/hyper-v/deploy/deploying-graphics-devices-using-dda
https://docs.microsoft.com/en-us/windows-server/virtualization/hyper-v/plan/plan-for-deploying-devices-using-discrete-device-assignment
cコメントを残す