2015/06/16

メリットは?性能は? xf86-video-atiドライバ(Radeon系)でDRI3を有効にする

“xf86-video-ati” のドライバがDRI3に開発版で2015年3月に対応しており、GNU/LinuxでAMDのGPUやAPUを自由なソフトウェアのグラフィックドライバで使用している場合にこれが利用できるようになっている。

“xf86-video-ati” ドライバの2015年夏時点での最新バージョンは7.5.0でその後は正式リリース版が出ていなかったため、開発版を使用する必要があった(バージョン7.6.0以上で対応)。

Ubuntuでは “ppa:oibaf/graphics-drivers” のPPAリポジトリにある “xserver-xorg-video-ati” パッケージが(DRI3対応後の)その開発版となっており、本記事公開時、手元の環境ではこのソースパッケージを自分でビルドしたものを使用した。

(2016/4/29)Ubuntu 15.10からはディストリのパッケージがDRI3に対応するバージョンになっている。
  1. 他のソフトウェア要件
  2. ドライバの設定
  3. メリット
  4. 3D処理の性能の変化について
    1. glmark2
    2. glxgears

他のソフトウェア要件

2015年に公開されたバージョンのディストリであればカーネルやXサーバ,Mesaライブラリのバージョンは十分となっている。

DRI3の仕様(プロトコル)は2013年11月に正式バージョンとして公開されており、同年12月に公開されたxorg-server 1.15がDRI3に対応する初めてのXサーバとなった。

カーネルのバージョンとしては、DRI3で用いられる “DMAバッファ共有” のAPIがLinux 3.3以上でのみ利用可となっているが

[引用]http://keithp.com/blogs/dri3_extension/ より
There have been some recent DMA-BUF related fixes in the kernel, so you’ll need to run the latest 3.9.x stable release or a 3.10 release candidate.

ともあり、引用元記事の書かれた2013年6月時点では3.9系(の最新版)か3.10系以上で動かすことが求められているが、xorg-server 1.15の公開時点の最新カーネルである3.12系(2013年11月公開)以上であればある程度古い環境でも動作する可能性は高いと思われる。

Mesaのバージョンとしては10.1系(2014年3月公開)からDRI3に対応しており、DRI3サポートは既定で有効になっている(ディストリのパッケージとしても基本的に有効になっている)。

ドライバの設定

2015年夏時点では(ドライバの設定として)DRI3は既定では無効になっているため、Xサーバの設定ファイルでこれを有効にするための記述を追加する必要がある。

/etc/X11/xorg.confが存在する環境ではその中のグラフィックドライバのセクションに “Option "DRI" "[3[1] もしくは 2[2]]"” の記述を追加することになり、手元のUbuntuではこのファイルが存在しないので新しくファイルを記述することになったのだが、/usr/share/X11/xorg.conf.d/というディレクトリに設定ファイルの一部のような内容のファイル群があることに気付いたので、次のようなファイルを作成して一度GUI環境から抜けたところ、無事に設定が読み込まれてDRI3が有効になった。

[管理者][任意]ファイル名:/usr/share/X11/xorg.conf.d/99-radeon-dri3.conf
Section "Device"
 Driver "radeon"
 Identifier "Card0"
 Option "DRI" "3"
EndSection
(2016/4/29)オプションの指定の形を新しい形式に修正

/etc/X11/xorg.conf.d/ディレクトリのあるディストリではそのディレクトリの中に.confファイルを配置する。

DRI3が正常に有効になると/var/log/Xorg.0.log

(**) RADEON(0): DRI3 enabled

という行が出力される。

もちろん、将来のバージョンでは既定で有効になるものと思われ、その際は本記事で扱っているような設定変更は必要なくなる。

メリット

DRI3では、従来のDRI2と比較して

  • ウィンドウのサイズ変更処理を改善
  • レンダリングの同期を改善
  • セキュリティをやや改善

といったメリットを受けることができる。処理性能については後述する。

3D処理の性能の変化について

プログラムによっては3D処理のベンチマークの結果などがDRI2と比べて大幅に良くなる。DRI3ではDRI2と比べて3D処理を行うプログラムとXサーバのCPU使用率が上がることがあり、[3]数字が上がるのはその関係かもしれない。つまり、DRI2ではどこかにネックになるところがあってCPUがうまく使われずに性能が出しきれていなかったのが解消されたように見える。

しかし、残念ながら、手元の環境(CPU:Athlon II X3 445, GPU:Radeon HD 4200)では全体的に見て体感的にはゲームも含め大きな差は感じられない。[4]

なお、DRI3はDRI2の持つ制約・問題点に対処することを目指して作られており、動作速度の向上を最大の目的としているわけではないが

[引用]https://lwn.net/Articles/569701/ より
In fact, performance is a lot better because the Present extension is more efficient than DRI2 in swapping buffers.

DRI3とともにバッファ交換で用いられる “Present” というX拡張はDRI2よりも効率的に動作するためパフォーマンスが向上するともされている。

glmark2

DRI2とDRI3の結果を並べて貼り付ける。結果はCPUのクロックを最大にしたときの動作。

(DRI2)
$ glmark2
=======================================================
    glmark2 2014.03
=======================================================
    OpenGL Information
    GL_VENDOR:     X.Org
    GL_RENDERER:   Gallium 0.4 on AMD RS880
    GL_VERSION:    3.0 Mesa 10.7.0-devel
=======================================================
[build] use-vbo=false: FPS: 347 FrameTime: 2.882 ms
[build] use-vbo=true: FPS: 365 FrameTime: 2.740 ms
[texture] texture-filter=nearest: FPS: 323 FrameTime: 3.096 ms
[texture] texture-filter=linear: FPS: 321 FrameTime: 3.115 ms
[texture] texture-filter=mipmap: FPS: 335 FrameTime: 2.985 ms
[shading] shading=gouraud: FPS: 298 FrameTime: 3.356 ms
[shading] shading=blinn-phong-inf: FPS: 298 FrameTime: 3.356 ms
[shading] shading=phong: FPS: 271 FrameTime: 3.690 ms
[shading] shading=cel: FPS: 242 FrameTime: 4.132 ms
[bump] bump-render=high-poly: FPS: 237 FrameTime: 4.219 ms
[bump] bump-render=normals: FPS: 357 FrameTime: 2.801 ms
[bump] bump-render=height: FPS: 352 FrameTime: 2.841 ms
[effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 238 FrameTime: 4.202 ms
[effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 120 FrameTime: 8.333 ms
[pulsar] light=false:quads=5:texture=false: FPS: 292 FrameTime: 3.425 ms
[desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 120 FrameTime: 8.333 ms
[desktop] effect=shadow:windows=4: FPS: 177 FrameTime: 5.650 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 120 FrameTime: 8.333 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 177 FrameTime: 5.650 ms
[buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 120 FrameTime: 8.333 ms
[ideas] speed=duration: FPS: 206 FrameTime: 4.854 ms
[jellyfish] : FPS: 155 FrameTime: 6.452 ms
[terrain] : FPS: 29 FrameTime: 34.483 ms
[shadow] : FPS: 120 FrameTime: 8.333 ms
[refract] : FPS: 43 FrameTime: 23.256 ms
[conditionals] fragment-steps=0:vertex-steps=0: FPS: 337 FrameTime: 2.967 ms
[conditionals] fragment-steps=5:vertex-steps=0: FPS: 239 FrameTime: 4.184 ms
[conditionals] fragment-steps=0:vertex-steps=5: FPS: 335 FrameTime: 2.985 ms
[function] fragment-complexity=low:fragment-steps=5: FPS: 290 FrameTime: 3.448 ms
[function] fragment-complexity=medium:fragment-steps=5: FPS: 179 FrameTime: 5.587 ms
[loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 289 FrameTime: 3.460 ms
[loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 289 FrameTime: 3.460 ms
[loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 120 FrameTime: 8.333 ms
=======================================================
                                  glmark2 Score: 234
=======================================================

(DRI3)
$ glmark2
=======================================================
    glmark2 2014.03
=======================================================
    OpenGL Information
    GL_VENDOR:     X.Org
    GL_RENDERER:   Gallium 0.4 on AMD RS880
    GL_VERSION:    3.0 Mesa 10.7.0-devel
=======================================================
[build] use-vbo=false: FPS: 663 FrameTime: 1.508 ms
[build] use-vbo=true: FPS: 755 FrameTime: 1.325 ms
[texture] texture-filter=nearest: FPS: 657 FrameTime: 1.522 ms
[texture] texture-filter=linear: FPS: 648 FrameTime: 1.543 ms
[texture] texture-filter=mipmap: FPS: 665 FrameTime: 1.504 ms
[shading] shading=gouraud: FPS: 590 FrameTime: 1.695 ms
[shading] shading=blinn-phong-inf: FPS: 589 FrameTime: 1.698 ms
[shading] shading=phong: FPS: 497 FrameTime: 2.012 ms
[shading] shading=cel: FPS: 461 FrameTime: 2.169 ms
[bump] bump-render=high-poly: FPS: 421 FrameTime: 2.375 ms
[bump] bump-render=normals: FPS: 717 FrameTime: 1.395 ms
[bump] bump-render=height: FPS: 654 FrameTime: 1.529 ms
[effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 424 FrameTime: 2.358 ms
[effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 187 FrameTime: 5.348 ms
[pulsar] light=false:quads=5:texture=false: FPS: 571 FrameTime: 1.751 ms
[desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 179 FrameTime: 5.587 ms
[desktop] effect=shadow:windows=4: FPS: 291 FrameTime: 3.436 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 190 FrameTime: 5.263 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 231 FrameTime: 4.329 ms
[buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 220 FrameTime: 4.545 ms
[ideas] speed=duration: FPS: 373 FrameTime: 2.681 ms
[jellyfish] : FPS: 266 FrameTime: 3.759 ms
[terrain] : FPS: 32 FrameTime: 31.250 ms
[shadow] : FPS: 233 FrameTime: 4.292 ms
[refract] : FPS: 48 FrameTime: 20.833 ms
[conditionals] fragment-steps=0:vertex-steps=0: FPS: 650 FrameTime: 1.538 ms
[conditionals] fragment-steps=5:vertex-steps=0: FPS: 430 FrameTime: 2.326 ms
[conditionals] fragment-steps=0:vertex-steps=5: FPS: 651 FrameTime: 1.536 ms
[function] fragment-complexity=low:fragment-steps=5: FPS: 503 FrameTime: 1.988 ms
[function] fragment-complexity=medium:fragment-steps=5: FPS: 333 FrameTime: 3.003 ms
[loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 497 FrameTime: 2.012 ms
[loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 497 FrameTime: 2.012 ms
[loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 220 FrameTime: 4.545 ms
=======================================================
                                  glmark2 Score: 434
=======================================================

glxgears

glxgearsは厳密には性能を計測するベンチマークではない[5]ためあまり参考にはならないかもしれないが、これを手元の環境で動かしたときに表示されるフレームレートはDRI2では最大(CPUクロックを最大にしたとき)で1,000fps程度だったのが1,750fps以上になっている。以前AMDのCatalyst(fglrx)ドライバを使用していたときには3,000fps程度だった記憶がある[6]が、そのときも(DRI3と同様に)CPU使用率は高くなっていた。

glxgearsは特に指定をせずに実行するとモニタのリフレッシュレートの値がフレームレートとして表示されるため、下のファイルを作成するか

ファイル名:[ホームディレクトリ]/.drirc

<driconf>
 <device screen="0" driver="dri2">
  <application name="glxgears" executable="glxgears">
   <option name="vblank_mode" value="0" />
  </application>
 </device>
</driconf>

もしくは環境変数vblank_modeを “0” にして

$ vblank_mode=0 glxgears

として実行する。

使用したバージョン:
  • Linux 3.19
  • xorg-server 1.17.1
  • xf86-video-ati 2015/6/11, 7.7.0
  • Mesa(iXit) 2015/5/25
  • glmark2 2014.03
  • mesa-utils 8.2.0
[1]: DRI3を使用する場合
[2]: DRI2を使用する場合
[3]: 例えば、手元の環境でglxgearsを動かしたときにglxgearsのCPU使用率が60%弱だったのが103%前後になり、XサーバのCPU使用率は35%弱だったのが60%前後になった
[4]: もちろん、体感的に差を実感できるプログラムがある可能性はあり、差が出ないと断言するものでもない
[5]: 非常に限られた機能しか用いていないことなどから、性能を示す有用な結果は得られず、ベンチマークと位置付けられるものとは言えない
[6]: ただ、Catalystドライバとはドライバの構造自体が大きく異なることなどもあり、この1,750と3,000という数値を比較することに意味はない