このあたり、まったくの無知だったのだが、Hyper-V経由でGPUを利用するのはやっぱり無理なのか。 やりたいことは、Hyper-V上にUbuntuをインストールし、GPUを有効化し、TensorFlowやCNTKを動作させることだった。 しかし、どう頑張っても、GPGPUを認識させることができない。
よく考えてみれば、このことは別に驚くに値しない。Hyper-Vのアーキテクチャ上、子パーティションはどうやら直接ハードウェアにアクセスする訳ではなく、親のOS(Windows)を経由してアクセスするようだ。 子パーティションがアクセスを要求すると、VMBusを通じて親OSに要求が渡り、処理されるようになる。そりゃ、直接見えない訳だ。
子パーティションはハードウェアリソースを直アクセスしない。そのかわり、仮想デバイスという概念でリソースの仮想的なビューを持つ。仮想デバイスに要求すると、VMBusを経由して親パーティションのデバイスにリダイレクトされる。リクエストはそこで管理される。VMBusはパーティション間の通信を可能にする論理的なチャンネルである。レスポンスも同様にVMBusを経由してリダイレクトされる。もし親パーティションのデバイスが仮想デバイスでもあるなら、親パーティションやより遠くに、物理デバイスへのアクセスできるところまでリダイレクトされる。親パーティションは仮想化サービスプロバイダ (Virtualization Service Provider) を実行する。それはVMBusを接続し、子パーティションからのデバイスのアクセス要求をハンドルする。子パーティションの仮想デバイスは内部で仮想サービスクライアント (Virtualization Service Client) を実行する。それはVMBusを経由して親パーティションのVSPへリクエストをリダイレクトする。この全体のプロセスはゲストOSに透過的である。
という訳で、仮想OSからGPUを使えるようにする試行はまたふりだしに戻ってしまった。次に調査すべきは、VMware ESXiかなあ。これも、GPUを扱うことができるのか、調査してみる必要がある。