特集:カプコン×インテル。「ロスト プラネット」のマルチスレッド最適化対談

カプコン×インテル。「ロスト プラネット」のマルチスレッド最適化対談

1 2

Text by 米田 聡

 

 2007年6月25日の記事「『ロスト プラネット』と8CPUコアでチェックする,マルチスレッド最適化の最前線」でレポートしたように,「ロスト プラネット エクストリーム コンディション」(以下ロスト プラネット)は,CPUのコア数に応じてパフォーマンスが向上していくゲームだ。コア数に応じてパフォーマンスが上がるのは当たり前じゃないかと思うかもしれないが,現実にはロスト プラネットほどリニアにパフォーマンスが上がるゲームは珍しい……というより,少なくとも2007年7月時点ではほかにないだろう。
 これはロスト プラネットがマルチコアに高度に最適化されていることを示している。言い換えると「うまい具合にマルチスレッド化されている」ということだ。

 

 さて,マルチスレッド/コアといえば,すでにクアッドコアCPUを市場に投入しているIntelが存在するわけだが,今回は同社の日本法人であるインテルのソフトウェア技術者を,ロスト プラネット&ゲーム開発フレームワーク「MT Framework」の主要開発者と引き合わせてみた。MT Frameworkがどのようにマルチスレッド化されているのか,またパフォーマンス向上の秘密はどこにあるのか。それを存分に語ってもらおう。

 

 

MT Framework,そのパフォーマンスと
マルチスレッド化のノウハウ

 

4Gamer
 皆さん,本日はお時間をいただきありがとうございます。今回は「ロスト プラネットとマルチスレッド最適化」をテーマとして進めていきたいと思いますが,まずは「そもそも,インテルさんがどのように開発へ協力したのか」といったあたりから聞かせてください。

 

竹内康人氏(インテル ソフトウェア技術部 アプリケーション・エンジニア)

竹内康人氏
 経緯からお話しすると,まずカプコンさんからゲームエンジン(※MT Frameworkのこと)を見せていただいて,そのパフォーマンスの高さに驚きました。「このエンジンと,その先に出てくるゲームはメガヒットが期待できる,そしてPC市場の活性化も期待できるんじゃないか」ということで,開発に協力させていただくことになったんです。
 当社からは,まず検証用にクアッドコアCPU搭載の検証用システムを提供しました。さらに,インテルが開発している「C++コンパイラー」「VTune パフォーマンス アナライザー」「スレッディング ビルディング ブロック」なども,提供させていただいていますね。
 また,ご存じのように当社はグラフィックス(※グラフィックス機能統合チップセットのこと)もやっています。パフォーマンスは……皆さんご存じのとおり改善の余地があるんですけども(笑),そのグラフィックスでの動作検証もやっていただきました。

 

伊集院 勝氏(カプコン 第二制作部 ソフトウェア制作室 室長)。MT Framework開発部隊のトップを務める

伊集院 勝氏
 代わりに我々からは,ロスト プラネットのゲーム本体,PC版の開発中バイナリコードをインテルさんに提供していますね。

 

竹内康人氏
 当社のパフォーマンスラボ内で,そのバイナリコードの検証を行っています。最大8コアまで検証して,かなりのスケーリングが確認できました。

 

4Gamer
 カプコンさんでは,クアッドコアシステムでどういった検証を行ったのですか?

 

伊集院 勝氏
 (純粋に)そのシステムでどの程度性能が上げられるのか,ですね。

 

4Gamer
 我々のテストでも,ロスト プラネットは「PERFORMANCE TEST」の「Cave」で,コア数に応じてリニアに性能が伸びる傾向が確認できています。高度にスレッド化されている証ですよね。

 

石田智史氏(カプコン 第二制作部 ソフトウェア制作室 プログラマー)。MT Framework開発の主要人物

石田智史氏
 「マルチスレッドはゲーム向きじゃない」という常識みたいなものがあったんですが,今後の流れとしてはマルチコアは避けられません。だからマルチスレッド化に取り組もうと。

 

4Gamer
 ゲームのマルチスレッド化が難しいのはなぜですか?

 

石田智史氏
 簡単に言うと依存関係(※詳細は後述)が複雑なんですよ。マルチスレッドでパフォーマンスを上げるためには個々のスレッドの独立性が高くなければなりませんが,ゲームはそうじゃないんです。

 

竹内康人氏
 依存性が少なく,負荷の大きいループ処理を分割して並列実行させるような――当社では「データ並列化」と呼んでいますが――形であれば簡単にマルチスレッド化できるんです。しかし,ゲームはあちこちが依存していてマルチスレッド化が非常に難しい。

 

石田智史氏
 ゲームのループ処理内でスレッド化できるのは,ほんの数%に過ぎないんです。オブジェクト同士の依存関係がゲーム内の処理の大半を占めている。それを,いかにマルチスレッド化するかが鍵になりますね。

 

MT Frameworkにおける並列処理の仕組みを示したスライド

竹内康人氏
 処理すべきジョブをキューに積み,空いたスレッドに割り当てて実行していくというMT Frameworkの仕組みと,Intel CPU内部の仕組みとが似ているなあ,と感心したんですよ。リザベーションステーションに命令を溜めておいて,空いた実行ユニットにアウトオブオーダーで命令を実行させることで,リオーダバッファと合わせて並列処理を実現する(Intel CPUの)仕組みと,ですね。

 

石田智史氏
 MT Frameworkでは,キューに積んで並列で実行します。最後にソートしてスレッド間のタイミングを取るという。

 

竹内康人氏
 ゲームをスレッド化する事例そのものは,北米だと少なくないんです。Intel北米本社のエンジニアがゲームのスレッド化を手伝ったという事例もあったりします。ただ,MT Frameworkはそれらと比較して,最も優秀な例になると思いますね。

 

石田智史氏
 インテルさんから提案いただいたのは,ループの並列化とか,サウンド,グラフィックなど大きな単位の並列化でした。ただ,実のところ我々がやったのは,もっと小さな単位のスレッド化。オブジェクト単位の並列化です。

 

4Gamer
 並列化の単位を大きくするとパフォーマンスが上がらない。かといって小さくすると依存関係が多くなりすぎてパフォーマンスが上がらない。難しいですね。

 

石田智史氏
 単位を大きくすると……というより,ゲームには“大きな単位”なんてないんですよ。せいぜいサウンドとグラフィックスのレンダリングくらい。この二つを並列化したところで,コア数に応じたパフォーマンスは得られないんです。

 

齊藤康幸氏(第一制作部 ソフトウェア制作室 プロダクトマネージャー)。ロスト プラネットのプロダクトマネージャーである

齊藤康幸氏
 ネットワークベースのゲームなら,パケットベースのマルチスレッド化という手もあるんですよ。ネットワークゲームはパケット単位で動いて,すなわち非同期ですからスレッドに載せやすい。

 

石田智史氏
 そう,ゲーム全体をパケットベースにしてしまうのが,最も効率はいい。だけど,それでは今までの作り方とは大きく変わってしまうんです。今までから作り方をさほど変えずに,しかも効率はよくというのが,MT Frameworkでやっている「オブジェクト単位の並列化」でした。

 

竹内康人氏
 「どのようにスレッド化を行うか」とか,試行錯誤はあったと思うんですが,開発者同士でどうやってコンセンサスを得ていたんですか?

 

伊集院 勝氏
 (MT Frameworkのスレッド管理部分は)ほとんど石田が一人で作ったようなものでして(笑) コンセンサスというのはないですね。

 

竹内康人氏
 一人で! それは凄いですね。

 

石田智史氏
 本当に大変で。オーバーヒートしかけましたね(笑)

 

竹内康人氏
 ツールも作られたと聞きましたが,エンジンと同時に作られたんですか? スレッド可視化ツールとか……。

 

石田智史氏
 すいません,スレッドの可視化ツールといいますと?

 

竹内康人氏
 スレッドを時系列で見られるツールのような画面ショットをどこかで見た憶えがあるのですが……。

 

石田智史氏
 ああ,それはおそらくMicrosoftのシステムのことですね。Microsoftのキャプチャリングシステムで,各スレッドが,時分割でどこで動いているかが分かる。ちゃんと並列化されているかが分かるようになっているんです。

 

竹内康人氏
 そうだったんですか。

 

石田智史氏
 こちらで作ったのは,ユニットマネージャとプロファイラ……どの処理がどれくらい時間がかかっているか調べるツールですね。

 

カプコン内部で開発されたユニットマネージャ(左)とプロファイラ(右)それぞれのスクリーンショット

 

 

 

Xbox 360とPCの違い
そしてWindows XPとVistaの違い

 

4Gamer
 MT Framewrokの開発を始めたときに使っていたCPUは何ですか?

 

石田智史氏
 当時はPentium Dもなくて,Hyper-Threading(※Hyper-Threading Technology対応Pentium 4のこと)しかなかったと思います。

 

伊集院 勝氏
 もともとHyper-Threadingというのはあまり効率のいいシステムではなかったので,並列化してもパフォーマンスはそれほど上がらなかったですね。

 

石田智史氏
 だいたい1.3倍くらいでしたよね。当時はデュアルコアのシステムがなかったので,コアを増やしたときに本当に効率よく動くのか検証できなかったんです。
 その後,インテルさんから4コアCPUを提供いただいたときは,妙にパフォーマンスが出なくて,なんだこれは,と(笑)

 

竹内康人氏
 出なかった,なるほど……。それはなぜだったんでしょう。

 

石田智史氏
 調べたところ,クリティカルセクション(※クリティカルセクションオブジェクトのこと。詳細は後述)の処理が,Xbox 360と比べて非常に重いということが分ったんですよ。それで,コアな部分ではできるだけクリティカルセクションを使わないように書き換えたんです。これで,かなりパフォーマンスが上がりました。

 

4Gamer
 Xbox 360のOSは“軽量”でしょうから,PC用のWindowsより軽いというのはある話ですね。

 

石田智史氏
 とくにWindows XPが重いんですよ。スレッドがアイドルになった後,復帰するとき,Windows XPには大きなオーバーヘッドがあるんじゃないかと思うんですが……。

 

4Gamer
 ゲームの開発者から見て,Windows XPとWindows Vistaは違いますか?

 

石田智史氏
 基本的には同じです。ですが,マルチコアに関していえばVistaのほうが優れてるんじゃないかという印象はありますね。スレッドのスケジューリングが改良されているんじゃないか,と。XPでは少しネックがあるだけで急激にパフォーマンスが落ち込んでしまうことがあります。

 

4Gamer
 Vistaでは「スレッドのスケジューラが変えられているのではないか」という話は確かにありますね。

 

竹内康人氏
 スレッドのコンテキストの復帰に時間がかかるんでしょう。
 スレッド間の排他制御にカーネルオブジェクト(※Mutexのこと。詳細は後述)を使うと,もっとパフォーマンスは悪化します。ユーザーモードとカーネルモードの切り替えという大きなオーバーヘッドが加わりますから。そのあたりを理解して,必要最低限の同期メカニズムを使ったスレッド化を行わないとパフォーマンスは上げられないんです。

 

石田智史氏
 スレッドの同期にインターロック系APIを利用するよう切り替えたら,かなり速くなりました。

 

4Gamer
 そのあたりのAPIはXbox 360とWindowsで共通ですか?

 

石田智史氏
 ですね。ほぼ同じです。

 

4Gamer
 では,Xbox 360とPCでマルチスレッド化に関して違いはありましたか?

 

ヒートスプレッダを外した状態のCore 2 Quad。デュアルコアのダイを2個搭載して,クアッドコアCPUとしていることが分かる

石田智史氏
 Xbox 360とWindowsはCPUが違いますよね。Xbox 360のCPUはL2キャッシュを三つのCPUコアで共有しています。だから速い。Core 2 Quadは,(CPUコアは四つあるが,2コアずつ)L2キャッシュが独立しているので,そのオーバーヘッドがかなり大きいんです。Core 2 Duoだとシングルコアに対して1.8倍のパフォーマンス向上を実現できるんですけど,Core 2 Quadだと(シングルコアに対して)2.3倍くらいしか出ない。

 

竹内康人氏
 そうですね,L2キャッシュをシェアさせなければならない場合は,スレッドを特定のコアに貼り付けてしまうなど,かなり手間がかかる最適化の方法を使わないと……。

 

4Gamer
 確かにWindowsだと,スレッドを走らせるコアを強制的に指定できますね。それを使ってデータを共有するスレッドをL2を共有するコアに限定してしまおう,というわけですか。

 

石田智史氏
 それは試しています。ですが複数のオブジェクト間で同期を取る必要があるので,思うような結果が得られなかったんですよ。

 

齊藤康幸氏
 オブジェクト間で同期を取るというのは,アプリケーション(※MT Framework上に作成されたゲームのこと)側からはコントロールできないんです。アプリケーションからMT Frameworkに渡した後,MT Framework側が処理してしまうんで。
 だから,スレッドが一つのL2キャッシュを共有するコアで動いているように,アプリケーションから見えるようなCPUにしていただけると助かるなあ,と。

 

4Gamer
 “二つのデュアルコア”間でL2キャッシュの同期を取る動作は,かなりペナルティが大きいんですね。

 

石田智史氏
 大きいですね。

 

竹内康人氏
 我々としても早く改善した製品を出したいと……(苦笑)

 

4Gamer
 ところで,速くならないとのことですが,4Gamerの最大8コアのテストでは,6コアまでスケーラブルにパフォーマンスが伸びています。ほかのゲームタイトルと比べると,決して悪い結果ではないと思うのですが。

 

石田智史氏
 でも,8コアなら600%くらいの性能が欲しくならないですか?

 

伊集院 勝氏
 4コアだったら300%の伸びが欲しいって言うわけです。「230%しか伸びていない,これは変だよ」って言うんですよ彼は(笑)

 

竹内康人氏
 ただ,クアッドコアでシングルコアの2.3倍というのは,インテルで期待しているスケーラビリティ――詳細な数値はお話しできないのですが――に十分応えていただいています。胸を張っていい値だと思いますよ。

 

石田智史氏
 しかし230%というのは……なんか物足りなくないですか?

 

伊集院 勝氏
 なかなか満足しない人で(笑)

 

 

 ……いかにも開発者と技術者らしい,濃い話が展開されてきたが,さすがにちょっと着いていけなくなったという読者もいるのではなかろうか。というわけで,ここで少々説明しておきたい。

 ある種の処理を複数のスレッドに分割して実行するとき,それぞれのスレッドが同じデータを共有しなければならない場合がある。例えばゲームに「敵キャラを動かすスレッド」というものがあるとしよう。
 このとき,敵キャラを動かすときには,「動いたよ」という情報を座標データに反映させなければならないのだが,マルチスレッドでは複数の「敵キャラを動かすスレッド」が独立して動いているので,データを反映させるタイミングが非常に難しくなる。画面に敵キャラが複数登場するような局面では,へたをすると敵キャラ同士の座標が衝突してしまいかねないことは容易に想像できると思う。

 このように,二つ以上のスレッドで共有しているデータが,同時に書き換えられる問題を引き起こしてしまうような部分(=処理の範囲)を「クリティカルセクション」という。
 逆にいうと,同じデータを共有しない処理=依存関係のない処理は,スレッド化しやすいのだが,現実はなかなかそうもいかないのである。

 データの依存関係の問題を解決するには,あるスレッドがデータを書き換えるときに,ほかの全スレッドに「書き換えるぞ」と警告しておいて書き換え,さらに「書き換え終わったぞ」と全スレッドに伝達する必要がある。これを「スレッド間の同期を取る」などという。
 Windows APIには,この同期を取るいくつかの方法が用意されている。詳細はかなり難しくなるので本稿では説明しないが,具体的にはクリティカルセクションオブジェクト,インターロック系API,Mutex(カーネルオブジェクト)といったあたりが,その代表例だ。

 ところで,スレッド間で参照される共通のデータは当然ながらキャッシュメモリに存在していたほうがパフォーマンス的に有利になる。L2キャッシュの共有が2コアずつとなるCore 2 Quadでは,二つの独立したデュアルコアCPUそれぞれのL2キャッシュに参照データが分離して入る形になる。
 片側のコアでデータが書き換えられると,外部バスを通じて一方のコアのL2キャッシュにデータを反映させなければならないが,このペナルティはゲームにおいてかなり大きいようだ。

 さて,次の段落以降では,開発者から見るPCハードウェアや,PCというプラットフォームそのものについての話になっていく。もう少しお付き合いを。

 

1 2

 

タイトル ロスト プラネット エクストリーム コンディション
開発元 カプコン 発売元 カプコン
発売日 2007/07/12 価格 7340円(税込)
 
動作環境 OS:Windows XP/Vista(+DirectX 9.0c以上),CPU:Hyper-Threading Technology対応Pentium 4以上[Core 2 Duo推奨],メインメモリ:512MB以上[1GB以上推奨](Windows Vistaでは1GB以上[2GB以上推奨]),グラフィックスチップ:GeForce 6600以上(GeForce 7300を除く)[GeForce 8600以上推奨],HDD空き容量:8GB以上,ネットワーク環境:1Mbps以上,ゲームパッド「Xbox 360 Controller for Windows」の利用を推奨

Character Wayne by (C)Lee Byung Hun /BH Entertainment CO., LTD, RIGHTS RESERVED. (C)CAPCOM CO., LTD. 2006,2007 ALL RIGHTS RESERVED.

【この記事へのリンクはこちら】

http://www.4gamer.net/specials/capcom_x_intel/capcom_x_intel_01.shtml