2013年10月のRadeon Rシリーズ発表時から、AMDがことあるごとに「目玉」として紹介してきたグラフィックスAPI「Mantle」。ようやく対応ソフトウェアとドライバがそろったので、あらためておさらいと性能評価をしておきたい。

AMDが昨年10月にその存在を明らかにしたMantle API。GCNアーキテクチャに対応しており、ゲームタイトルとしてはBattlefield 4がこれにあわせて作りこまれていることが明らかにされていた。

そのBattlefield 4は2013年中に発売されたものの、当初は通常版のみでMantleに対応したバージョンは2013年末の登場とアナウンスされていた。その後、リリースが一度延期になった後、1月末にUpdateの形でMantle対応Battlefield 4は無事に公開された。あとはAMDのドライバ公開を待つという状況だったが、こちらも2月1日(米国時間)に無事公開された。ということで、性能評価を行っておきたい。

そもそもMantleとは?

その前におさらいとして簡単に「Mantle」を解説したい。端的にいってしまえば、Mantleとは「ゲームエンジン用の」新APIである。「ゲーム用の」とならないのは、最近の3Dゲームのほとんどがゲームエンジンをベースに作りこまれているから。

Direct3D→Mantleの移行は(AMDの説明はともかくとして)決して楽ではない。なので、個別のゲームがいちいちMantleに対応するというよりは、ゲームエンジンがMantleに対応すれば(もちろんこれにも相応の時間が必要)、そのエンジンを使ったゲーム全部がMantle対応になるわけで、少なくともAMDはこの方向で進めたいようだ。

ではDirect3DからMantleに移行すべき理由とは何か? といえば、もっぱらDirect3Dに起因するCPUボトルネックを解消し、もっと細かくグラフィック性能を引き出したいという点にある(Photo01)。

Photo01:ここから暫くは、昨年11月に開催されたAPU13におけるMantleセッションからのスライドとなる。目的は極めて明快

Direct3Dにおいては"Batch"と呼ばれる概念がある。これは複数の描画命令をまとめたコマンドリストの様なものである。3D GameにおいてはこのBatchを延々と発行する訳だが、最近のトレンドは「少ないもので」3000~5000ほどのコマンドが入ったBatchが1枚の描画に発行されることになる(Photo02)。これが複雑なゲームだと10万のオーダー(Photo03)である。Mantleはこれを一桁引き上げるのが目的だ(Photo04)。

Photo02:DirectX 9ベースの軽いプログラムとかがこの範疇

Photo03:Battlefield 3クラスだとこれよりもうチョイ少ないらしいが

Photo04:このクラスのBatchは、後述の理由で現時点では事実上実現不能(というか、まともなフレームレートが出ない)

次に既存のDirect3Dでは何が問題になっているのか? というのがこちら(Photo05)。最初はAPI overheadの問題。これは既存のDirect3Dの描画パイプラインがSingle Streamで構成されているのでパフォーマンスが上がりにくいということだ(Photo06)。実をいえばこの問題はずっと昔から広く知られていた。

Photo05:要するにDirect3Dだとハードウェアが完全に遮蔽されており、しかも昔の水準のハードウェアを想定した作りになっているので性能が出ないという話

Photo06:パイプライン化はされているが、基本Single Threadだからそんなに性能が上がるわけではない

Photo07はBatch Sizeと描画時間の関係を示したものだが、まずはGPU Overhead、ついでCPU Overheadがかかり、これを超えたBatch Sizeになると後は描画性能そのものがフレームレートを既定するという。

Photo07:これは2004年のMeltdownにおける"The CPU Aspect of the D3D Pipeline"(Brian Klamik, Software Design Engineer, Direct3D Core, Microsoft)というプレゼンテーションより

で、昨今はあまりにBatch sizeが大きくなりすぎた結果、CPU Overheadにあたる部分が強烈に大きくなってしまった訳だ。2004年当時でも「んじゃどうするか」について「とにかく性能を測定して、あとはBatch size(≒画面の複雑さ)とSpeedのトレードオフだ」とされているが、CPUの性能改善をはるかに上回る勢いでGPU性能が向上した結果、もう小手先のチューニングではどうにもならないところまで来てしまった、という事である。

2つ目の問題もこれに起因しているのだが、まだThreadingが一般的でなかった時代からなので、Photo08のような構図にするのは不可能である。GPU側でGraphics/Compute/DMAに対して個別にアクセスできる訳ではないから、どこかで全要求をまとめてシーケンシャルにリクエストを出す必要があり、これは当然オーバーヘッド増加となる。

Photo08:これはMantleで実現可能となる構造を説明したもの

3つ目の問題はメモリ管理の話。DirectX 11では仮想グラフィックデバイスがサポートされたが、これはいわゆるハードウェア仮想化からはやや遠い実装である。MantleではCPUとGPUどちらのメモリも仮想アドレスでアプリケーションから扱える様にする実装がなされている(Photo09)。

Photo09:これを実現するために、GPU側のPage Tableを"Hacking"する仕組みがMantleに実装された

最後がマルチデバイスの問題。マルチGPUの環境では、例えばSLIにせよCrossFireにしろドライバ側でハンドリングしており、アプリケーションでは1つのGPUデバイスに見える。が、実際には「速度よりも画面解像度」という要求がゲーム側で出てくる場合もある訳で、こうした場合のハンドリングがDirect3Dでは十分とはいえなかった。Mantleではこうした複数のデバイスを直接アプリケーションからコントロールできるようになっている(Photo10)。

Photo10:Mantleだと、例えばGPU性能に応じて処理を変えるなんてことも容易に可能になる

ちなみにMantleはいまのところ、AMDのGCNアーキテクチャをベースに開発し、Specificationも公開されていない。ただ、AMDはこれを独自規格にするつもりはなく、仕様が固まったら公開するとしている。

なので、純粋に技術的に可能かどうかで言えばIntelとかNVIDIAでもMantleを使う事ができる(当然ながらこれらのベンダーがMantle対応ドライバを提供する必要があるが)としている。またGCN以前のVILW4やVILW5アーキテクチャでも対応そのものも技術的に可能という話で、あとはマーケットの規模とサポートコストを秤に掛けて決めることになるだろうとのことだった。

ということで簡単にMantleの特徴を説明したが、要するにこれまでDirect3Dに任せざるを得なかった部分を全部自分で管理できるのがMantleの利点であり、Direct3Dの制限を逃げるためのTweakingとかチューニングの手間がだいぶ省ける事になる。

ただ逆に言えば、これまでDirect3D任せにできた部分を全部自分でやらざるを得ないという意味であり、開発工数そのものは増える可能性がある。冒頭でMantleがゲームエンジン用APIと書いたのはこのあたりが関係している。

Mantleを採用する事による開発工数の増分は、ゲーム1本で回収するのは難しいように思える。が、ゲームエンジンでの採用であれば相対的に工数の増分は少ないし、むしろ複数のゲームでまとめて性能が上がれば、個別のチューニングの手間が省ける分むしろ効果的とも言えるからだ。

あともう一つ。要するにMantleはオーバーヘッドを減らすためのAPIであり、GPU性能を引き上げられるAPIではない。なので、既にGPUがフルに動いているシーンでの性能改善は0である。あくまでもオーバーヘッドの関係でGPUが遊んでいるようなシーンで性能が改善できるという以上のものではない。

ベンチ環境

ではお待ちかねのベンチマーク編。まず環境は表1の通りである。基本はRADEON R9 290Xのベンチと同じハードウェア環境で、ビデオカードとしてはZOTACのZTGTX770-2GD5R01(GeForce GTX 770だが若干定格よりオーバークロック気味)、INNO3D N780-1DDN-L5H5(GeForce GTX 780の定格モデル)、およびSAPPHIRE HD7970 3G GDDR5(RADEON HD 7970の定格モデル、ちなみにGHz Edition「ではない」)の3枚である。

■表1 今回のテスト環境その1
CPU Intel Core i7-4770K
M/B Intel DZ87KLT-75K
BIOS KLZ8711D.86A
Driver Inf Driver 9.4.0.1017
Memory XMP-1866 CL10 16GB (Corsair VENGEANCE CMZ16GX3M2A1866C10 8GB×2)
Graphics ZOTAC ZTGTX770-2GD5R01 INNO3D N780-1DDN-L5H5 SAPPHIRE HD7970 3G GDDR5
Graphics Driver GeForce Driver 334.67 Beta Catalyst 14.1 v1.6 Beta
Storage Intel SSD520 128GB(System) + HGST HDP725050GLA360 500GB(Data)
OS Windows 7 Ultimate 64bit 日本語版+SP1

冷静に考えれば明らかにRADEON HD 7970が不利な構成だが、Mantleでこれがどれだけ挽回できるのかを確認するには適切かと思う。あと、それとは別に表2に示す通り、Kaveriのプラットフォームで内蔵GPUを使っての比較も行った。こちらはKaveriのベンチマークのハードウェア環境そのままで、唯一ドライバだけを更新している。

■表2 今回のテスト環境その2
APU A10-7850K
M/B ASUSTeK A88XM-A
BIOS BIOS 1003
Driver Catalyst 14.1 v1.6 Beta
Graphics 内蔵
Memory XMP-1866 CL10 16GB (Corsair VENGEANCE CMZ16GX3M2A1866C10 8GB×2)
※DDR3-1600 CL10動作
Storage Intel SSD520 128GB(System) + HGST HDP725050GLA360 500GB(Data)
OS Windows 7 Ultimate 64bit 日本語版+SP1

ちなみにドライバは、AMD向けは前述の通りCatalyst 14.1 v1.6 Beta(Photo11)、NVIDIAの方はGeForce 334.67 Betaを使っている。テスト時点でのWHQLドライバはGeForce 332.21であるが、なぜかこれを使ったらBattlefield 3/4共に起動しなかったための措置である。

Photo11:詳細バージョンはこんな感じ。ちなみにCatalyst Control CenterにはMantle対応を伺わせるものは特に無かった

ちなみに以下グラフの表記であるが

  • GTX 770:Haswell+ZOTAC ZTGTX770-2GD5R01
  • GTX 780:Haswell+INNO3D N780-1DDN-L5H5
  • HD 7970 D3D:Haswell+SAPPHIRE HD7970 3G GDDR5(Direct3D)
  • HD 7970 Mantle:Haswell+SAPPHIRE HD7970 3G GDDR5(Mantle)

としている。