この記事を読むのに必要な時間:およそ 1 分
GPUプログラミング
OpenGLやDirect3DなどのGPUを駆使したプログラミング(注1)は,少し前まではゲームプログラマにしか縁のなかったものだ。しかし,ハードウェアと開発環境の進化により,画像処理や科学技術計算など,ゲーム以外への応用が可能になってきた。
GPUはもともと,3D画像の生成を高速にパイプライン処理するために作られたハードウェアで,初期のGPUは座標変換やライティングなど,決まったことをするパイプラインしか持っていなかった。しかし,より現実的な世界を再現したいというゲームプログラマの要求に合わせて進化する過程で,パイプラインの各ステージを専用の言語でプログラミングするプログラマブルシェーダーというしくみが導入され,その自由度が大きく増した。
プログラマブルシェーダーにより,アプリケーション独自のライティング,テクスチャマッピング(注2),遅延シェーディング(注3)などが可能になり,ゲームの表現力が大きく向上した。
CPU vs. GPU
プログラマブルシェーダーは,単に表現力を増しただけでなく,より多くの仕事をCPUからGPUへとシフトすることを可能にした。そしてこれが,ハードウェアの進化にも影響を与えている点には注目すべきだ。
プロセッサの処理能力を上げるには,主に①クロック数を上げる,②プロセッサ(コア)の数を増やす,③一度に処理できるビット数(ビット幅)を増やす,という3つの方法がある。PCとともに進化してきたCPUは,この3つをすべて上げることにより進化してきたが,消費電力が重要なモバイルデバイスの台頭とともに,必ずしもこれまで通りのやり方が通用しなくなってきている。
まずは①のクロック数だが,これ以上上げることは,消費電力と熱の問題から特にモバイルデバイスでは難しくなってきている。AppleがiPhone 5sに採用したA7のクロック数をA6と同じ1.3GHzに据え置いたのはこれが理由である。
②のマルチコアはマルチタスク環境では力を発揮するが,一つのアプリケーションでマルチコアを活用するには煩雑なマルチスレッドプログラミングが必要となる。その煩雑さゆえに,多くのアプリケーションはマルチコアによるプロセッサの処理能力の恩恵を必ずしも受けることができないのが現状である。
③のビット数に関してはモバイルデバイスですら64ビットプロセッサの時代にはなったが(注4),1つのインストラクションで1つの計算しかできないCPUプログラミングの性質上,これを計算能力の向上に直接的に結び付けることは難しい。
これに対しGPUは,そもそもがマルチコアを活用しやすい並列処理・パイプライン処理をベースにした設計である。そのうえ,処理の大半が行列計算であるため,1クロックで同時に処理できるビット幅を増やすことがそのまま性能の向上につながる設計になっている。つまり,CPUと比べて「伸びしろ」が大きいのだ。
ゲーム以外への応用
GPUを活用した3Dゲームの開発は,一般的にOpenGLやDirect3Dを使って行われるが,これらのAPIを使ってゲーム以外のアプリケーションを作ることも可能である。私自身も,iPhone上のOpenGL(実際にはOpenGL ES)を活用して,インタラクティブ・アート・アプリケーションである「imm.rain」,ビデオのリアルタイム処理アプリケーション開発環境「Video Shader」などを開発している。
iOSのアニメーションを駆使したユーザインタフェースは,Core AnimationとQuartzというフレームワークが担当しているが,それらのフレームワークが実際の描画の際に使用しているのはOpenGLなのである。AppleはOpenGLの上に,画像処理をパイプライン化したCore ImageというしくみをOS XとiOSに提供しているが,ここでもやはりGLSL(OpenGL Shading Language)をベースにした言語で画像フィルタのプログラミングを可能にしている(現時点ではOS Xのみが可能)。
GPUをゲーム以外へ活用するための開発環境として代表的なのはOpenCLだ。OpenCLはオープンなプラットフォームとしてほかのOSにも移植されている。OpenCLを使うと,流体シミュレーション,分子モデリング,ゲノム解析などの科学技術計算において,高速な並列処理・パイプライン処理が必要とされる部分をGPUに任せることにより,大幅なスピードアップが期待されている。