オススメ機能
Twitter
お気に入り
記事履歴
ランキング
お気に入りタイトル/ワード

タイトル/ワード名(記事数)

最近記事を読んだタイトル/ワード

タイトル/ワード名(記事数)

募集中
LINEで4Gamerアカウントを登録
[CEDEC 2010]インテルが開発ツールの進化をアピール〜メニーコア時代のプログラミング言語からのアプローチ
特集記事一覧
注目のレビュー
注目のムービー

メディアパートナー

印刷2010/08/31 21:42

イベント

[CEDEC 2010]インテルが開発ツールの進化をアピール〜メニーコア時代のプログラミング言語からのアプローチ

 CEDEC 2010の初日に行われた,「メニーコア時代のプログラミング言語からのアプローチ」と題されたセッションの内容をお伝えしたい。担当したのはインテルでシニア・ソフトウェア・エンジニアを努める菅原清文氏で,同社のコンパイラ製品群に実装されている並列化の機能を中心に,インテルの並列化への取り組みをアピールするものだった。


コンパイラの自動ベクタ化に自信


インテル株式会社 インテル技術本部 ソフトウェア&サービス統括部 シニア・ソフトウェア・エンジニアの菅原清文氏
画像集#002のサムネイル/[CEDEC 2010]インテルが開発ツールの進化をアピール〜メニーコア時代のプログラミング言語からのアプローチ
 現在,プロセッサにおけるクロックアップのテンポは遅くなり,その代わりマルチコア化が加速しているという状況は,4Gamer読者には改めて説明するまでもないだろう。したがって,「クロックによる劇的なパフォーマンスアップは望めない。では,何をしなければならないか? それは並列化である」(菅原氏)となるわけだ。
 よく言われるように,並列化には命令レベルの並列化とスレッドレベルの並列化があり,インテルのx86プロセッサの場合,前者をMMX/SSE命令セット(SIMD命令)によって,また後者をマルチコアによってサポートしている。こうした事情はインテル以外でも似たようなもので,2種類の並列化をそれぞれなんらかの形でサポートする。ゲームのプログラムはこの2つの並列化を適宜使ってパフォーマンスを上げる必要に迫られているわけだ。菅原氏はまず,命令レベルの並列化を取り上げた。

SIMD命令の3つの実装方法。プログラマーとしては1,2,3の順で楽になる
画像集#003のサムネイル/[CEDEC 2010]インテルが開発ツールの進化をアピール〜メニーコア時代のプログラミング言語からのアプローチ
 現状,SIMD命令による並列化には右のスライドに示された3つの方法があるが,古典的なのはアセンブラで記述する方法で,もっともパフォーマンスを上げやすいが,手間がかかるうえに保守などの負担が大きい。それを軽減するために実装されたのが,イントリンジックス(組み込み関数)である。
 MMX/SSE命令に対応するイントリンジックスは,1つの関数が1ないし数個のMMX/SSE命令に対応するシンプルなもので,アセンブラのようにパフォーマンスを上げやすい。データを並列化(ベクトル化とも言う)する手間はかかるが,プログラマの負担はアセンブラに比べて軽い。悪くない並列化の方法ではあるのだが「残念ながら,将来の保証はない」と菅原氏は言う。
 そのココロは,ということで例としてアルファブレンドのコード例が挙げられた。

画像集#004のサムネイル/[CEDEC 2010]インテルが開発ツールの進化をアピール〜メニーコア時代のプログラミング言語からのアプローチ
例として菅原氏が出していたアルファブレンドを行う関数。このスライドではSIMD命令を用いていないが,これをイントリンジックスで書き直すと……
画像集#005のサムネイル/[CEDEC 2010]インテルが開発ツールの進化をアピール〜メニーコア時代のプログラミング言語からのアプローチ
書き直したコードによるデモ。オブジェクトをアルファブレンドしながら回すもので,画面の_mm_で始まる関数群がイントリンジックスだ。200FPS弱のフレームレートが出ている

 菅原氏はアルファブレンドを行う関数だけをイントリンジックスで書き直したデモを見せたうえで「このコードには,まだ並列化できる部分がたくさん残されている」と述べつつ,同じコードをインテルの最新コンパイラでコンパイルし直して実行した。

同一のコードをインテルの最新コンパイラでコンパイルし直して実行。フレームレートは何と300FPSを超えている
画像集#006のサムネイル/[CEDEC 2010]インテルが開発ツールの進化をアピール〜メニーコア時代のプログラミング言語からのアプローチ
 この例のように,最新コンパイラでコンパイルし直すだけで1.5倍を上回るフレームレートが得られるのだ。イントリンジックスで並列化されたアルファブレンド以外の部分にも並列化可能な部分が多くあり,最新のコンパイラが自動的に並列化を行ったことで,高速になったのだ。最新コンパイラの自動並列化は「賢い」ということだろう。
 そのうえで「パフォーマンスに効いてくる部分をすべてイントリンジックスで書いてしまうと,新しい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の利点をアピールした。

画像集#007のサムネイル/[CEDEC 2010]インテルが開発ツールの進化をアピール〜メニーコア時代のプログラミング言語からのアプローチ
マンデルブロ集合をCilkで並列化。このような場合は,for文をcilk_forに変えるだけで並列化できるという
画像集#008のサムネイル/[CEDEC 2010]インテルが開発ツールの進化をアピール〜メニーコア時代のプログラミング言語からのアプローチ
cilk_spawnを使うだけで,関数をスレッドとして起動させられる。また,cilk_sync;というトークンでスレッドの同期を取れる

 スライドのように,条件さえ整えば,普通のコードに1文加える程度でマルチスレッド化できてしまうとのことで,とても楽そうだ。Cilkに代表されるようにマルチスレッドのプログラミングもプログラマの負担が軽くなる方向に進んでいるが,OpenMPだとかCilkだとか,Visual Stduioの拡張であるとか,選択肢がありすぎて目移りするのが難といったところだろう。
 もう一つ,Array Notationを取り上げていたあたりも興味深い。

Array Notationとは,配列をループを使わずに初期化したり演算したりできる拡張である。これもIntel AVXへの布石だ
画像集#009のサムネイル/[CEDEC 2010]インテルが開発ツールの進化をアピール〜メニーコア時代のプログラミング言語からのアプローチ
 Array Notationは配列の初期化や演算をループを使わずに行えるようにする配列の拡張だ。スライドのようにストライドを指定でき,たとえば配列のデータに対して一つ飛びに何かする,といったことも簡単にできたりする。
 実は,Intel AVXのSIMDに対してマスクを設定できるなど,Intel AVXとArray Notationとは相性が良さそうで,実際「Intel AVXでは非常に高速に処理できる」と菅原氏も述べていた。Array Notationを利用することでコンパイラ側での自動並列化,自動ベクタ化が楽になる面もあると思われ,インテルとしては普及を期待しているのだろう。

Smokeデモ。燃える家やAIで制御される馬や鶏といったオブジェクトが登場するデモだ。ホースで水をかけてみるというお遊びも実装されているので,ダウンロードして楽しんでほしい
画像集#011のサムネイル/[CEDEC 2010]インテルが開発ツールの進化をアピール〜メニーコア時代のプログラミング言語からのアプローチ
 菅原氏は最後に,インテルが無償で公開しているゲームテクノロジデモ「Smoke」の説明を行った。講演の時間が超過したため,ごく簡単に説明されただけだったのが残念だが「コア数に応じてスケーラブルに性能が上がる」(菅原氏)ことを目指してゲームエンジンが実装されているとのこと。上記リンクから自分のPCにダウンロードして,実行してみると面白いかもしれない。ソースコードもダウンロードできるので,研究目的にはぴったりだろう。

 以上,ごく簡単にセッションの内容をお伝えしたが,ここ数年で並列化をめぐる状況は一変したと感心させられた。OSのスレッド機能を使い,頭を悩ませながら書くスタイルから,シングルスレッドのコードにいくつかの呪文を追加するだけで並列化できるという,プログラマーにとっては理想的な環境が整ってきたようだ。ゲームプログラムの並列化は,これからさらに加速しそうである。

(左)Smokeに実装されている機能。ゲームエンジンとして必要な機能はほぼ網羅されているようだ。(右)Smokeに実装されているゲームエンジンの構成。Intel Thread Building Blockなどインテルのマルチスレッド支援技術をフルに生かしたコードになっている。短いメッセージの情報をやり取りすることで,スレッドの同期は最小限に抑えられている。衝突判定も非同期のメッセージで処理されていると思われる
画像集#010のサムネイル/[CEDEC 2010]インテルが開発ツールの進化をアピール〜メニーコア時代のプログラミング言語からのアプローチ 画像集#012のサムネイル/[CEDEC 2010]インテルが開発ツールの進化をアピール〜メニーコア時代のプログラミング言語からのアプローチ
  • この記事のURL:
4Gamer.net最新情報
プラットフォーム別新着記事
総合新着記事
企画記事
トピックス
スペシャルコンテンツ
注目記事ランキング
集計:09月25日〜09月26日
タイトル評価ランキング
67
DEKARON (PC)
63
BLESS UNLEASHED (PC)
55
Pokémon UNITE (Nintendo Switch)
21
2021年03月〜2021年09月