西川善司のグラフィックスMANIAC

ためになる3Dグラフィックスの歴史(5)。DirectX 11から12へ。GPGPU概念の誕生

GPGPUを世界で初めて公式にサポートしたGPU「GeForce 8800 GTX」。2006年11月に発表された

 1990年代以降の3DゲームグラフィックスやPCグラフィックス環境の進化の歴史について、前回(4回目)までで、だいぶ近代に近づいてきた感がある。読者から「1980年代以前はなぜ取り扱わないのですか?」という質問をいただいたが、その時代、自分はリアルタイム世代でないため……というのがシンプルな回答である。すみません。

 8ビット/16ビットのパソコンの黎明期はリアルタイム世代なので、いずれ機会があればそのあたりの話題はやるかも……?

 今回は、DirectX 11(Direct3D 11)が登場して以降のグラフィックスハードウェア(GPU)業界の話題を見ていくことにしたい。

「抽象化レイヤーを薄くすべし」という新トレンドの発祥

 2009年のDirectX 11登場後、Windows世代で言うとWindows 7以降は、DirectXの進化はスローペースとなっている。

 これ以降も、GPU自体は1~2年サイクルで新製品が投入されるも、主に性能向上がメインで、以前のような目立ったレンダリングパイプラインへのテコ入れはあまり行なわれなくなった。

 実際、大きなテコ入れが起こるのは2018年の「リアルタイムレイトレーシング技術への対応」となるので、逆に言えば2009年から約9年間は、DirectXとグラフィックス描画パイプラインは「マイナーチェンジのみの時代」へと突入する。

DirectX 11世代対応GPUはNVIDIAとAMDがほぼ同時期にリリースしている(厳密にはRadeon HD 5000シリーズの方が数カ月早かった)。この時代のGeForceとRadeonのハイエンドクラスのGPUは、価格帯と性能面が拮抗していて、ユーザー目線においてもかなりホットな環境だったと思う。写真はGeForce GTX 480とRadeon HD 5850

 2012年にMicrosoftはDirectX 11.1を発表。2013年にはDirectX 11.2が、2015年にはDirectX 11.3が発表されている。

 これらはいずれもDirectX 11からのマイナーチェンジ版とも言うべきで、細かな機能追加が行なわれたバージョンという位置づけである。

 さて、DirectX 11.3が発表された2015年にはWindows 10がリリースされ、これとほぼ同タイミングでDirectX 12も発表されている。DirectX 12はWindows 8以前では利用できないこととなったため、このタイミングで多くのPCゲーミングファン達は、Windows環境の刷新の必要性を意識した。

 バージョン番号こそ「11→12」のメジャーバージョンアップとなるのだが、Microsoftは「DirectX 12はDirectX 11と併存する」と説明した上でリリースしている。

 ここで「併存させる」理由についての説明が必要だろう。

 DirectXは、それまでの長いDirectXの進化の歴史の中で、各メーカーのGPUアーキテクチャの違いを吸収するべく、分厚い「抽象化レイヤー」を実装していた。

 抽象化レイヤーとは、DirectX(Direct3D) APIとしての仕様と、実際のGPU実機レベルでの細かな仕様の違いを埋めたり、あるいは実際のGPUを駆動したりするための事前処理などを行なうソフトウェア層のことだ。

 この部分は主にDirectXの実態部分だったり、各GPUのドライバソフトなどが実務を担当する。当然、その実務はCPUが処理することになる。

 この分厚い「抽象化レイヤー」が、昨今の高い並列性能を持つマルチコアCPUと、超高性能化したGPUとを高速に連動動作させる取り組みにおいて、かなりのオーバーヘッドやボトルネックを発現する要因となってしまったのだ。

 そこでMicrosoftは、DirectX 11.xまでの機能面をそのままに、DirectX 11.xとの互換性を捨てつつ、この抽象化レイヤーを“極薄”化したDirectX 12を開発・発表したわけである。

DirectX 12 のレンダーコンテクスト概念図。DirectX 12 では図左側の青マスで表されるGPU内部の各機能ブロックの状態取得や設定を、あらかじめ定義していたオブジェクト(緑マス)単位で行なえるようになった。その分、オーバーヘッドは劇的に低減されることとなった。図版は拙著「ゲーム制作者になるための3Dグラフィックス技術 改訂3版」より引用

 DirectX 11と12を併存させる主な理由は「過去のソフトウェア資産との互換性維持のため」という目的があるにはあるが、それよりもリアルタイム性がそれほど求められないアプリケーションの開発においては抽象化レイヤーが分厚いDirectX 11の方が扱いやすいという側面を尊重したためだと言われている。

機能レベルでは大差がないために、多くのDirectX 11世代GPUは自動的にDirectX 12対応となったが、本格的にDirectX 12が活用され出すのは、2016年発表の「GeForce GTX 10」シリーズおよび「Radeon RX 400」シリーズがリリースされて以降となる。写真はGeForce GTX 1080とRadeon RX 480

 ところで、この「分厚い抽象化レイヤーの撤廃」という動きは、オープンスタンダードなグラフィックスAPIである「OpenGL」にも波及し、OpenGLの仕様を取り仕切るKhronosグループは、「リアルタイム性に優れたOpenGL」とも言うべき新APIとして「Vulkan」を2016年にリリースしている。

 発表順序としては、DirectX(2015年)→Vulkan(2016年)となってはいるが、実際には、AMDが2013年に発表した「Mantle」こそが「極薄化した抽象化レイヤーのグラフィックスAPIの元祖」だと見る向きが強く、MicrosoftがDirectX 12を誕生させたのは、Mantleの発表がきっかけとなったとも言われている。

 ただ、そんな業界に大きな影響をおよぼしたMantleは、DirectX 12の登場と時を同じくして2015年にサポートが終了された。

 事実上、AMD Mantleはほとんど実用化されずに消失したが、実はほぼそのままVulkanそのものへと昇華している。Mantleは一度死んで、Vulkanに生まれ変わったわけである。豆知識だ(笑)。

DirectX 12誕生のきっかけは「Mantle」だった?

DirectX 11との互換性を捨てたDirectX 12がゲーム業界に受け入れられた理由とは?

 2023年現在、DirectX 12はDirectX 12.2に到達しており、プログラマプルシェーダバージョンはShaderModel 6.5(SM6.5)にまで上がっている。SM6.xあたりについての詳細は回を改めて解説を行なうこととしたい。

 さて、「抽象化レイヤー」を極薄化したDirectX 12(やVulkan。以下同)は、確かにCPUとGPUの高速連携を可能にするソリューションとなったが、はっきり言えば、使いこなしには高度な技術力、設計力、深い知識が求められるようになった。

 それまではDirectX自体が管理してくれた各種リソースのマネージメントもほぼ開発者自身が行なわなければならくなり、やや「素人お断り」の雰囲気がある。

 では逆に、DirectX 11との互換性を捨てたDirectX 12が、なぜ業界からの大きな反発もなく、すんなり受け入れられたのか。これについても簡単に解説しておこう。

 これは、4回目の内容とも深く関係しているのだが、かつてはたくさん存在したGPU開発企業が今や数社になってしまったことが大きな理由の1つである。つまり「抽象化すべき対象」の数がそもそも少なくなってしまったと換言してもいいかもしれない。

 そして第2に、その少なくなったキープレイヤーとなった数社のGPUが、すべて共通仕様であるプログラマブルシェーダ技術ベースで開発されるようになり、結果として必然的に、その内部アーキテクチャがよく似てきたことも理由に挙げられる。要は「もう、それほど抽象化する必要がなくなってきた」というわけである。

 アプリケーション(≒ゲーム)の開発者の立場からすると、各種リソースのマネージメントが開発者自身に委ねられることになるDirectX 12の取り扱いは確かに高度なものではあるが、実は「その取り扱いのスタイル」はとても「家庭用ゲーム機向けのゲーム開発スタイル」に似ている。

 つまり、DirectX 12のアーキテクチャは、そうしたゲーム開発者にとってはむしろ「とっつきやすさ」になっていると言えるのだった。ここが第3の理由として挙げられる。

 最近のゲームは、家庭用ゲーム機とPCに対して区別なく広くリリースされることが多くなっているが、「DirectX 12を用いたPCゲーム開発」と「家庭用ゲーム機のゲーム開発」が似通ったことで、各ゲームタイトルをPCと家庭用ゲーム機に対し、同時並行開発や相互移植などが行ないやすくなったとも言われている。

GPUを汎用目的に活用する「GPGPU」という概念の誕生

 このシリーズの1回目でスポットを当てた1990年代のGPUは、シンプルなベクトル演算器(SIMDユニット)の集合体だった。つまり、シンプルな演算を同時並列に行なうことに特化したプロセッサとして誕生したわけである。

 しかし、2000年に登場したプログラマブルシェーダ技術によって、これ以降、高度なアルゴリズムやロジックをプログラムできる素養を身に付けていくことになる。このあたりの流れは4回目で解説した通りだ。

 ここで、CPUについて目を向けると、CPUはもともとアルゴリズムやロジックを動かすプロセッサとして誕生している。

 この処理動作を高速化するために、CPUは世代を改めるごとに、より高クロック動作するように進化させられてきた。

 もちろん、投機実行や分岐予測、依存関係のない命令の同時並列実行(スーパースカラ実行)などの技術も盛り込まれていったが、2000年にCPUが1GHz動作に到達するまでは、高クロック化こそが処理速度の向上の特効薬だった。

 しかし、2000年以降はCPUの高クロック化が鈍くなっていく。結果、業界は次第に「CPUの高性能化」を「マルチコア化」へと舵を切るようになる。

 そう、高度なアルゴリズムやロジックは、できるだけ並列に実行させて処理速度を稼ぐよう、ソフトウェアパラダイム自体に手を入れるようになっていったわけだ。

 こうしてGPUとCPU、それぞれのプロセッサの進化を俯瞰で見てみると、GPUは進化とともにCPU的な素養を獲得するようになり、逆にCPUはGPU的な能力を獲得するように進化してきたことが分かる。

 言うなれば、プログラマブルシェーダ技術とともに進化したGPUが、“CPU的な処理系も行なえなくもない”プロセッサへ姿を変えてきたわけである。

 と、ここで、業界はある仮説を訴えかける。

  • 「GPUをCG描画だけの専任プロセッサとして使うだけはもったいなくね?」
  • 「GPUにCG以外の、汎用の処理系を実行させてみたらどうなのよ?」

 これが「GPUの汎用用途活用」という概念、すなわちGeneral Purpose GPU(GPGPU)へと発展していく。

ATI(当時、現AMD)のRadeon HD 4000シリーズのテクニカルデモとして公開された「Froblins」(2008年)。GPGPUによる群集シミュレーションの実装に成功したことがアピールされた

 このGPGPUという概念が誕生したタイミングについては諸説あるが、2004年8月に世界初の「GPGPUに関する研究報告会」として「Workshop on General Purpose Computing on Graphics Processors」がロサンゼルスで開催されており、筆者はこちらを取材したことがある。

「Workshop on General Purpose Computing on Graphics Processors」の入口の看板。この当時はGPGPUではなくGP2と呼ぶことも多かった。数年後に倒産してしまう3Dlabsのロゴや、数年後にAMDに吸収されるATIのロゴがなんとも感慨深い!

 となれば、この学会開催の前年以前にはすでにGPGPUの概念は誕生していたことになる。

会場内の様子。登壇者の発表は「今のGPUってGPGPUには使いにくいよね」という内容がほとんどだった。当時「GPGPUは絶対クるはず!」と思って熱くなっていた筆者だったが、実際に参加してみたら日本人記者は筆者一人だった(笑)
この時に発表されたノースカロライナ大学のKarl Hillesland氏らによるGPUの浮動小数点演算性能精度を検証する論文。GPGPU用途ではATI系GPUの24bit FP演算精度はもはや弱点でしかない……という論調の論文。詳細はこちら

世界の先端スパコンに採用されるようになった“GP”GPU

 このGPGPUという概念に「GPUにとっての新しい市場」を見出したNVIDIAは、2008年のGeForce 8シリーズのリリースとほぼ同時に、独自のGPGPUソフトウェアプラットフォーム「CUDA」(Compute Unified Device Architecture)を立ち上げ、GPGPUの売り込みをスーパーコンピュータ業界、いわゆるHPC(High Performance Computing)業界に仕掛けていく。

GPGPUを公式にサポートした世界初のGPU、GeForce 8800 GTXを見せるNVIDIAのChief Scientist(当時)のDavid Kirk氏。同氏は「GeForceの父」と呼ばれ、NVIDIAのGPGPU注力戦略を指揮したと言われる人物である。CG関連やGPU関連の特許を70以上取得

 NVIDIAは、CUDA発表以降の新GPUを、GPGPU性能を重視した設計として開発。初代のTeslaコアから、Fermiコア、Keplerコアと、3世代に渡って継続的にリリース。

 これがHPC 業界にも高く評価されることになり、以降、スーパーコンピュータの中核的なプロセッサとしてNVIDIAのGPUが“GPGPU用途”専用で採用されるようになる。

 日本でも2008年、東京工業大学のスーパーコンピュータ「TSUBAME」が、NVIDIAのGPUベースで構築されることとなり注目を集めた

2008年当時の東工大のスパコン「TSUBAME1.2」にも採用されたTesla S1070は1Uシステムあたり約4TFLOPSだった。2016年発売のPS4 ProのGPU(約4.3TFLOPS)とほぼ同等の性能だ
2008年当時のTSUBAME1.2のピーク性能は約77TFLOPSだった。単体GPUとしては近年最高性能のGeForce RTX 4090(約83TFLOPS)の方が上という事実に改めて驚愕する。GPUの進化、はええ!

 GPGPU活用の最先端である各種科学技術計算の現場から切望された64bit倍精度浮動小数点にも対応したGPUは、2010年にGeForce GTX 480やTESLA M2050/C2050(GPGPU専用)として登場。

GeForce GTX 480のGPU

 スーパーコンピュータへのNVIDIA製GPU採用はさらに進むこととなり、2010年には世界最速スパコンTOP10のうち、なんと3台がNVIDIAのGPUベースとなった。

TSUBAME2.0にも採用されたTESLA M2050

 「GPGPUを使うとベクトル計算を圧倒的な速度で並列に行なえる」という事実は、2010年前後からビッグバンのようにあらゆる業界に広まることとなり、GPGPUの応用が多方面で進むことになるのであった。

 ここで「とある研究分野」に対し「GPGPUの応用」が、劇的な進化をもたらすことになる。それが「機械学習(マシンラーニング)型AI」という分野だ。

 ちなみに、「GPGPU」という用語についてだが、近年のNVIDIAはこれを意識的に用いておらず、彼らは「GPU COMPUTING」というキーワードの方を推進しているようだ。

 なお、NVIDIAはGPGPUの応用先をコンピュータビジョン処理系に力を入れていた時代は「VISUAL COMPUTING」というキーワードを推進していた。混乱を避けるため、本稿ではあえてGPGPUという一般用語の方で統一させていただいた。

 今回はここまでとする。

 このGPGPUという概念の誕生が、大きくその後のコンピュータパラダイムを変革していくのだが、その話は次回詳しくさせていただくこととしたい。