イベント
[CEDEC 2010]インテルが開発ツールの進化をアピール〜メニーコア時代のプログラミング言語からのアプローチ
コンパイラの自動ベクタ化に自信
よく言われるように,並列化には命令レベルの並列化とスレッドレベルの並列化があり,インテルのx86プロセッサの場合,前者をMMX/SSE命令セット(SIMD命令)によって,また後者をマルチコアによってサポートしている。こうした事情はインテル以外でも似たようなもので,2種類の並列化をそれぞれなんらかの形でサポートする。ゲームのプログラムはこの2つの並列化を適宜使ってパフォーマンスを上げる必要に迫られているわけだ。菅原氏はまず,命令レベルの並列化を取り上げた。
MMX/SSE命令に対応するイントリンジックスは,1つの関数が1ないし数個のMMX/SSE命令に対応するシンプルなもので,アセンブラのようにパフォーマンスを上げやすい。データを並列化(ベクトル化とも言う)する手間はかかるが,プログラマの負担はアセンブラに比べて軽い。悪くない並列化の方法ではあるのだが「残念ながら,将来の保証はない」と菅原氏は言う。
そのココロは,ということで例としてアルファブレンドのコード例が挙げられた。
例として菅原氏が出していたアルファブレンドを行う関数。このスライドではSIMD命令を用いていないが,これをイントリンジックスで書き直すと…… |
書き直したコードによるデモ。オブジェクトをアルファブレンドしながら回すもので,画面の_mm_で始まる関数群がイントリンジックスだ。200FPS弱のフレームレートが出ている |
菅原氏はアルファブレンドを行う関数だけをイントリンジックスで書き直したデモを見せたうえで「このコードには,まだ並列化できる部分がたくさん残されている」と述べつつ,同じコードをインテルの最新コンパイラでコンパイルし直して実行した。
そのうえで「パフォーマンスに効いてくる部分をすべてイントリンジックスで書いてしまうと,新しいCPUが出たときに,その新しい機能を使えなくなる」と菅原氏。例えば,登場間近とされるSandyBridge世代のプロセッサでは,Intel Advanced Vector Extensions(Intel AVXとも呼ばれる)という新しいSIMD命令セットが実装されるが,イントリンジックスで書いてしまうとその恩恵は受けられなくなると言う。
逆に言うと,Intel AVXの登場が近いからこそ,こういったデモをゲーム開発者達に見せたのだろう。アセンブラやイントリンジックスで書かずに「コンパイラに任せてテストしたらどうか?」と菅原氏は呼びかけていた。
Cilkによるスレッドレベルの並列化や
Array Notationの話題も
続いて菅原氏は,スレッドレベルの並列化に話を移した。スレッドレベルの並列化に関しては,2009年のCEDECでマイクロソフトの川西裕幸氏がVisual Studio 10の例を紹介していたが,インテルがイチ押ししているのは「Cilk」である。
CilkはC言語にいくつかのトークンや機能を追加してスレッドレベルの並列化を支援するプログラミング言語で,2009年にインテルが開発元を買収したため,現在はインテル製開発ツールがサポートする重要な機能の一つになっている。菅原氏はOpenMP(スレッドレベルの並列化を支援するオープンなC言語の拡張)と比較しつつ,Cilkの利点をアピールした。
マンデルブロ集合をCilkで並列化。このような場合は,for文をcilk_forに変えるだけで並列化できるという |
cilk_spawnを使うだけで,関数をスレッドとして起動させられる。また,cilk_sync;というトークンでスレッドの同期を取れる |
スライドのように,条件さえ整えば,普通のコードに1文加える程度でマルチスレッド化できてしまうとのことで,とても楽そうだ。Cilkに代表されるようにマルチスレッドのプログラミングもプログラマの負担が軽くなる方向に進んでいるが,OpenMPだとかCilkだとか,Visual Stduioの拡張であるとか,選択肢がありすぎて目移りするのが難といったところだろう。
もう一つ,Array Notationを取り上げていたあたりも興味深い。
実は,Intel AVXのSIMDに対してマスクを設定できるなど,Intel AVXとArray Notationとは相性が良さそうで,実際「Intel AVXでは非常に高速に処理できる」と菅原氏も述べていた。Array Notationを利用することでコンパイラ側での自動並列化,自動ベクタ化が楽になる面もあると思われ,インテルとしては普及を期待しているのだろう。
以上,ごく簡単にセッションの内容をお伝えしたが,ここ数年で並列化をめぐる状況は一変したと感心させられた。OSのスレッド機能を使い,頭を悩ませながら書くスタイルから,シングルスレッドのコードにいくつかの呪文を追加するだけで並列化できるという,プログラマーにとっては理想的な環境が整ってきたようだ。ゲームプログラムの並列化は,これからさらに加速しそうである。
- この記事のURL:
キーワード