イベント
[CEDEC 2009]MSの川西裕幸氏が次期開発ツール「Visual Studio 10」の並列化支援機能を紹介
プロセッサ全体のパフォーマンスは上がっていても,コア1個あたりの性能が上がっているとは限らないため,なにも考えていないプログラムはまったく性能が上がらないという状況になっており,プログラマー側にも努力が求められるようになったのだ。いわずとしれた“プログラムの並列化”(よくいうマルチスレッド化とほぼ同義)である。
ゲームは,比較的マルチスレッド化が難しいソフトウェアといえ,4Gamerに掲載される各種ベンチマークテスト結果でもマルチコアでの伸びが少ない現実に,それがよく表れているといえるだろう。
とはいえ,マルチコア化の流れは押し留めようがないわけで,ゲームもCPUコア数に応じてスケーラブルにパフォーマンスが伸ばせるような並列化の工夫が必須になってきているのも,また確かだ。
CEDEC 2009の2日めに行われた「スケーラブルな並列化」と題されたセッションは,次期開発ツール「Microsoft Visual Studio 2010」(以下,Visual Studio 2010)がサポートする並列化支援の紹介を中心に,並列化のポイントを解説するという内容だった。ゲームに特化した話は少なく,また,プログラマー向けのセッションだけに,ゲーマーに直接関係がある話ではないが,ツールのサポートが充実することによりゲームの並列化も進むんじゃなかろうかと期待しつつ,内容を紹介してみよう。
プログラムの並列化に立ちはだかるさまざまな困難
川西氏はまず,CEDEC 2009で行われたCrytekのCarl Jones氏によるセッションで取り上げられていたという予測を紹介。それは,2013年以降,CPU,GPUともに高度に並列化し競合するようになるだろう,という内容だ。
川西氏はここで,高度に並列化したCPUやGPUに対応する「新しいレンダリングのアルゴリズムが求められる」と語る。それがどういったものになるかは分からないと断りつつ,「Direct3Dパラレルのようなものが出てくるのかもしれない」と予測していた。また,そう遠くない将来登場するであろうLarrabeeについても触れ,「汎用的なアルゴリズムが,例えば32基のCPUで動くということが実現される」だろうとも述べていた。
CrytekのCarl Jones氏が語っていたという並列化の予測。2013年以降,CPUとGPUが高度に並列化して新しいパラダイムが求められるようになるという |
川西氏は,Larrabeeにずいぶんと期待しているようだ。Larrabeeは,汎用的なPentiumクラスのCPUコアを多数集積したプロセッサで,GPUとは異なり,汎用的なアルゴリズムをメニーコアで処理できる |
いまのところ,残念ながら自動的にプログラムを並列にしてくれるような「自動並列化コンパイラはない」(川西氏)。したがって,並列化はプログラマーが自ら行わざるを得ないのだが,そこには,さまざまな困難があるとして示されたのが右のスライドだ。氏は,こういった困難を,ある程度クリアにしてくれる(≒解決してくれる),“賢い開発ツール”が求められると指摘する。
Visual Studio 2010に組み込まれた,並列化を支援する機能
起動されたスレッドはWindowsカーネルのスケジューラが適当なCPUに割り当ててくれるが,スレッドを処理させる順番などはプログラマ自らが決める必要がある。順番の都合で遊んでいるCPUが出てしまうのは好ましくないが――CPU数に応じて性能を上げたいなら,遊んでいるCPUはできるだけ少なくしたい――,CPUを効率よく働かせるのはなかなか難しいといった問題がある。
そこで,Visual Studio 10のランタイムには「ユーザーモードスケジューラ」というものが実装されているという。
ユーザーモードスケジューラは,プログラム側から渡されたタスクを,適切なタイミング(=CPUがより効率よく働くタイミング)でタスクをWindowsのスレッドとして実行させる機能を持っている。
例えば,「なるべくキャッシュが厚いタスクをスケジュールする」(川西氏)といったことまで自動的にやってくれるとのこと。氏のいう「キャッシュが厚いタスク」というのは,「キャッシュがヒットしているであろうタスク」という意味だが,ユーザーモードスケジューラのリソースマネージャは,PCに搭載されているCPUコア数などを把握しており,起動するスレッドの数をCPUコア数に応じて調節するといったことも自動的に行われるとのことである。
ここでデモンストレーションが行われた。その内容は下に掲載した写真で確認してほしい。
また,Visual Studio 2010には並列化を支援するライブラリセットが組み込まれており,ループを並列化するparallel_for(for文を並列に開く),parallel_foreach(foreachを並列に開く)といった構造が利用できるようだ。
マルチコアプロセッサのパフォーマンス向上に期待
そのほか,Visual Studio 2010のマルチスレッドに対応する新しいデバッガのデモなども披露されたが,こちらは割愛する。
いずれにしても,Visual Studio 2010の登場で,「メニーコア時代」に向けた大きな一歩が踏み出せたことが分かっていただけるのではないかと思う。
これまで,プログラムの並列化において「苦労する割に思うようにパフォーマンスが上がらない」といった悩みを抱えていたプログラマーは多かっただろう。その点で,並列化を支援する機能が開発ツールに組み込まれれば,マルチコアの利用効率を上げやすく,言い換えれば,プログラムのパフォーマンスを向上させやすくなるわけである。
Core i7,あるいはPhenom IIといったマルチコアプロセッサはすでにあるが,現状では,それを効率的に働かせられるゲームタイトルは多くない。Visual Studio 2010のような開発ツールが登場すれば,そうした状況も変ってくるはずだ。ゲーマーから見て劇的に何かのパフォーマンスが向上するということはないだろうが,開発ツールがもたらす変化を,じわりと体感できるようになるに違いない。
- この記事のURL:
キーワード