連載
西川善司連載 / 2009年,本格始動するGPGPUの世界・前編〜GPGPUって何?
「GPGPU」(General Purpose GPU,汎用GPU)というキーワードについて,正確に説明できる人はどれくらいいるだろうか? 「ああ,GPUを使ってビデオのトランスコードが速くなるヤツね」と認識している人や,科学技術計算のような,普通にPCを使ううえでは無関係のモノと認識している人も多そうだ。しかしこれらの説明は,たまたま一般ユーザーにとって分かりやすかったり,先行して採用されていたりするから強く訴求されているというだけで,別に,トランスコードや科学技術計算専用の技術ではない。
GPGPUは,実は3Dゲームにおいても無関係ではないのだ。
本連載,2009年明けて第1回となる今回は,今年,業界全体が一丸となって本格対応を進めてくると見られる,GPGPUをテーマにしてみたいと思う。
GPU(Graphics Processing Unit)はもともと,3Dグラフィックスを描画するための専用ハードウェア,すなわち,3Dグラフィックスで同時多発的に発生する,頂点の座標変換や,ピクセルの陰影処理などにおけるベクトル計算を,CPUよりも高速に処理するためのプロセッサ「3Dグラフィックスアクセラレータ」として誕生している。
初期のGPUは,3Dグラフィックス処理において頻発する,典型的なベクトル計算に特化したハードウェア設計がなされた。そのため,「比較的シンプルなベクトル演算器を複数個実装する」形態からスタートしている。その後,3Dグラフィックスの表現力の強化が望まれるにつれ,シンプルなベクトル演算器だった演算コアは,より高度なソフトウェアを実行できるような,汎用プロセッサ的な機能を備え始めていく。また,演算コアの数自体も,製造プロセス世代が新しくなるにつれ,増加の一途を辿っていった。
そして,“GPUの汎用プロセッサ化”に,決定的な影響を与えたのが,プログラマブルシェーダ(Programmable Shader)だ。GPUの各演算コアにおけるプログラマビリティの向上は,プログラマブルシェーダ仕様(Shader Model,以下SM)バージョンアップの歴史に相当すると述べても,過言ではない。
プログラマブルシェーダの歴史は,DirectX 8時代におけるSM1.xの登場から始まる。GPUの演算コアで――プログラム長に制限はあったものの――自由にソフトウェアを実行できるようになったのだ。DirectX 9のSM2.0では浮動小数点演算に対応し,同じくDirectX 9のSM3.0では,より高度な条件分岐を伴ったソフトウェアを実行できるようになった。
Windows Vistaで導入されたDirectX 10世代のSM4.0では,さらなるプログラマビリティの向上と,プログラム長の(事実上の)撤廃が行われ,CPUに迫る複雑なソフトウェアロジックを実行できるようになっている。
2004年8月に米ロサンゼルス市で開催された,世界初のGPGPU研究報告学会であるGP2(Workshop on General Purpose Computing on Graphics Processors)の模様
GPGPUという概念が起こったのはDirectX 9時代となる2003年ごろからで,「3Dグラフィックス処理だけでなく,それ以外のソフトウェアも,GPUでアクセラレーションできないか」という研究が発端だった。
2004年8月には,世界初のGPGPU研究報告学会「GP2」(Workshop on General Purpose Computing on Graphics Processors)が開催されたが,本学会では発表者達が,GPGPUの抱えている問題を厳しく指摘していたことを筆者は印象的に記憶している。ノースカロライナ大学のFrederick P.Brooks,Jr.氏はGPUが仮想メモリを取り扱えないことに苦言を呈し,並列コンピュータを用いた原子レベルでの物理シミュレーションを研究しているLawrence Livermore National LabのMark Seager氏は,GPUが例外処理能力に乏しいことを問題視していた。
あれから4年以上。2009年のGPGPUでは,当時指摘された弱点をほぼ克服してきており,様相もかなり異なっている。
もともとCPUにとって重荷だった3Dグラフィックス処理のアクセラレータとして登場したGPUは,CPUの得意分野であるはずの汎用ソフトウェア領域にまで踏み込もうとしているのだ。
というわけで,GPGPUを定義づけるなら,「高機能になったGPUを,3Dグラフィックス処理以外の汎用目的で使うこと」になるのだが,もう少し「GPU=グラフィックスカード」的な立ち位置から説明すると,「GPUの,ディスプレイに画像を表示する機能は使わず,計算したり,メモリの読み書きをしたりする機能だけを活用すること」といったイメージになる。
ただこの場合,「計算してメモリを読み書きするだけなら,CPUでもできるじゃん」と思う人がいるかもしれない。
だが,冷静になって数えてみると,一つのCPUに実装されているベクトル演算器の数は,多くても数基程度。これに対してGPUでは,少なくとも十数基,ハイエンドGPUでは数百基内蔵されており,クロックの違いなどを考慮しても,ざっくり10倍程度は,GPUのほうが高速だ。
メモリシステムも,DDR3トリプルチャネルメモリコントローラを内蔵したCore i7でさえ192bit×1066MHzで帯域幅25.6GB/sなのに対して,ハイエンドGPUならGDDR3の512bit×2GHzで,100GB/sを大きく超える帯域幅を確保している。
これはどういうことか。CPUでは高速に処理するのが難しい,「超並列ベクトル計算」「大局的なデータ処理」を,GPUなら処理できるということになる。言い換えれば,これらこそがGPGPUにふさわしいテーマ,というわけだ。
冒頭で紹介したビデオのトランスコード処理も,超並列ベクトル計算や大局的なデータ処理という,GPUの特性を生かせるから,GPGPUでの実装が行われたのである。
では,超並列ベクトル計算や大局的なデータ処理というのは,ゲーム分野だとどのようなテーマで活用され得るのか。さまざまなものが考えられるが,代表格であり,イメージもしやすいのが,物理シミュレーションとAI(Artificial Intelligence,人工知能)だ。
大量の3Dモデル同士が衝突したりするシミュレーションを実装する場合,どの3Dモデルが別のどの3Dモデルと衝突しているのかを,全モデル同士,総当たりの組み合わせで計算する必要がある。まあ,実際には最適化が行われるので,文字どおりの「総当たり」にはならないが,計算量が膨大になることだけは間違いない。
NaturalMotionが開発した,人間のアクションを算術合成するミドルウェア(≒アニメーション合成エンジン),「euphoria」。スクリーンショットは,それを応用したタイトル「Backbreaker」のもので,人間のアクションをGPGPUで自動生成するという発想に基づいている
剛体の衝突物理シミュレーションは言うに及ばず,オブジェクトが“自ら”変形することで,さらに複雑度が増す柔体物理シミュレーション,水面の動きを表現するための波動物理シミュレーション,液体や煙などの動きを再現するための流体物理シミュレーションなども,GPGPUにはおあつらえ向きなテーマだとされている。
また,GPGPUをキネマティックス(人体運動学)シミュレーションに応用して,モーションキャプチャに頼らずに自然な人体のアクションを再現/生成しようとする動きもある。
もっとも現状では,「GPGPU利用可能」なシステムと,「GPGPU利用不可能」なシステムが混在しており,仮に前者へ最適化してしまうと,動かしたゲームの内容に差異が出てしまう。そのため,ゲームにおけるGPGPUを活用した物理シミュレーションは,当面の間,爆発で生じる破片や爆煙の動き,水面の動きなどといった,ゲーム進行の本質にあまり関わらない「効果物理」用途が中心となると思われる。
実際,GPGPU(※具体的には後編で述べるNVIDIAの「CUDA」)に対応を表明している「Mirror's Edge」や,「Bionic Commando」でも,実装されているのは効果物理だけだ。
Electronic Arts(以下,EA)傘下のEA DICEが開発した「Mirror's Edge」。マルチプラットフォームタイトルだが,PC版のみ,GPGPUによる効果物理アクセラレーションを利用できる。右はGRINが開発し,カプコンがパブリッシングを担当する「Bionic Commando」
多くのPCにGPGPUが浸透すれば,ゲームシステムの根幹に高度な物理シミュレーションが導入され,ゲームプレイ自体に新しい変革がもたらされるようになるかもしれない。
実際,(GPGPUの実例ではないが)昨今,マルチコアCPUが大前提となったことで,EAの「Mercenaries 2: World in Flames」(以下,Mercenaries 2)やTHQの「Red Faction: Guerrilla」(以下,RF: Guerrilla)など,高度な物理シミュレーションの形態,「ノンリニア破壊」をゲーム性に組み込んだタイトルも出始めている。GPGPUが大前提となる時代がやってくれば,これよりもさらに高度な物理シミュレーションをゲームシステムに組み込んだものだって,登場してくる可能性があるのだ。
物理シミュレーションを分かりやすく伝える手段として注目を集めている,ノンリニア破壊。「攻撃を受けると,ダメージに応じて決まり切った壊れ方をする」破壊モデルを「リニア破壊」といい,これが従来のゲームにおける一般的な破壊モデルだった。これに対して,「『対象』の各部位を破壊することで,最終的に『対象』が自身の構造を維持できなくなって自壊してしまう」破壊モデルがノンリニア破壊だ。ここに示したのは,原稿執筆時点で最も先進的なノンリニア破壊を実装したMercenaries 2(左)とRF: Guerilla(右)より
GPGPUにおあつらえ向きなゲーム関連テーマとしては,AIも注目されている。
ゲームAIは,もちろんこれまでも,CPUで実装されてきた。だが,GPGPUで取り扱うのに向いているのは,そのなかでも「大局的な」AIだ。
大局的なAIというのは,一言でまとめるなら,「あるキャラクター(=敵やNPC)の行動原理を決めるとき,ゴールへ直接向かう行動を生成するのではなく,他者の行動に影響されたり,あるいは他者の行動に影響を及ぼしたりしながら行動する」AI。一番分かりやすい形態は,「群衆シミュレーション」になるだろう。
ATI Radeon HD 4000シリーズのテクニカルデモとして公開されたFroblins。ただ眺めるだけでなく,ユーザーはシーンに障害物を設置するなどして,Froblin達の行動に影響を与えられる
Cellに内蔵される7基のSPEをフル活用した,魚の群集シミュレーション。発表当時,約1万匹のスプライトベースの魚に対して群集AIを適用して,表示フレームレート60fpsを維持できていたことがアピールされた
ATI Radeon HD 4000シリーズのテクニカルデモ,「Froblins」は,まさにその一例である。カエル型の妖精Froblinはシーン内に無数登場し,それぞれが金の採取,キノコの採取といった各自の仕事をこなすために,自分自身にとって最良の移動経路を探索する。そのとき,地形の起伏を回避したり,他者との衝突を避けるための突発的な回り道を選択したりすることもある。
Froblinsは,群衆AIの実装例としてはかなりシンプルだが,CPUを使ったものであれば,複雑な例もすでに発表されているので,紹介しておこう。
Game Developers Conference 2006でSony Computer Entertainment Americaがデモしたのは,「Cell」プロセッサを使って魚群の群衆シミュレーションを行う「Crowd Simulation on PS3」。これは,Cellプロセッサが持つ7基のSPE(Synergistic Processor Element。PLAYSTATION 3が搭載するCellは8基のSPEを持つが,うち1基はDisabledになっている)を活用して,群衆AIを実装した例である。
Crowd Simulation on PS3は,異なる種の魚達が同じ種類で固まろうとする「個人AI」と,群れとしてどう行動するかの集団意志決定を行なう「群集AI」を並列に動かして,魚の群れの挙動を制御するものであった。
一昔前だとMicrosoftの「NINETY-NINE NIGHTS」,あるいは現在でも続くシリーズとしてコーエーの「無双」など,群衆を題材にした戦闘系ゲームタイトルは存在する。しかし,これらにおける群衆は「ただ画面内にキャラクターがいっぱいいるだけ」。コピー機で複製したものを置いてあるかのようで,その動きにライブ感はあまりない。それぞれが意味を持った動きをして,さらに全体としてみると有機的な動きをするような,そうした群集の動きを再現するまでには至っていないのだ。
GPGPUで大局的なAIが効果的に活用されるようになると,大勢対大勢の戦闘が,個に着目しても,群れに着目しても興味深いものになる可能性がある。軍隊対軍隊の戦闘を題材としたところで,「ただ隊列を組んで移動して,ランダムかあるいは順列的に戦うだけ」のリアルタイムストラテジーなども,GPGPUによる群集AIの採用によって,本当にリアルな戦場描写が実現できるようになるかもしれない。
後編となる次回は,このGPGPUを取り巻くプラットフォームの動向について詳しく解説していきたい。
- 関連タイトル:
CUDA
- 関連タイトル:
PhysX
- 関連タイトル:
AMD Stream(旧称:ATI Stream)
- この記事のURL:
キーワード
Copyright(C)2008 NVIDIA Corporation
(C)2009 Advanced Micro Devices, Inc.