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のキャプチャリングシステムで,各スレッドが,時分割でどこで動いているかが分かる。ちゃんと並列化されているかが分かるようになっているんです。
竹内康人氏:
そうだったんですか。
石田智史氏:
こちらで作ったのは,ユニットマネージャとプロファイラ……どの処理がどれくらい時間がかかっているか調べるツールですね。