NavData 生成を並列化する

NavData 生成システムは高速性を十分に考慮して設計されており、大きな地形であっても、生成時間がプロダクション ワークフローまたはパイプラインの問題になることはありません。ですが、更に高速に処理をすることもできます。そのために、システムには生成プロセスのさまざまな部分を複数のプロセッサで並列処理する機能が用意されています。

Gameware Navigation では、Intel のオープンソース ライブラリである Threading Building Blocks (TBB)を使用することにより、ホスト マシンの複数のコアで NavData を生成することができるようになっています。NavData 生成システムの API を独自のツールに統合する場合は、フレームワークを拡張して、並列計算を管理するための異なるサードパーティ ユーティリティを利用することもできます。

原理的には、生成プロセスを複数のコアに分割すると、使用できるコアの数に正比例して生成時間を短縮できます。ただし、NavData 生成の前処理フェーズと後処理フェーズは並列化できないため、実際に短縮される時間は、それほど長くないと感じるかもしれません。どのような場合でも、並列計算を使用すると速度が大幅に上昇します。特に、大きい地形の場合は顕著です。

複数のプロセッサで生成する方法

複数プロセッサの使用に関する手順と考慮事項は、Navigation Lab または NavData 生成システムの API のどちらを使用するかにより若干異なります。

Navigation Lab を使用する

マルチプロセッサの生成は、Navigation Lab ではデフォルトで有効になっています。

Navigation Lab で複数のプロセッサでの NavData の生成を有効または無効にするには:

  1. Generation ウィンドウで、Run グループを展開します。
  2. Use multi-core チェックボックスをオンまたはオフにします。

Navigation Lab は、TBB を内部的に使用して、NavData の生成をコンピュータで利用できるすべてのプロセッサに分散させます。

マルチコアの対応は、スタンドアロン ツールのリリース ビルドでのみ使用できることに注意してください。TBB のデバッグ ビルドは実行速度が非常に遅いことがわかっているため、スタンドアロン ツールのデバッグ ビルドは、常に、TBB を使用せず、単一のプロセッサで順番に NavData を生成します。

C++ の Generator をTBBと一緒に使用する

統合フェーズ 6: NavData 生成 API を使用する」の NavData 生成システムの API を統合する手順を実行している場合は、既に TbbParallelForInterface クラスを介して TBB を使用するように設定されています。

次の点に注意してください。

  • TbbParallelForInterface クラスはリリース ビルドでのみ TBB を使用して計算を分散します。TBB のデバッグ ビルドは実行速度が非常に遅いことがわかっているため、デバッグ ビルドの TbbParallelForInterface は、常に、TBB を使用せず、単一のプロセッサで順番に NavData を生成します。
  • GeneratorInputOutput::m_runOptions からアクセスできる GeneratorRunOptions オブジェクトで、次の点を確認します。

    • GeneratorRunOptions::m_doMultiCore クラス メンバーの値に、true が設定されている(デフォルト)。
    • 中間ファイルを生成しないように GeneratorRunOptions が構成されている(デフォルト)。中間ファイルが要求されると、並列化は自動的に無効になります。

C++ の Generator をカスタム インタフェースと一緒に使用する

カスタム ユーティリティを使用して並列計算を管理するには:

  1. IParallelForInterface クラスのカスタム実装を作成します。作成するクラスでは、Generator からジョブを受け取り、並列化システムを操作して各ジョブが実行されるように管理します。

    詳細については、IParallelForInterface クラスの説明を参照してください。さらに、TbbParallelForInterface の実装の完全なソース コードが提供されているので、この実装をモデルとして独自のクラスを作成できます。

  2. NavData 生成コードで、Generator を作成する前に IParallelForInterface クラスのインスタンスを作成し、Generator のコンストラクタにパラメータとして渡します。
  3. GeneratorInputOutput::m_runOptions からアクセスできる GeneratorRunOptions オブジェクトで、次の点を確認します。

    • GeneratorRunOptions::m_doMultiCore クラス メンバーの値に、true が設定されている(デフォルト)。
    • 中間ファイルを生成しないように GeneratorRunOptions が構成されている(デフォルト)。中間ファイルが要求されると、並列化は自動的に無効になります。

その他のカスタム並列化システムの要件が満たされているかどうかは、ご自身でご確認頂く必要があります。