後藤弘茂のWeekly海外ニュース
GPUの進化に対応したMicrosoftの次世代API「DirectX 12」の背景
(2014/3/25 13:13)
ゲーム機風のAPIへと変わるDirectX 12
Microsoftが次世代のグラフィックスAPI「Direct3D 12」のプレビューを、3月17日~21日に米サンフランシスコで開催されたゲーム開発者向けカンファレンス「GDC(Game Developers Conference)」で行なった。Direct3D 12はAPIセット「DirectX 12」の中の3DグラフィクスAPIだ。前回のグラフィックスAPIのメジャーチェンジ「DirectX 11」は2009年。DirectX 12のリリース目標は2015年なので、6年振りのAPI革新となる。
しかし、DirectX 12は、新しいDirectXという、単純なAPI刷新に留まらない。DirectX 12は、DirectX始まって以来の改革で、API資産をいったんご破算にして、新たにAPIを構築する。1996年に3DグラフィックスAPIの「Direct3D」を導入してからこれまで、DirectXは継続的に進化してきた。DirectX 12ではその方向を大きく変える。
DirectX 12の最大のポイントは、ゲームコンソール(ゲーム機)風のAPIへの転換だ。分厚いAPI層でハードウェアを抽象化するのではなく、API層はできるだけ薄くして、よりローレベルでのハードウェアへのアクセスを可能にする。APIとドライバのオーバーヘッドを減らし、ハードウェアの性能を引き出せるようにする。アプリケーションが、より直裁的にリソースをコントロールできるようにする。
また、プログラマブル化したGPUをより効率的に使えるように、マルチコア化したCPUをスケーラブルに使えるようにする。CPUとGPUの同期も改善し、メモリモデルをより効率的にする。こうした改革を行ないながら、DirectX 12は過去のGPUでも動作する互換性を持つ。AMDならGCN(Graphics Core Next)、NVIDIAならFermi(フェルミ)以降のGPUでサポートされる。
さらに、Microsoftはこの革新的なDirectX 12を、PCだけでなく、Xbox OneからWindows Phoneにまで幅広く展開する。モバイル主体のコンピューティングの時代にも対応するAPIとして推進する。GDCでのDirectX 12のプレビューセッションには、AMDやNVIDIA、Intelといったお馴染みのPCグラフィックスベンダーに加えて、Qualcommが登壇してサポートを表明した。
DirectX 12のリリース目標は2015年末の商戦に間に合う時期。DirectX 12のプレビュリリースは今年(2014年)登場する。GDCのセッションでは、Microsoftのレーシングゲーム「Forza Motorsport 5」による、DirectX 12プロトタイプのデモが行なわれた。
CPUが頭打ちになりGPUが伸びるチップの現状に対応
DirectX 12の背景には、半導体チップの技術トレンドの変化、GPUハードウェアと市場の変化、開発者からの要求の変化、グラフィックスAPIの役割の変化がある。
半導体チップの変化は顕著で、CPUはマルチコア化したがCPUコアの性能向上は鈍化している。それに対してGPUは急激に性能を増しており、CPUとGPUの統合チップではこの傾向はますます強まっている。これは、CPUコアよりもGPUコアの方が7~10倍も性能/電力の効率が高いため、電力の制約の中で性能を上げるにはGPUコアを強化する以外の道がないからだ。
こうした背景から、現在のコンピュータアーキテクチャでは、性能を引き出すためにはGPUをよりスケーラブルに活用して行かなければならなくなっている。一方、ソフトウェア開発者は、シェーダグラフィックスに移ったGPUを有効に使うため、より直裁的にGPUハードを扱えることを求めている。また、アプリケーション側も、GPUを汎用コンピューティングにも活用し、よりタスクレベルの並列性の比率を高めようと、変化して来た。
しかし、グラフィックスAPIの方は、そうした変化に追従できていなかった。APIのモデルは20年以上前にデザインされたモデルの延長にある。GPUは、CPUが制御するラージステイトマシーンとして扱われ、直裁的ではないメモリモデルで、マルチコアCPUのスケーラビリティを活かすことも不十分で、CPU-GPUの同期も効率的ではない。名前とは裏腹に、Direct3Dはダイレクトに(直接)ハードウェアを扱うことができなかった。
従来のグラフィックスAPIがこんなに抽象化されているのは、以前のPCのグラフィックスAPIが、多種多様なハードウェアを抽象化しなければならなかったからだ。しかし、現在では、GPUハードウェア自体は、PCグラフィックスに関して言えば、GPUを開発するメーカー数が少なくなり、ハードウェアアーキテクチャは集約しつつある。また、GPUが汎用化したために、プロセッサとしての性格は各社で似通って来ており、かつてのように固定機能ハードウェアの差異がある状態とは異なってきている。
一方、ゲームコンソールでは、決め打ちのハードウェアをカバーするだけなので、PCグラフィックスのような高い抽象度は必要がなかった。薄いAPIレイヤーで、直裁的にハードを叩けるのがゲームコンソールスタイルだ。オーバーヘッドが小さいため、ゲームコンソールは、例えPCと同じアーキテクチャのGPUであっても、より高い実効性能を達成することができた。
多くのコンソールがこうした薄いソフトウェア層を持ち、コンソールゲーム開発者はそのスタイルに慣れ親しんできた。そのため、多くのゲーム開発者は以前からコンソールスタイルのAPIをPCにも求めていた。そして、今世代でゲームコンソールがPCアーキテクチャと似通ったことで、潜在的な要求はさらに高まっていた。
マルチコアCPUなど現在のリソースをうまく使うDirectX 12
こうした課題を解決するために、DirectX 12では、20年の積み重ねを抜本的に再編成した。冒頭で触れたようにオーバーヘッドを減らし、アプリケーションがリソースにより直裁的にアクセスできるようにし、リソースハザードトラッキングを容易にし、マルチCPUコアでのスケーラビリティを高める。下のMicrosoftのスライドもNVIDIAのスライドも、言っていることはほぼ同じで、DirectX 12の主眼が、グラフィックス機能の追加よりもAPI/ドライバの抽象化を下げることにあることが分かる。
Microsoftはその一例として、現在のDirectX 12のプロトタイプでのデモを見せた。4 CPUコアマシンでのレンダリングをDirect3D 11とDirect3D 12で比較したものだ。Direct3D 11ではメインスレッドの負荷ばかり非常に高かったのが、Direct3D 12では4スレッドに負荷が均等に分散され、CPUの実行時間が大幅に短くなっている。
実際には、DirectX 12はまだ開発中で、多くの機能は、今後実装予定だが、方向性は非常に明白だ。現時点で、ステイトマネージメントの改良のためのパイプラインステイトオブジェクトや、レンダリングコマンド発行の再利用のためのバンドル化、コマンドリストの改良、リソースバインディングモデルの改良など、さまざまな要素が決まっている。具体的な実装が進めば、DirectX 11に対して、同じハードで何倍の性能といった数値が出てくるだろう。
MicrosoftはDirectX 12を、PCだけでなくXbox Oneにも提供する。だが、そもそもXbox OneのAPI自体が、コンソールスタイルでDirectX 12との親和性が高い。GDCのセッションでは、Xbox OneのタイトルであるForza Motorsport 5をDirectX 12プロトタイプにポートするのに、かかった労力は4人月で済んだと説明していた。
MantleとDirectX 12の関係
レイヤーを薄くするDirectX 12の姿は、AMDの新グラフィックスAPI「Mantle(マントル)」ともよく似ている。もちろん、AMDが薄いレイヤーのMantleを出した途端に、DirectX 12のプレビューが行なわれたことは偶然ではない。複数のGPU関係者が、DirectX 12を「Mantleに触発されたAPI」と呼んでいた。Mantleへの反応として登場したのがDirectX 12と考えてよさそうだ。
あるAMD関係者は、もっと明瞭に語る。「グラフィックスAPIを軽くしたいとMicrosoftに何年も呼びかけていたが、Microsoftは動かなかった。そこで、業を煮やしてMantleを出したら、Microsoftがやっと重い腰を上げた。Mantleが業界を動かした」。
Microsoftを動かしてスタンダードAPIもMantleと同じ方向へ向けることができたのなら、GPUベンダーとしては成功ということになる。AMDにすれば、Mantleをすでに持っている同社は、2015年のDirectX 12に対して2年のアドバンテージを持つことになる。MantleからDirectX 12への移植が容易であるなら、DirectX 12までMantleで橋渡しをしようと考えるゲーム開発者が増えても不思議ではない。DirectX 12とMantleが併存するようになれば、Mantleにラッパーソフトウェア層を被せて対応することもできるかもしれない。
AMDはDirectX 12のセッションでは、GCNでDirectX 12をサポートすると説明した。ちなみに、DirectX 12のセッションにAMDから登壇したのは、Mantleを発表したAMDのRaja Koduri氏(Corporate Vice President, Visual and Perceptual Computing)だった。
一方、NVIDIAは、Mantleが発表された直後、「スタンダードAPIでも、MantleでAMDが主張しているのと同じことができる。NVIDIAはスタンダードAPIでなければ意味がないと考えている」と説明していた。NVIDIAがこう説明していたのは、その時点で、すでにDirectX 12の動きがあったからだろう。DirectX 12のセッションに登壇したのは、スタンダードAPIでもできると説明していたTony Tamasi氏(Senior Vice President of Content and Technology, Nvidia)だ。Mantleによる触発で、DirectXがMantle的な方向に向かうのなら、GPU中心のメーカーであるNVIDIAにとっても利がある。
GDCでのDirectX 12プレビューにはIntelも登場、同社のHaswell(ハズウェル)のIris GPUコアがDirectX 12をサポートすると説明。また、QualcommはDirectX 12によって性能が上がることは、電力効率が向上することだとして、モバイルでもDirectX 12の利点があると説明した。ちなみに、Qualcommの代表として説明を行なったEric Demmers氏(Vice President, Engineering, Qualcomm Technologies)は、元はAMDのグラフィックス部門のCTOだった人物だ。
既存のGPUコアでDirectX 12をサポートできるため、DirectX 12はローンチ時から膨大なインストールドベースを期待できる。DirectX 12が出る以前のデスクトップGPUでも100%がDirectX 12をサポートできるほか、DirectX 12をMicrosoftがリリースする時点のゲームPCの50%がDirectX 12をサポートできるとしている。
役割が変化したグラフィックスAPI
従来のDirectXは、APIがリリースされた時点では、対応するハードが揃っていないのが当たり前だった。しかし、今回のDirectX 12は異なる。その背景には、グラフィックスAPI自体の役割の変化がある。
DirectX 9までは、GPUハードウェアをグラフィックスAPIが規定して来た。グラフィックスAPIがサポートした機能を、GPUのグラフィックスパイプラインの中にハードウェアとして実装した。DirectX 8までは、APIとGPUハードウェアの関係は密接に結びついており、API側から見えるパイプラインがそのまま固定ハードウェアで実現されていた。下はDirectX 8の例で、左がAPI上から見えるパイプラインで、右が実際のハードウェアだ。
こうしたAPIとGPUハードの密接な関係は、プログラマブルになったDirectX 9から揺らぎ始めた。そして、DirectX 10/11ではAPIが規定するパイプラインと、実際のGPUハードウェアは大きく乖離した。APIがGPUハードウェアを規定するのではなく、プログラマブルでフレキシブルなGPUハードウェア上に、特定の機能を実現するAPIが乗るというCPU的なスタイルに変わり始めた。
上の図はDirectX 11で、左がAPI上のパイプライン、中央がNVIDIAやAMDのGPU、右がLarrabee型の実装だ。こうして、APIのくびきから離れたGPUハードウェアは、APIとは無関係に勝手に進化し始めた。そうしたAPIとハードウェアの関係の変化の末に、DirectX 11でAPI側の変化が止まってしまった。
その状況で、ようやく登場したDirectX 12には、もう、ハードウェアを定義するという方向は薄い。DirectX 12でも部分的に新しい固定ハードウェアを必要とする部分はあるが、主眼はグラフィックス固定機能の強化にはない。
DirectX 12は、APIの機能を固定ハードウェアで実現した時代からの重い資産を精算し、プログラマブルハードウェアにより直接的にアクセスする道を開く。ハードウェアの実態に、より近いアプローチとも言える。
DirectX 12が、既存のGPUでサポートできるとGPUベンダーが宣言する理由はここにある。APIがハードウェアを規定するのではなく、プログラマブルなハードウェアの上にAPIが乗る。CPUと似通ったスタイルなら、CPU同様に新しいAPIが少し前の世代のGPUで動作するのは当たり前とも言える。
GPUコンピューティングとの関係
今回、DirectX 12プレビューで触れられなかったポイントの1つは、GPUコンピューティングについてだ。そもそも、GPUコンピューティングで、グラフィックスとは異なるランタイムを使うのは、グラフィックスのソフトウェアスタックが複雑でオーバヘッドが大きく扱いにくかったからだ。グラフィックスAPIを整理してより直裁的にして行くと、原理的にはGPUコンピューティングにも使いやすいランタイムシステムになって行く。つまり、グラフィックスとコンピュートの融合のチャンスが出てくる。
実際、グラフィックスAPIのもう片方であるOpenGL系を策定するKhronosグループのある関係者は「グラフィックスAPIが変わって行くと、将来、例えば、OpenCLのランタイムにOpenGLなどを抱合できるようになるかもしれない。具体的にそうした計画があるわけではない。しかし、OpenCLのランタイムが統合的なランタイムになり、さまざまなコンパイラからのコードを漏斗のように受けるようになり、その1つにグラフィックスAPIがあるという風になる可能性はある」と語っていた。より直裁的でシンプルなGPUコンピューティング側のソフトウェアスタックに、グラフィックスAPIを抱合するという発想だ。ちなみに、OpenGL系も、基本的にはDirectX 12と似たような方向へ向かい始めている。
また、今回はDirectX 12の3Dグラフィックス以外のAPIについては触れられなかった。ナチュラルヒューマンインターフェイスの普及やバーチャルリアリティの登場で、入力系のAPIの拡張も重要になりつつある。