パフォーマンスを向上するため MPI アプリケーションを解析

同カテゴリーの次の記事

メモリー・バス・トランザクション

この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Analyzing MPI Applications to Improve Performance」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS 環境でも十分ご利用いただけます。また、構成は英語版のヘルプと同じ階層構造にしてあります。


ハイパフォーマンス・コンピューティング (HPC) アプリケーションは、現代のクラスターのマルチノード・アーキテクチャーにしばしば影響されます。このようなアプリケーションのチューニングは、単一ノードのパフォーマンス解析に加え、ノード間でのアプリケーションの動作を解析する必要があります。インテル® Parallel Studio XE Cluster Edition は、そのようなパフォーマンス解析に有用な MPI Performance Snapshot、インテル® Trace Analyzer & Collector、およびインテル® VTune™ Amplifier などの解析ツールを提供しており、MPI アプリケーションのパフォーマンス解析を詳しく調査するのに役立ちます。次に例を示します。

  • MPI Performance Snapshot では、MPI アプリケーションのパフォーマンスの概要を素早く調査できます。
  • インテル® Trace Analyzer & Collector は、メッセージ・パッシング・インターフェイス (MPI) の利用効率、通信のホットスポット、同期のボトルネック、負荷バランスなどを調査します。
  • インテル® VTune™ Amplifier は、スレッド化、メモリー、およびベクトル化効率メトリックなど、ノード内のパフォーマンスに注目します。

注:

インテル® Parallel Studio XE Cluster Edition に含まれるインテル® MPI のバージョンは、mpirun にデフォルトで Hydra プロセス管理を使用します。これは多数のノード間にまたがる高いスケーラビリティーを提供します。

ここでは、MPI アプリケーションを解析するためインテル® VTune™ Amplifier のコマンドライン・ツールを使用する方法に注目します。そのほかの解析ツールについては、「関連情報」セクションをご覧ください。

計算リソースをより効率良く使用するため、MPI プロセスとスレッド化が混在するハイブリッド・コードの解析を始める場合、インテル® VTune™ Amplifier を使用してスレッド化を含む単一ノードの解析を使用します。HPC Performance Characterization (HPC パフォーマンス特性) 解析 (英語) は、CPU 利用率、メモリーアクセス、およびベクトル化効率を理解し、パフォーマンスのギャップに注目してチューニングの方針を定義するのに適しています。CPU 利用率のセクションは、MPI インバランスのメトリックを含んでいます。これは、MPICH ベースの MPI 向けに計算されています。今後のステップには、インテル® Trace Analyzer & Collector による MPI 通信効率の調査、メモリーの問題をさらに詳しく調査するMemory Access (メモリーアクセス) 解析 (英語)、マイクロアーキテクチャーの問題を特定するGeneral Exploration (一般) 解析 (英語)、またはベクトル化のチューニングの詳細を探るインテル® Advisor などが考えられます。

これらの基本的な手順で、インテル® VTune™ Amplifier を使用して MPI アプリケーションのインバランスの問題を解析します。

  1. インテル® VTune™ Amplifier による MPI 解析の設定と実行
  2. MPI モジュールのシンボル解決
  3. 収集されたデータを表示する

MPI 解析における追加情報を調査:

インテル® VTune™ Amplifier による MPI 解析の設定

インテル® VTune Amplifier で MPI アプリケーションのパフォーマンス・データを収集するには、コマンドライン・インターフェイス (amplxe-cl) を使用します。インテル® VTune™ Amplifier ユーザー・インターフェイスの [Analysis Target (解析ターゲット)] 設定オプションで収集の設定を行います。詳細に関しては、「任意のターゲットの設定」 (英語) を参照してください。

通常、MPI ジョブは mpirunmpiexecsrunaprun などの MPI ランチャーで開始されます。ここでは、mpirun を使用して説明します。一般に MPI ジョブの起動には次の構文が使用されます。

mpirun [options] <program> [<args>]

インテル® VTune™ Amplifier は、<program> として起動され、アプリケーションはインテル® VTune™ Amplifier のコマンドライン引数を使用して起動されます。インテル® VTune™ Amplifier を使用して、MPI アプリケーションを起動するには次の構文を使用します。

mpirun [options] amplxe-cl [options] <program> [<args>]

mpirunamplxe-cl には、必須または強く推奨されるいくつかのオプションがあります。一般にコマンドは次の構文を使用します。

mpirun -n <n> -l amplxe-cl -quiet -collect <analysis_type> -trace-mpi -result-dir <my_result> my_app [<my_app_options>]

mpirun には次のオプションがあります。

  • <n> は、実行する MPI プロセス数です。
  • mpiexec/mpirun ツールの -l オプションは、MPI ランクを stdout 行に表示します。このオプションは推奨されますが、必須ではありません。

amplxe-cl には次のオプションがあります。

  • -quiet / -q オプションは、進行状況などの診断メッセージの出力を抑制します。このオプションは推奨されますが、必須ではありません。
  • -collect <analysis type> は、インテル® VTune™ Amplifier で実行する解析タイプを指定します。利用可能な解析タイプのリストを見るには、amplxe-cl -help collect コマンドを使用します。
  • -trace-mpi は、結果ディレクトリー名にサフィックスを追加し、結果中のプロセス名にランク番号を追加します。インテル以外の MPI を起動するにはこのオプションが必要です。
  • -result-dir <my_result> は、解析結果が保存されているディレクトリーへのパスを指定します。

MPI アプリケーションが複数のノードで起動される場合、インテル® VTune™ Amplifier は、my_result.<hostname1>、my_result.<hostname2>、…my_result.<hostnameN>、の形式で現在のディレクトリーに計算ノードごとに結果ディレクトリーを作成します。同じディレクトリー上で実行されるすべてのランクデータがカプセル化されます。例えば、Advanced Hotspots (高度なホットスポット) 解析を 4 つのノードで実行し、各計算ノード上でデータを収集します。

> mpirun -n 16 –ppn 4 –l amplxe-cl -collect advanced-hotspots -trace-mpi -result-dir my_result -- my_app.a

それぞれのプロセスデータは、それらが実行されたノードに対応します。

my_result.host_name1 (rank 0-3)
my_result.host_name2 (rank 4-7)
my_result.host_name3 (rank 8-11)
my_result.host_name4 (rank 12-15)

特定のランクをプロファイルしたい場合 (MPI Performance Snapshot で定義される外れ値ランクなど)、ランクを選択してプロファイルを行います。複数バイナリーの MPI 実行を使用し、対象とするランクでインテル® VTune™ Amplifier のプロファイルを行います。これは、解析処理に必要なデータ量を大幅に減少させます。次の例は、ノードあたり 1 ランクで 16 プロセス中の 2 つのプロセスの高度なホットスポット解析データを収集します。

export VTUNE_CL=amplxe-cl -collect memory-access -trace-mpi -result-dir my_result
$ mpirun -host myhost1 -n 7 my_app.a : -host myhost1 -n 1 $VTUNE_CL -- my_app.a :-host myhost2 -n 7 my_app.a : -host myhost2 -n 1 $VTUNE_CL -- my_app.a

例えば、次の内容で設定ファイルを作成します。

# config.txt configuration file
-host myhost1 -n 7 ./a.out
-host myhost1 -n 1 amplxe-cl -quiet -collect memory-access -trace-mpi -result-dir my_result ./a.out
-host myhost2 -n 7 ./a.out
-host myhost2 -n 1 amplxe-cl -quiet -collect memory-access -trace-mpi -result-dir my_result ./a.out

設定ファイルを使用して収集を行うには、次のコマンドラインを使用します。

> mpirun -configfile ./config.txt

インテル® MPI のバージョン 5.0.2 以降を使用している場合、インテル® MPI プロセスランチャーと -gtool オプションを使用して簡単にプロファイルを行うランクを選択できます。

> mpirun -n <n> -gtool "amplxe-cl -collect <analysis type> -r <my_result>:<rank_set>" <my_app> [my_app_options]

<rank_set> には、ツールを実行するランクの範囲を指定します。カンマで区切ったり、“-” で隣接するランクのセットを指定できます。

例:

> mpirun -gtool "amplxe-cl -collect memory-access -result-dir my_result:7,5" my_app.a

例:

  1. この例は、推奨される最初の解析である、HPC パフォーマンス特性解析タイプを (サンプリング・ドライバーをベースに) 実行します。
    > mpirun -n 4 amplxe-cl -result-dir my_result -collect hpc-performance -- my_app [my_app_options]
    
  2. ホストに分散されるジョブの内、 myhost2 で実行される 16 プロセスの 2 つで高度なホットスポット・データを収集します。
    > mpirun -host myhost1 -n 8 ./a.out : -host myhost2 -n 6 ./a.out : -host myhost2 -n 2 amplxe-cl -result-dir foo -c advanced-hotspots ./a.out
    

    インテル® VTune™ は現在のディレクトリー foo.myhost2 に結果ディレクトリーを作成します (指定されたプロセスランク 14 と 15 が、2 番目のノードに配置されます)。

  3. 代替方法として、次のような設定ファイルを作成します。
    # config.txt configuration file
    -host myhost1 -n 8 ./a.out
    -host myhost2 -n 6 ./a.out
    -host myhost2 -n 2 amplxe-cl -quiet -collect advanced-hotspots -result-dir foo ./a.out
    

    そして、次のようにデータ収集を開始して、前述の例のように結果をアーカイブします。

    > mpirun -configfile ./config.txt
    

    foo.myhost2 結果ディレクトリーが作成されます。

  4. この例は、すべてのノード上のすべてのランクで、メモリー・オブジェクト・プロファイルとメモリーアクセス解析を実行します。
    > mpirun n 16 -ppn 4 amplxe-cl -r my_result -collect memory-access -knob analyze-mem-objects=true -my_app [my_app_options]
    
  5. この例は、ランク 1、4-6、10 上で高度なホットスポット解析を実行します。
    > mpirun –gtool "amplxe-cl -r my_result -collect advanced-hotspots: 1,4-6,10" –n 16 -ppn 4 my_app [my_app_options]
    

注:

上記の例では、mpiexec に対して mpirun コマンドを使用します。実際のジョブでは mpiexec* によって mpiexec.hydra が使用されます。mpirun は、mpiexec や mpiexec.hydra へディスパッチを行う上位レベルのコマンドであり、現在のデフォルトやオプションを引き渡すことができます。これらの例で使用されるすべての mpirun は、mpiexec* コマンドにも適用できます。

MPI モジュールのシンボル解決

データ収集後、インテル® VTune™ Amplifier は自動的にデータをファイナライズ (シンボル参照を解決しデータベースに変換) します。これは、コマンドライン収集が実行された同じ計算ノード上で行われます。インテル® VTune™ Amplifier は、自動的にバイナリーとシンボルファイルの場所を特定します。ほかの場所に保存されているシンボルファイルを使用する場合、-search-dir オプションを使用して適切な検索パスを指定します。

> mpirun -np 128 amplxe-cl -q -collect hotspots -search-dir /home/foo/syms ./a.out

収集されたデータを表示する

一度結果が収集されると、インテル® VTune™ Amplifier の GUI またはコマンドライン・インターフェイスを使用して結果を開くことができます。

結果をコマンドライン・インターフェイスで表示する手順は、次のとおりです。

-report オプションを使用します。インテル® VTune™ Amplifier で利用可能なレポート機能を見るには、amplxe-cl -help report コマンドを使用します。

結果をグラフィカル・インターフェイスで表示する手順は次のとおりです。

[Menu (メニュー)] ボタン をクリックし、[Open (開く)] > [Result… (結果…)] を選択して、必要な結果ファイル (*.amplxe) を開きます。

ヒント:

結果をほかのシステムへコピーして参照することもできます (例えば、Linux* クラスターで収集された結果を Windows* ワークステーション上で開く)。

インテル® VTune™ Amplifier は、インテル® スレッディング・ビルディング・ブロック (インテル® TBB) や OpenMP* 関数のように、MPI 関数をシステム関数として分類します。これは、MPI そのものではなくアプリケーションのコードに集中するのに役立ちます。システム関数の表示を有効にし、MPI 実装の内部を解析して見るには、インテル® VTune™ Amplifier GUI の [Call Stack Mode (コールスタック・モード)] (英語) フィルターバーのコンボボックスや、CLI の call-stack-mode (英語) オプションを使用します。コールスタック・モード、[User functions+1 (ユーザー関数 + 1)] は、多くの CPU 時間の消費 (Basic Hotspots (基本ホットスポット) 解析) や、時間を浪費する (Locks and Waits (ロックと待機) 解析) MPI 関数を見つけるのに役立ちます。例えば、呼び出し階層 main() -> foo() -> MPI_Bar() -> MPI_Bar_Impl() -> … において、MPI_Bar() は実際の MPI API 関数であり、深い階層は MPI 実装の詳細を示します。コールスタック・モードは次のように動作します。

  • [Only user functions (ユーザー関数のみ)] コールスタック・モードは、どの関数を変更することで実際にパフォーマンスを改善できるようになるか、MPI 呼び出しで費やされた時間をユーザー関数 foo() に関連付けます。
  • [User functions+1] モード (デフォルト) は、負荷の高い MPI 呼び出しを容易に特定できるように、MPI 実装で費やされた時間を上位レベルのシステム関数 MPI_Bar() に関連付けます。
  • [User/system functions (ユーザーとシステム関数)] モードは、実際に MPI ライブラリーのどこで時間が費やされたかを特定できるように、再度関連付けせずに呼び出し階層を表示します。

注:

インテル® VTune™ Amplifier は、プロファイル・バージョンの MPI 関数にプリフィクス P を追加します (例: PMPI_Init)。

インテル® VTune™ Amplifier はインテル® TBB と OpenMP* をサポートします。クラスター全体で CPU リソースの利用を最大化するため、MPI スタイルの並列処理に加え、スレッドレベルの並列処理を使用し、インテル® VTune™ Amplifier を使用して並列処理レベルのパフォーマンスを解析することが推奨されます。インテル® VTune™ Amplifier において MPI、OpenMP*、およびインテル® TBB の機能は独立しているため、MPI プロセスで収集された結果を調査する際に、すべての OpenMP* とインテル® TBB の機能が適切にサポートされます。OpenMP* および MPI を使用するハイブリッド型のアプリケーションでは、インテル® VTune™ Amplifier は、OpenMP* メトリックを持つ MPI ランクのサマリーテーブルを、MPI Busy Wait (英語) を昇順にソートして表示します。通信時間が短いほど、プロセスが MPI アプリケーションを実行するクリティカル・パスは長くなります。さらに詳しく調査するには、クリティカル・パスにある MPI プロセスの OpenMP* 解析 を行ってください。

例:

この例は、すべての解析タイプで関数とモジュール解析のパフォーマンス・レポートを表示します。この例は、ノードごとの結果ディレクトリー (result_dir.host1result_dir.host2) を開き、ノードごとの結果から処理された mpi ランクをカプセル化してデータをグループ化します。

< amplxe-cl -R hotspots -group-by process,function -r result_dir.host1

< amplxe-cl -R hotspots -group-by process,module -r result_dir.host2

MPI 実装のサポート

インテル® VTune™ Amplifier を使用して、インテル® MPI ライブラリーの実装とほかの MPI 実装の両方を解析できます。その場合、次の点に留意してください。

  • インテル® MPI ライブラリーを使用する場合、インテル® VTune™ Amplifier は MPI 関数/モジュールをシステム関数/モジュールとして分類し ([User functions+1] オプションの場合)、それらの時間をシステム関数として属性化します。このオプションは、インテル以外の MPI 実装のモジュールと関数には適用されません。.その場合インテル® VTune™ Amplifier は、デフォルトで内部 MPI 関数とモジュールを表示します。
  • インテル以外の MPI 実装では、このヘルプで示すコマンドラインの例を調整する必要があるかもしれません。例えば、異なるプロセスランクでジョブ中のプロセス数を制限するコマンドラインは、変更する必要があります。
  • ランチャープロセス (mpirun/mpiexec) とアプリケーション・プロセスの間にインテル® VTune™ Amplifier プロセス (amplxe-cl) がある場合、MPI 実装で操作する必要があります。これは、多くの MPI 実装で行われるように環境変数を使用して通信情報を渡すべきであることを意味します。インテル® VTune™ Amplifier は、親プロセスから通信情報を受け取るような MPI 実装では動作しません。

インテル® VTune™ Amplifier で認識される MPI システムモジュール

インテル® VTune™ Amplifier は、MPI 実装モジュールを分類するため、次のような Perl 構文の正規表現を使用します。

  • impi\.dll
  • impid\.dll
  • impidmt\.dll
  • impil\.dll
  • impilmt\.dll
  • impimt\.dll
  • libimalloc\.dll
  • libmpi_ilp64\.dll

注:

このリストは参考のために記載しています。バージョンによって異なる可能性があります。

解析の制限

  • インテル® VTune™ Amplifies は、MPI の動的解析をサポートしていません (例えば、MPI_Comm_spawn などの動的なプロセス API)。

関連情報

MPI アプリケーション解析のさらに詳しい情報については、インテル® Parallel Studio XE Cluster Edition のドキュメントと MPI のオンライン・ドキュメント (http://software.intel.com/en-US/articles/intel-mpi-library-documentation/ (英語)) をご覧ください。

また、インテル® VTune™ Amplifier とインテル® Parallel Studio XE Cluster Edition に含まれるその他のツールの使い方についても、オンラインのリソースが用意されています。

関連項目

MPI アプリケーション解析のワークフロー
検索ディレクトリーを指定 (英語) (コマンドラインから)
OpenMP* 解析データの解釈 (英語) (ハイブリッド OpenMP* と MPI アプリケーションを含む)
MPI ビジー待機時間 (英語)
HPC パフォーマンス特性解析 (英語)
HPC パフォーマンス特性のデータを解釈する (英語)

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事

  • MPI Performance Snapshot クイックスタートMPI Performance Snapshot クイックスタート この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「MPI Performance Snapshot Quick Start」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS […]
  • Application Performance Snapshot クイックスタート (プレビュー機能)Application Performance Snapshot クイックスタート (プレビュー機能) この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Application Performance Snapshot Quick Start (Preview)」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS […]
  • Storage Performance Snapshot クイックスタート (プレビュー機能)Storage Performance Snapshot クイックスタート (プレビュー機能) この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Storage Performance Snapshot Quick Start (Preview)」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS […]
  • OpenMP* アプリケーションの解析OpenMP* アプリケーションの解析 この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Analyzing OpenMP* Applications」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS […]
  • パフォーマンス解析の設定パフォーマンス解析の設定 この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Performance Analysis Setup」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS […]