イベント
AMD独自グラフィックスAPI「Mantle」の詳細が明らかに。理論上はGeForceのMantle対応も可能!?
Mantleの存在が明らかになった2013年9月の時点では,「Mantleがどのような仕組みでアプリケーションの高速化を実現しようとしているのか」という,肝心の部分は説明されなかった。APU13でようやくその部分に光が当たったので,本稿ではセッションの内容を基に,Mantleの実態を明らかにしていきたい。
GPUの機能を直接操作するMantle
ただし,ご利用は計画的に?
現状のMantleは,PlayStation 4(以下,PS4)やXbox Oneなど,新世代ゲーム機に採用されたGCNアーキテクチャをターゲットにして,現在のGPUが持つ機能を,的確かつ直接的に操作するグラフィックスプログラミングAPI(GPUプログラミングAPI)として設計されているという。
アプリケーションがGPUをほぼ直接と言っていいレベルで駆動させたり,各種リソースマネージメントも担当したりすることになるので,現在のDirectXやOpenGLに比べると,非常にローレベルなAPIとなるわけだ。
しかし,「ハードウェアの抽象化レイヤーがなくなるわけではない」とも,Riguer氏は述べる。それゆえにNVIDIAなどの競合GPUメーカーが“Mantleの仕組み”に参加することも「技術的には可能」(Riguer氏)だそうだ。これはなかなか驚くべき発言である。
ハードウェアを抽象化したGPUプログラミングAPIとなると,「だったら,DirectXやOpenGLと何が違うのか?」という疑問は当然湧いてくる。この点について氏は,MantleがDirectXやOpenGLを全面的に置き換えるものではないとしたうえで,「特定の3Dグラフィックスプログラミングシーンにのみ使うべきもの」だとしている。
では,Mantleはどういうシーンで有効になるのか。Riguer氏は3つの例を挙げて説明した。
2つめは,「グラフィックスプログラミングに関わるすべての要素を,アプリケーション側で直接管理したい」場合だ。詳細は後述するが,Mantleでは,GPUのコマンドバッファもアプリケーション側で管理する必要があり,「描画に必要なデータとパラメータを用意して,APIを呼び出せば一発で描画」とはいかない。Mantleの活用には,3Dグラフィックスパイプラインへの深い理解が必要なのである。
最後の3つめは,「そのアプリケーションを,GCNベースのGPU環境でマルチプラットフォーム展開したい」場合になる。要するに,GCNベースのGPUを採用するPS4やXbox One用のゲームを,同じGCNベースの別の機種やPCへ移植したいという状況だ。NVIDIA製GPUやIntelの統合型グラフィックス機能にも対応する必要があるなら,二度手間になるだけなので,Mantleは使わないほうがよい。
「Small Batch問題」を例にした
Mantleによる高速化の事例
Riguer氏は「1時間足らずのセッションでは語り尽くせない」と笑いながら,分かりやすい事例として「Small Batch問題の解決」を例に挙げて解説した。
たとえば,草原のシーンを描画するために,草モデルを1万本描画する必要があると考えよう。その場合,「草モデルの描画を1万回実行する」というのが,ごく普通の発想だ。しかし,これを従来のDirectXやOpenGLで処理しようとすると,最悪の場合,GPUに対して,以下のように大量の処理が発生してしまう可能性がある。
- 1万回分の草モデルをGPUに転送する
- 1万回分の描画コマンドを生成する
- グラフィックスドライバが描画コマンドを,GPU固有のコマンドに1万回翻訳して命令を発行する
大量の処理が発生するとそこにオーバーヘッドが生じ,全体の性能に負の影響を及ぼすことになるが,このような「小規模描画の大量処理」による問題を,専門用語では「Small Batch」(スモールバッチ)問題という。
GPUとDirectXに詳しい人なら,「それって,ジオメトリインスタンシングで解決できないか?」と気付くかもしれない。たしかに,DirectX 9.0cで導入されたジオメトリインスタンシングという機能を使うと,上の1.で挙げた「1万回分の草モデルの転送」は1回で済ませられる。しかし,2.と3.は解決できない。
DirectXを使うゲームタイトルではそのため,「草モデルを1万回描画」するのではなく,「1万本の草を1回描画」するように,処理形態を変えて,対策している。こうした処理を「ジオメトリ統合」(Geometric Consolidation)などと呼んだりするが,実際にはゲームロジックとの兼ね合いもあるので,いつもこの手でうまくいくとは限らない。
そもそも,こうした描画の最適化に頭を悩ませなくてはならないのは,ゲーム開発者としては不本意であろう。
Riguer氏によれば,近年の平均的なPCゲームの場合,ジオメトリ統合の最適化を行っていたとしても,1フレームあたり3000〜5000個のSmall Batchが生じているという。とくにグラフィックスヘビーなゲームになると,1フレームあたり1万個前後に達する場合もあるそうだ。
だが,Mantleを活用するゲームでは,1フレームあたり10万個のSmall Batchに相当する処理があっても,性能面で影響は出ないという。
グラフィックスヘビーなDirectXベースのゲームでは,1フレームあたり1万個ものSmall Batchが生じている(左)が,Mantleを使うなら,10万個分の処理でも性能低下を生じないという(右) |
現在のGPUプログラミングモデルでは,GPU内の各種機能をアプリケーションが使う場合,アプリケーション側がコマンドを発行すると,それがコマンドバッファにいったん蓄積される。そして,溜め込まれたコマンドは,GPUに順次発行される。それを受けてGPUが処理をするという流れだ。Mantleでもそれは変わらない。
DirectXやOpenGLの場合,このコマンドバッファの生成や描画コマンドの蓄積,その実行管理を担当するのは,DirectXやOpenGL,そしてGPUデバイスドライバであり,アプリケーションが直接手がける処理ではなかった。たとえばマルチコアCPU環境では,「各コマンドバッファに対する操作が,どのCPUが処理するスレッドに割り当てられているか,アプリケーションからは分からない」という,ブラックボックスとなっている。
しかしMantle――というか,Mantle対応アプリケーション――の場合は,いま挙げたコマンドバッファの生成や描画コマンドの蓄積,その実行管理のすべてを,アプリケーション側で担当できるようになる。アプリケーション側がコマンドバッファを自由にできるので,「あるコマンドバッファ制御には任意のCPUスレッドを割り当てる」といったことも行える。このように,アプリケーションがハードウェア資源をより有効に使えるようになるため,性能を引き出せるというのが,Mantleの利点であるわけだ。
もっとも,Mantleではコマンドバッファ関連の操作をすべてアプリケーション側で行う以上,コマンドバッファ間の状態管理や,コマンドバッファ間の同期取りなども,アプリケーション側で行う必要がある。そのため,開発者の手間がそれなりに増える可能性はあるだろう。
Mantleではアプリケーションがグラフィックスメモリを管理する
DirectXやOpenGLでは,アプリケーションはAPIを通じてグラフィックスメモリを確保する。しかも,頂点バッファやテクスチャ配列,定数バッファといった用途ごとにアプリケーションが「○○に使うメモリをください」と要求を出すと,APIを経由して,GPUドライバが「ではこれを使いなさい」とメモリを割り当てる仕組みになっている。何かするたびにいちいちメモリを確保しなければならないわけで,処理やグラフィックスメモリの利用効率が悪くなるのも自明だろう。
そこでMantleでは,「アプリケーション側で,適当な量のグラフィックスメモリを確保したうえで,APIを通じ,『これは○○用に使います』と申告する」形に変わっている。
この仕組みなら,グラフィックスメモリの利用効率は向上し,アプリケーション内でのグラフィックスメモリの再利用もしやすい。たとえば,あるレンダリングステートで「シャドウマップ用に生成したバッファ」を,「定数バッファ」に再利用するといったことが可能になる。用途別にいちいちメモリを確保しなくて済むので,APIオーバーヘッドは減り,省メモリにもつながるというわけだ。
Mantleによるグラフィックスメモリ管理方式の利点を示した2枚のスライド。Mantleでは用途ごとに細かくグラフィックスメモリを確保したりしなくて済むようになり(左),しかも,確保したメモリをどう使うかはアプリケーション側で自由に決められる(右) |
グラフィックス仮想メモリとは,CPUにおける仮想メモリと同じ理屈の機能だ。初めに実際のグラフィックスメモリよりも大きなメモリ領域を定義して,それに仮想アドレスを与えておき,アプリケーション側は仮想アドレスを用いてメモリを利用する。そして,実際のグラフィックスメモリに入りきらない分は,外部ストレージにスワップアウトされる。
グラフィックス仮想メモリ自体は新しい概念ではないが,Mantleでは,実メモリと仮想メモリの割り当てを示すリマッピングテーブルを操作できるようになる。そのため,アプリケーションが必要としたタイミングで,仮想メモリの内容を実メモリにロードすることが可能になったのだ。
これをうまく活用すると,たとえばオープンワールドタイプのゲームで,エリア移動中にローディング画面を出してゲームの進行を止めたりすることなく,バックグラウンドで必要な3Dモデルやテクスチャデータを読み出しておくといったことが,これまでよりも簡単に行えるようになる。
Mantleで可能になるこれらの要素は,ハードウェアを抽象化したDirectXやOpenGLによるPCゲームの開発だと,確かに今までできなかったことではあるものの,実のところ,PlayStation 3やXbox 360世代のゲーム開発においては珍しくなかった。当然ながら,ゲームデベロッパはPS4やXbox One向けのゲームの開発でも同じような手法を使うので,それらの開発で培った技術をPC環境にそのまま持っていけるというのが,Mantleの大きな利点というわけだ。
MantleではマルチGPU環境を柔軟に活用できるように
セッションの最後には,PCならではというMantleの利点が紹介された。それは,マルチGPUへの対応である。Mantleでは,PCに搭載されている複数のMantle対応GPUやAPUのすべてを,アプリケーションが自由に扱えるようになるのだ。
これまで,AMD製GPUが搭載されたマルチGPU環境では,単体GPU同士を協調動作させる「CrossFire」や,単体GPUとAPUを組み合わせる「AMD Dual Gra
それがMantleでは,GCN世代という制約はあるものの,異なるスペックのGPUを組み合わせたマルチGPU環境でも,それぞれのGPUをフル活用できるのだという。
たとえばCrossFire環境では,グラフィックスレンダリングをGPUごとにオーバーラップさせてレンダリングすることで,描画性能を向上させる「Alternate Frame Rendering」(AFR)が基本的な使い方だった。それがMantleでは,「APUと単体GPUとを組み合わせて,APU側のGPUコアをポストエフェクト処理専用で使う」などといった,柔軟な使い方が可能になるのである。
Mantle環境でのマルチGPU活用をイメージしたスライド(左)と,その活用法や利点を挙げたスライド(右)。MantleはマルチGPUのあり方を変えるかもしれない? |
ゲームデベロッパの注目を集めるMantle
NVIDIAの対抗策はいかに?
2013年9月に発表されて以降,Mantleはゲームデベロッパの世界で非常に注目を集めており,「世界のゲームスタジオが続々と採用もしくは採用の検討を始めている」と,AMDは主張している。
発表時点では,「Battlefield 4」がMantleに対応すると発表されて注目を集めた。また,直近では,「TOMB RAIDER」「HITMAN ABSOLUTION」を手がけ,現在では「Thief」のPC版を開発しているNixxes SoftwareがMantleの採用を決定しており,ThiefのPC版ではMantle版が提供される見込みとのことだ。
「CryENGINE 3」で名高いCrytekも,Mantleの採用を検討していることが,セッション内で発表されていたりするので(※採用が決定したわけではない),Mantleの採用動向は,PCゲームファンなら注目しておく必要がありそうだ。
PS4とXbox Oneを制した勢いに乗って,MantleでPCゲーム市場も制覇しようと狙うAMD。だが競合であるNVIDIAも,その動きを黙って見ているわけにはいかないだろう。Mantleに対してNVIDIAは,どのような対抗策を用意してくるのか。当分はそこからも目が離せない。
AMD Developer Summit 2013 公式Webサイト(英語)
- 関連タイトル:
Mantle
- この記事のURL: