Ubuntu Weekly Recipe

第592回 QEMUでGPUの3Dアクセラレーションを利用する

この記事を読むのに必要な時間:およそ 5.5 分

3D GPUの動作確認

3D GPUを有効化したインスタンスを起動したら,次は3Dアクセラレーションが効いているか確認しましょう。まず最初に確認すべきはdmesgの結果です。

$ dmesg | grep drm
[    2.291108] [drm] pci: virtio-vga detected at 0000:00:01.0
[    2.291113] fb0: switching to virtiodrmfb from VESA VGA
[    2.305099] [drm] virgl 3d acceleration enabled
[    2.309482] [drm] number of scanouts: 1
[    2.309487] [drm] number of cap sets: 2
[    2.320084] [drm] cap set 0: id 1, max-version 1, max-size 308
[    2.320204] [drm] cap set 1: id 2, max-version 2, max-size 556
[    2.320660] [drm] Initialized virtio_gpu 0.1.0 0 for virtio0 on minor 0
[    2.327230] virtio_gpu virtio0: fb0: virtio_gpudrmfb frame buffer device

ポイントは上記の「virgl 3d acceleration enabled」です。これによりvirglドライバーを使っていて,なおかつ3Dアクセラレーションが動いていることがわかります。

ちなみにQEMUによるインスタンス起動時に-displayオプションからgl=onを外して起動すると,次のようになります。

[    2.305099] [drm] virgl 3d acceleration not supported by host

-vga virtioを指定しているためにvirglドライバーが使われている点は一緒ですが,3Dアクセラレーションは無効化されていますね。-vga qxlなどに変更すると,virglではなくqxlドライバーが使われるようになります。

次にOpenGL関連の動作確認では定番のglxXXXなコマンドを実行してみましょう。あらかじめmesa-utilsパッケージをインストールしておきます。

$ sudo apt install mesa-utils

まずはグラフィックスデバイスの情報を表示するglxinfoコマンドの実行です。かなりいろいろな情報が表示されますが,今回はOpenGL関連の情報だけに限定して表示します。

$ glxinfo | grep OpenGL
OpenGL vendor string: Red Hat
OpenGL renderer string: virgl
OpenGL core profile version string: 4.3 (Core Profile) Mesa 19.2.1
OpenGL core profile shading language version string: 4.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.1 Mesa 19.2.1
OpenGL shading language version string: 1.40
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.1 Mesa 19.2.1
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.10
OpenGL ES profile extensions:

ポイントは「renderer string」です。ここでvirglが使われていることがわかります。gl=onを外して起動するとvirglではなくllvmpipeとなります。さらにllvmpipeのとき,別の行では「Acceleraed: no」と表示されます。つまりソフトウェアレンダラーが使われるのです。

Extended renderer info (GLX_MESA_query_renderer):
    Vendor: VMware, Inc. (0xffffffff)
    Device: llvmpipe (LLVM 9.0, 128 bits) (0xffffffff)
    Version: 19.2.1
    Accelerated: no
    Video memory: 3936MB
(中略)
OpenGL renderer string: llvmpipe (LLVM 9.0, 128 bits)

glxgearsコマンドでFPSを計測してみたところ,2400FPSから3500FPSで推移しました。gl=onなしだと2000FPSを超えることはなかったので,それなりに性能が改善しているようです。

図2 glxgearsコマンドは2400FPSから3500FPSの間を推移する

画像

またglxgearsを動かしている間のCPUの負荷は高いものの,ずっと100%に張り付くというほどでもありません。ただしglxgears実行中のCPU負荷そのものは,gl=onの有無で大きな違いはないようです。細かいところまで違いを見るとするなら,gl=onなしのほうがコンスタントに負荷が高く,gl=onありだと負荷が下がることもある,ぐらいでしょうか。

図3 LLVMpipeだとCPU負荷はほぼ一定

画像

ベンチマーク

最後に3D描画を利用したベンチマークを動かしてみましょう。今回は第524回「Hades Canyon/Kaby Lake GのdGPUを有効化する」でも利用したUNIGINE Heavenのみを動かします。

第524回ではPhoronix Test Suiteをインストールしましたが,今回はUNIGINE Heaven単体をインストールして実行する方法を紹介します。

$ wget https://assets.unigine.com/d/Unigine_Heaven-4.0.run
$ chmod +x Unigine_Heaven-4.0.run
$ ./Unigine_Heaven-4.0.run
Creating directory Unigine_Heaven-4.0
Verifying archive integrity... All good.
Uncompressing Unigine Heaven Benchmark.............................................................................
Unigine Heaven Benchmark installation is completed. Launch heaven to run it

ベンチマークの実行は次のとおりです。

$ cd Unigine_Heaven-4.0/
$ ./heaven

ウィンドウが開いたら「RUN」を選択し,画面左上の「Benchmark」をクリックするとベンチマークを開始します。QEMU上のフルスクリーンだとなぜかベンチマークが開始しなかったので,今回は最初のウィンドウで「Full screen」のチェックを外しています。

図4 QEMU上での実行結果

画像

図5 ホスト上での実行結果

画像

フルスクリーンではないため,QEMU上のほうが若干画面サイズが小さい状態ではありますが,FPSとスコアともにホストの6割ぐらいの性能が出ています。QEMU側はウィンドウを小さくすることで,さらに性能があがります。

ベンチマーク中のCPU使用率もそこまで高くなることはなく,またUNIGINE Heavenの描画がもたつくこともありませんでした。よってちょっとした3Dアプリケーションを動かすだけであれば十分な性能と言えるでしょう。

8月にリリースされたvirglrenderer 8.0ではさらに性能が改善しているそうです。さらにGSoC 2018ではVulkan対応がテーマとなっていたようです。もしかすると今後は「3DゲームはQEMUの中で動かす」ことが現実的になる時代が来るかもしれませんね。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。