UXAとかEXAとか

 自宅のPCではUbuntuを使ってるんだけど、2月ぐらいにjauntyでapt-get upgradeしたら、外部ディスプレイ出力ができなくなった。その時は8.10をインストールしなおすという荒技に出たのだけれど、9.04も正式リリースされたし、そろそろもう一度トライしてみたい。
 しかし、何の知識もなしにアップグレードに失敗してまた8.10をインストールし直すというのも芸が無いので、知識を蓄えるべくちょっと調べてみた。
 使っているPCはMacbookで、intelの945GMが載っている。どうもintel用のグラフィックドライバは8.10と9.04で全然違うらしい。UXAという新しいアクセラレーションアーキテクチャがあって、しかもそれがトラブったりトラブらなかったりするみたいなので、ここら辺を中心に今の状況を少し調べてみた。
 まず、X Window Systemの2Dアクセラレーションアーキテクチャとして、昔はXAAというのがあったのだけれど、これはもう古く、現代的な使われ方ではミスマッチなところがある。(アーキテクチャ自体が複雑だとか、Core Text APIはもうほとんど使われてないからアクセラレートできても使われないとか。)
 で、現代的な2Dアクセラレーションアーキテクチャとして、EXAが作られた。EXAはfill, blit, composite程度のグラフィック操作しかアクセラレートしないが、2Dアクセラレーションにはこれで十分である。細々としたパーツやら文字やらはGUIライブラリが全部CPUでPixmapに描画するので、後はそれを高速にビデオメモリに転送する事とGPUで適切にcompositeする事ができればよい。
 さて、EXAで問題が解決したなら、なぜUXAが出てきたのか。いまいちはっきりとわかってはないので、ここから少し推測を交えることになる。
 まず、EXAにはビデオメモリとメインメモリの間でスラッシングが起きるという問題がある。ビデオメモリとメインメモリの間でpixmapデータを転送するのはすごく遅い。Emulating the future of the i965 driver にそのような事が書かれている。また、Sharpening the Intel Driver Focusにもwhen to move data between virtual memory and graphics memoryが問題であると書かれている。
 なぜスラッシングが起きるのか。ビデオメモリはシステムメモリよりも少ないので、メモリが足りなくなるとデータをメインメモリに退避してくる必要がある。メインメモリの空きが足りなくなるとHDDへのスワップが始まって、ひどい時にはスラッシングが始まるが、あれとまったく同じ現象だ。UMA(Unified Memory Architecture, 専用ビデオメモリを持たない低コストのVGAで使われる方式)だとビデオメモリ=メインメモリなんだからこんな問題は起こらないと思うかもしれないけれど、ビデオメモリとして使う領域はポンポン変えられるものではないだろうから、この事情は変わらないはず。
 さて、次に話をUXAに移す。UXAはintelの人々が新しく開発したアクセラレーションアーキテクチャである。UXAはEXAと違ってスラッシングの問題が無い。なぜスラッシングがなくせるのか?
 これはアルゴリズムの違いで、UXAではすべてのデータはまずメインメモリ上に確保して、グラフィックメモリはキャッシュみたいなもんだと思っている。こうすれば、グラフィックメモリに大量にデータを置いておく必要がなくなるので、スラッシングは発生しなくなる。明確にそうだと書いてる文章が見つからないのでここのロジックが一番自信が無いところだけど、論理を積み上げていくとそういう理屈になると思う。
 UXAのやり方だと、通常時のデータの転送量が増えてしまうというデメリットがあるが、2Dのアクセラレーション如きではそれほど膨大な帯域は要求されないので問題ない、という割り切りなのだろうと思う。なお、EXAではデータをいつ転送するか、いくつかやり方があって、設定ファイルで変えられる。
 こう考えると、当初はUXAは一時的な物でEXAにマージされる予定だったのに、現状ではマージされない事になった点について理屈をつけられなくはない。NVidiaAMDが出しているようなDiscrete VGAチップだと、ビデオメモリのサイズが512MBとか1GBとか大きくなってくるのでスラッシングは基本的に発生しない。だから、わざわざシステムメモリに重複した内容を持つのはMOTTAINAI、ということではなかろうか。
 なお、UXAとEXAの違いはGEM(ビデオメモリ管理用のカーネル内モジュール)を使っているかどうかではない。実は調べ始めた最初はUXAがなんなのか理解できなくて混乱していた。"UXA simply skips the parts of EXA which are not necessary in a GEM world"とあるのでUXA = EXA + GEM と思いきや、同じ記事にTODOとして"to get UXA running without GEM so that we have EXA-like performance on older kernels"と挙げられていたりしたので。GEMは現在のUXAには必須なのでよく一緒の文脈で出てくるが、本質的にはEXAとUXAの違いには関係しない。UXAのもっとも大きなEXAとの違いはスラッシング対策のやり方、より正確にはデータの持ち方である。(しつこいけど、推測が正しければ。)
 ここまでをまとめてみる。EXAはビデオメモリとメインメモリの間のデータ転送でスラッシングが発生する事がある。一般的にメモリが不足している場合にスラッシングを防ぐ事が難しいのと同様、ビデオメモリとメインメモリのスラッシングを防ぐことも難しい。UXAではデータは全部メインメモリに置く(ビデオメモリはキャッシュみたいなものとして扱う)ことでスラッシングを防いだが、代償としてメモリがちょっと無駄になる。
 外部ディスプレイがどうなっているのかは全然分からなかったけれど、もう今日は疲れたのでこれでおしまい。