お気に入りタイトル/ワード

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

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

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

LINEで4Gamerアカウントを登録
[CEDEC 2009]MSの川西裕幸氏が次期開発ツール「Visual Studio 10」の並列化支援機能を紹介
特集記事一覧
注目のレビュー
注目のムービー

メディアパートナー

印刷2009/09/03 15:25

イベント

[CEDEC 2009]MSの川西裕幸氏が次期開発ツール「Visual Studio 10」の並列化支援機能を紹介

もはや,マルチコアプロセッサは,価格的にも特別なものではなくなってきている。写真は「Phenom II X4 965 Black Edition/3.4GHz」
画像集#012のサムネイル/[CEDEC 2009]MSの川西裕幸氏が次期開発ツール「Visual Studio 10」の並列化支援機能を紹介
 PCの世界でも,またコンシューマゲーム機の世界でもマルチコアプロセッサが急速に広がっている。シングルコアでの性能が向上していた時代なら,プログラマーが黙っていてもハードウェアが新しくなればプログラムの高速化が期待できたのだが,マルチコア時代はそうはいかない。
 プロセッサ全体のパフォーマンスは上がっていても,コア1個あたりの性能が上がっているとは限らないため,なにも考えていないプログラムはまったく性能が上がらないという状況になっており,プログラマー側にも努力が求められるようになったのだ。いわずとしれた“プログラムの並列化”(よくいうマルチスレッド化とほぼ同義)である。

 ゲームは,比較的マルチスレッド化が難しいソフトウェアといえ,4Gamerに掲載される各種ベンチマークテスト結果でもマルチコアでの伸びが少ない現実に,それがよく表れているといえるだろう。
 とはいえ,マルチコア化の流れは押し留めようがないわけで,ゲームもCPUコア数に応じてスケーラブルにパフォーマンスが伸ばせるような並列化の工夫が必須になってきているのも,また確かだ。

 CEDEC 2009の2日めに行われた「スケーラブルな並列化」と題されたセッションは,次期開発ツール「Microsoft Visual Studio 2010」(以下,Visual Studio 2010)がサポートする並列化支援の紹介を中心に,並列化のポイントを解説するという内容だった。ゲームに特化した話は少なく,また,プログラマー向けのセッションだけに,ゲーマーに直接関係がある話ではないが,ツールのサポートが充実することによりゲームの並列化も進むんじゃなかろうかと期待しつつ,内容を紹介してみよう。


プログラムの並列化に立ちはだかるさまざまな困難


マイクロソフト デベロッパー&プラットフォーム統括本部 プラットフォーム エバンジェリスト 川西裕幸氏
画像集#001のサムネイル/[CEDEC 2009]MSの川西裕幸氏が次期開発ツール「Visual Studio 10」の並列化支援機能を紹介
 本セッションを担当したのは,Microsoftの日本法人であるマイクロソフトでプラットフォーム エバンジェリストを務める川西裕幸氏だ。マイクロソフトが担当する技術セッションではお馴染みの「顔」である。ご存じの方も多いと思うが,川西氏が得意とするのはグラフィックス。そのため,このセッションも「裏のタイトルは,『Larrabee』(ララビー,開発コードネーム)の準備をしよう,次世代の準備をしようというノリ」にしようかと考えていたそうだ。

 川西氏はまず,CEDEC 2009で行われたCrytekのCarl Jones氏によるセッションで取り上げられていたという予測を紹介。それは,2013年以降,CPU,GPUともに高度に並列化し競合するようになるだろう,という内容だ。

 川西氏はここで,高度に並列化したCPUやGPUに対応する「新しいレンダリングのアルゴリズムが求められる」と語る。それがどういったものになるかは分からないと断りつつ,「Direct3Dパラレルのようなものが出てくるのかもしれない」と予測していた。また,そう遠くない将来登場するであろうLarrabeeについても触れ,「汎用的なアルゴリズムが,例えば32基のCPUで動くということが実現される」だろうとも述べていた。

画像集#002のサムネイル/[CEDEC 2009]MSの川西裕幸氏が次期開発ツール「Visual Studio 10」の並列化支援機能を紹介
CrytekのCarl Jones氏が語っていたという並列化の予測。2013年以降,CPUとGPUが高度に並列化して新しいパラダイムが求められるようになるという
画像集#003のサムネイル/[CEDEC 2009]MSの川西裕幸氏が次期開発ツール「Visual Studio 10」の並列化支援機能を紹介
川西氏は,Larrabeeにずいぶんと期待しているようだ。Larrabeeは,汎用的なPentiumクラスのCPUコアを多数集積したプロセッサで,GPUとは異なり,汎用的なアルゴリズムをメニーコアで処理できる

並列化に立ちはだかるさまざまな困難。こと細かに説明はしないが,何を並列にするかという設計上の難関に加え,スレッド間の同期,デッドロックといった技術上の問題や,エラーからの回復やデバッグが難しい点など,頭から終わりまで,並列化にはさまざまな難関が待ち受けている
画像集#004のサムネイル/[CEDEC 2009]MSの川西裕幸氏が次期開発ツール「Visual Studio 10」の並列化支援機能を紹介
 将来的には32CPU,64CPU……といったメニーコアでプログラムを動作させる必要があり,プログラムのスケーラブルな並列化は急務になってきているわけだ。だが,並列化はそう簡単なモノではない。
 いまのところ,残念ながら自動的にプログラムを並列にしてくれるような「自動並列化コンパイラはない」(川西氏)。したがって,並列化はプログラマーが自ら行わざるを得ないのだが,そこには,さまざまな困難があるとして示されたのが右のスライドだ。氏は,こういった困難を,ある程度クリアにしてくれる(≒解決してくれる),“賢い開発ツール”が求められると指摘する。


Visual Studio 2010に組み込まれた,並列化を支援する機能


Visual Studio 2010に実装されているタスクスケジューラ。ここでいうタスクは,「並列に実行させたい仕事」と理解してほしい。プログラム側がタスクスケジューラにタスクを渡すと,それを適切なタイミングでスレッドとしてWindowsに実行させるというイメージだ
画像集#005のサムネイル/[CEDEC 2009]MSの川西裕幸氏が次期開発ツール「Visual Studio 10」の並列化支援機能を紹介
 ベタなWindowsプログラミングでは,並列化できる処理をスレッドに実装して,Windows APIを使ってスレッドを起動させるというようなことを行う。
 起動されたスレッドはWindowsカーネルのスケジューラが適当なCPUに割り当ててくれるが,スレッドを処理させる順番などはプログラマ自らが決める必要がある。順番の都合で遊んでいるCPUが出てしまうのは好ましくないが――CPU数に応じて性能を上げたいなら,遊んでいるCPUはできるだけ少なくしたい――,CPUを効率よく働かせるのはなかなか難しいといった問題がある。
 そこで,Visual Studio 10のランタイムには「ユーザーモードスケジューラ」というものが実装されているという。

 ユーザーモードスケジューラは,プログラム側から渡されたタスクを,適切なタイミング(=CPUがより効率よく働くタイミング)でタスクをWindowsのスレッドとして実行させる機能を持っている。
 例えば,「なるべくキャッシュが厚いタスクをスケジュールする」(川西氏)といったことまで自動的にやってくれるとのこと。氏のいう「キャッシュが厚いタスク」というのは,「キャッシュがヒットしているであろうタスク」という意味だが,ユーザーモードスケジューラのリソースマネージャは,PCに搭載されているCPUコア数などを把握しており,起動するスレッドの数をCPUコア数に応じて調節するといったことも自動的に行われるとのことである。
 ここでデモンストレーションが行われた。その内容は下に掲載した写真で確認してほしい。

画像集#006のサムネイル/[CEDEC 2009]MSの川西裕幸氏が次期開発ツール「Visual Studio 10」の並列化支援機能を紹介
バイナリツリーの探索を再帰的に行うというC#のデモプログラム。単純にスレッド化すると,500あまりのスレッドが立ち上がる
画像集#007のサムネイル/[CEDEC 2009]MSの川西裕幸氏が次期開発ツール「Visual Studio 10」の並列化支援機能を紹介
メモ帳に書かれた「17670」はシングルスレッドでの実行時間(17.670秒)で,「16866」はマルチスレッド化したときの実行時間(16.866秒)。ほとんど変らないのは,4コアのプラットフォームで500あまりのスレッドを同時に起動させたためだ。スレッド数が多すぎ,コンテキストスイッチやメモリ確保などのオーバーヘッドが大きくなり,マルチコアのメリットが生かせない
画像集#008のサムネイル/[CEDEC 2009]MSの川西裕幸氏が次期開発ツール「Visual Studio 10」の並列化支援機能を紹介
スレッドの代わりにVisual Studio 10のタスクとして起動させるよう書き換える
画像集#009のサムネイル/[CEDEC 2009]MSの川西裕幸氏が次期開発ツール「Visual Studio 10」の並列化支援機能を紹介
すると,わずか6秒強で同じ処理が終了した。ユーザーモードスケジューラがCPUコア数に応じたタスクを起動させたためだ


parallel_forの利用例だが,実際には正常に動作しない。並列化されるfor文の中で変数u,vが変化するからだ。このようにスレッド間で共用されるデータがあるようなケースでは,単純にfor文をparallel_forに置き換えることはできない
画像集#010のサムネイル/[CEDEC 2009]MSの川西裕幸氏が次期開発ツール「Visual Studio 10」の並列化支援機能を紹介
 このバイナリツリーのデモは,やや極端ではあるが,ユーザーモードスケジューラの効果がとてもよく分かる例だ。プログラマはプラットフォームに搭載されているCPUコア数を意識する必要はなく,並列化できる部分をタスクとして渡すだけで,適当なスレッドとして実行してくれる様子が分かる。
 また,Visual Studio 2010には並列化を支援するライブラリセットが組み込まれており,ループを並列化するparallel_for(for文を並列に開く),parallel_foreach(foreachを並列に開く)といった構造が利用できるようだ。


マルチコアプロセッサのパフォーマンス向上に期待


 そのほか,Visual Studio 2010のマルチスレッドに対応する新しいデバッガのデモなども披露されたが,こちらは割愛する。
 いずれにしても,Visual Studio 2010の登場で,「メニーコア時代」に向けた大きな一歩が踏み出せたことが分かっていただけるのではないかと思う。

 これまで,プログラムの並列化において「苦労する割に思うようにパフォーマンスが上がらない」といった悩みを抱えていたプログラマーは多かっただろう。その点で,並列化を支援する機能が開発ツールに組み込まれれば,マルチコアの利用効率を上げやすく,言い換えれば,プログラムのパフォーマンスを向上させやすくなるわけである。

 Core i7,あるいはPhenom IIといったマルチコアプロセッサはすでにあるが,現状では,それを効率的に働かせられるゲームタイトルは多くない。Visual Studio 2010のような開発ツールが登場すれば,そうした状況も変ってくるはずだ。ゲーマーから見て劇的に何かのパフォーマンスが向上するということはないだろうが,開発ツールがもたらす変化を,じわりと体感できるようになるに違いない。
  • この記事のURL:
4Gamer.net最新情報
プラットフォーム別新着記事
総合新着記事
企画記事
スペシャルコンテンツ
注目記事ランキング
集計:11月05日〜11月06日