続・玩式草子 ―戯れせんとや生まれけん―

第33回 Days of WINE and Struggles again[2]

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

(2)各種動画コーデックのハードウェア処理機能

次に動画コーデックのハードウェア処理機能を見てみます。最近のビデオカードにはMPEG2やH.264/AVCといった規格の動画をハードウェアを使ってエンコード/デコードする機能が用意され,それらを使用するためにNVIDIAはVDPAU(Video Decode and Presentation API for Unix)というAPIを,IntelはVA(Video Acceleration)というAPIをそれぞれ提案しました。

AMDもXvBA(X-Video Bitstream Acceleration)というAPIを提案したものの,比較的早くからVDPAU/VA-APIの双方に対応する方針に転換しました。

VA-APIはエンコードとデコードの機能を持つのに対し,VDPAUはその名前の通りデコード専用のAPIです。これらAPIを受け付けるライブラリは,libvalibvdpauという別パッケージが用意するものの,最終的にGPUを操作する機能はMesaが提供しています。

37  usr/lib/vdpau/libvdpau_r300.so.1.0.0
38  usr/lib/vdpau/libvdpau_r600.so.1.0.0
39  usr/lib/vdpau/libvdpau_radeonsi.so.1.0.0
40  usr/lib/vdpau/libvdpau_nouveau.so.1.0.0
25  usr/lib/dri/r600_drv_video.so
26  usr/lib/dri/radeonsi_drv_video.so
27  usr/lib/dri/nouveau_drv_video.so

これら/usr/lib/vdpau/にインストールされるのがVDPAU用ライブラリで,/usr/lib/dri/以下にインストールされるのがVA API用ライブラリです。

Intel用のライブラリは,Intel自身がDRMを操作するライブラリを含めたlibvaパッケージをOSSとして提供しているためMesaでは対応していないものの,libvdpau-va-glというVDPAUとVA/OpenGL間を架橋するようなライブラリも開発されているので,IntelのGPUでも問題なくVDPAUを利用できます。

(3)GPUをグラフィックス以外の演算に利用するGPGPU機能

GPUは条件分岐のような複雑な処理は苦手なものの,ベクトル演算のような単純計算の処理能力はCPUを凌駕します。このGPUの計算能力を膨大な計算量が必要な「ビットコイン・マイニング」のような作業に流用しよう,というのがGPGPU(General Purpose GPU)技術で,そのためにOpenCL(Open Computer Language)という規格が提案されました。

OpenCLも規格を策定しているのはKhronos Groupです。なお正確に言うと,OpenCLはGPUだけではなく,DSP(Digital Signal Processor)やFPGA(Field Programmable Gate Aray)等,プログラム可能な周辺機器を統一して扱おうという規格で,GPU限定というわけではありません。

Mesa3DライブラリはこのOpenCLにも対応していて,libMesaOpenCL.soというライブラリとGalliumフレームワークのドライバを用いてOpenCLの機能を実現しています。

93  usr/lib/libMesaOpenCL.so
29  usr/lib/gallium-pipe/pipe_iris.so
30  usr/lib/gallium-pipe/pipe_nouveau.so
31  usr/lib/gallium-pipe/pipe_r300.so
32  usr/lib/gallium-pipe/pipe_r600.so
33  usr/lib/gallium-pipe/pipe_radeonsi.so
34  usr/lib/gallium-pipe/pipe_vmwgfx.so
35  usr/lib/gallium-pipe/pipe_swrast.so

ただ,OpenCLの最新規格は3.0で,NVIDIAのCUDA(Compute Unified Device Architecture)等,GPUメーカが提供しているドライバはこのバージョンに追従しているものの,Mesaが提供するOpenCL用ドライバ(Clover)OpenCL 1.1レベルなので,実用性はあまり高くないようです。

$ clinfo 
Number of platforms                               1
  Platform Name                                   Clover
  Platform Vendor                                 Mesa
  Platform Version                                OpenCL 1.1 Mesa 21.1.8
  Platform Profile                                FULL_PROFILE
  Platform Extensions                             cl_khr_icd
  Platform Extensions function suffix             MESA
...

Mesaの提供するドライバ

最後にMesaが提供するGPU用ドライバを眺めておきましょう。実際にGPUを操作するのは/usr/lib/dri以下にインストールされる以下のファイルになります。

 9  usr/lib/dri/
10  usr/lib/dri/i915_dri.so
11  usr/lib/dri/i965_dri.so
12  usr/lib/dri/radeon_dri.so
13  usr/lib/dri/r200_dri.so
14  usr/lib/dri/nouveau_vieux_dri.so
15  usr/lib/dri/radeonsi_dri.so
16  usr/lib/dri/nouveau_dri.so
17  usr/lib/dri/swrast_dri.so
18  usr/lib/dri/kms_swrast_dri.so
19  usr/lib/dri/iris_dri.so
20  usr/lib/dri/r300_dri.so
21  usr/lib/dri/r600_dri.so
22  usr/lib/dri/vmwgfx_dri.so
23  usr/lib/dri/virtio_gpu_dri.so
24  usr/lib/dri/zink_dri.so

Mesaでは,当初はそれぞれのGPUごとにドライバを開発していたものの,2010年ごろからGalliumという3Dグラフィックス・ドライバ用のフレームワークを採用し,新しいドライバはこのフレームワークを用いて開発するようになりました。上記リストのうち,i915,i965,nouveau_vieux,r200,radeonが古いタイプのドライバでiris,nouveau,r300,r600,radeonsiが新しいタイプのドライバになります。

i915/i965/irisはIntel用,nouveau_vieux/nouveauはNVIDIA用,r200/r300/r600/radeon/radeonsiはAMD用のドライバです。ちなみに"vieux"はフランス語で「古い」⁠老いた」という意味だそうです。

swrastはGPUを使わずソフトウェア的に処理を行うドライバで,対応するGPUが無い場合も利用可能なものの,処理速度は遅く実用的では無いようです。kms_swrastはカーネルのモードセット機能を利用するソフトウェア・ドライバのようですが,詳細はよく分りません。

解説文書等によると「Galliumフレームワークで必要なメモリ割り当ての機能をKMSを使って実現したドライバ」ということですがswrastとの違いは判然としません。

その他,vmwgfxはVMware,virtio_gpuはQemu,それぞれの仮想環境からホスト側のGPUを利用するためのドライバです。zinkは少し毛色が違っていて,OpenGLの機能をVulkanで実現するためのドライバだそうです。

Plamoではビルドしていませんが,OpenGLの機能をMS WindowsのDirectx12環境で実現するためのd3d12というドライバも開発されています。

Mesaでは,先に紹介した各機能用のライブラリが,これらGPU用のドライバと連携しながらCPUとGPUを自在に扱う複雑な処理を実現しています。


ざっとMesa3Dライブラリがインストールするファイル類を眺めてきた上で,改めて/usr/lib/dri/以下を調べてみると,興味深いことに気づきました。

$ ls -l /usr/lib/dri | grep -v video
合計 412,438,528
-rwxr-xr-x  5 root root 18,151,368  9月 12日  20:37 i915_dri.so*
-rwxr-xr-x  5 root root 18,151,368  9月 12日  20:37 i965_dri.so*
-rwxr-xr-x 10 root root 27,509,592  9月 12日  20:37 iris_dri.so*
-rwxr-xr-x 10 root root 27,509,592  9月 12日  20:37 kms_swrast_dri.so*
-rwxr-xr-x 10 root root 27,509,592  9月 12日  20:37 nouveau_dri.so*
-rwxr-xr-x  5 root root 18,151,368  9月 12日  20:37 nouveau_vieux_dri.so*
-rwxr-xr-x  5 root root 18,151,368  9月 12日  20:37 r200_dri.so*
-rwxr-xr-x 10 root root 27,509,592  9月 12日  20:37 r300_dri.so*
-rwxr-xr-x 10 root root 27,509,592  9月 12日  20:37 r600_dri.so*
-rwxr-xr-x  5 root root 18,151,368  9月 12日  20:37 radeon_dri.so*
-rwxr-xr-x 10 root root 27,509,592  9月 12日  20:37 radeonsi_dri.so*
-rwxr-xr-x 10 root root 27,509,592  9月 12日  20:37 swrast_dri.so*
-rwxr-xr-x 10 root root 27,509,592  9月 12日  20:37 virtio_gpu_dri.so*
-rwxr-xr-x 10 root root 27,509,592  9月 12日  20:37 vmwgfx_dri.so*
-rwxr-xr-x 10 root root 27,509,592  9月 12日  20:37 zink_dri.so*

ファイル名等は先に紹介した通りなものの,ファイルサイズを見てみると18MBと27MBしかなく,リンクカウントもそれぞれ5と10になっています。これはすなわち,Mesaが提供しているGPU用のドライバはいろいろな名称でインストールされてはいるものの,古い世代とGalliumを使う新しい世代の2種しかなく,同じドライバでAMDやIntel,NVIDIAのGPUに対応していることを示します。

GPUもCPUと同じく機械語しか理解できませんし,x86の機械語がARMの機械語と全く異なっているように,GPUの機械語もメーカごとに異なっているから,⁠Gallium3Dフレームワーク」を使っていると言っても,ドライバの一番下のレイヤには各GPU用のコードを生成するためのハードウェア依存部分があるはず,と思いこんでいた筆者には,これはちょっとした驚きでした。

このあたり,Mesaの付属ドキュメントは古いままのものが多く,新しい情報はReleaseNotesやソースコードを調べるしか無さそうなので,また時間のある時にでも調査してみようと思っています。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html