インテル® VTune™ プロファイラー・ユーザーガイド

MPI コードの解析

インテル® VTune™ プロファイラーのコマンドライン・インターフェイス (vtune) を使用して、MPI アプリケーションをプロファイルします。

並列ハイパフォーマンス・コンピューティング (HPC) アプリケーションは、現代のクラスターの複数ノード・アーキテクチャーに関連することがあります。このようなアプリケーションのチューニングでは、単一ノードのパフォーマンス解析だけではなく、ノード間のアプリケーションの動作を解析する必要があります。インテル® Parallel Studio XE Cluster Edition には、アプリケーション・パフォーマンス・スナップショット、インテル® Trace Analyzer & Collector、およびインテル® VTune™ プロファイラーなど、MPI アプリケーションのパフォーマンス解析に役立つ情報を提供するパフォーマンス解析ツールが含まれています。次に例を示します。

インテル® Parallel Studio XE Cluster Edition に同梱されているインテル® MPI ライブラリーのバージョンでは、mpirun でデフォルトで Hydra プロセス・マネージャーを使用するように切り替えられています。これにより、多数のノードで高いスケーラビリティーがもたらされます。

ここでは、インテル® VTune™ プロファイラーのコマンドライン・ツールを使用して、MPI アプリケーションを解析する方法を説明します。ほかの解析ツールの詳細については、「関連情報」をご覧ください。

並列 MPI プロセスとスレッドを組み合わせたハイブリッド・コードを解析する場合、スレッド化された単一ノードの解析にインテル® VTune™ プロファイラーを使用すると、計算リソースをより効率良く活用できます。HPC パフォーマンス特性解析は、CPU 利用率、メモリーアクセス、およびベクトル化効率を理解し、パフォーマンスの相違に対処するチューニング方針を決定するのに適した出発点です。CPU 利用率セクションには、MPICH ベースの MPI を基に計算された MPI インバランスのメトリックが含まれます。MPI 通信効率を調査するにはインテル® Trace Analyzer & Collector、メモリーの問題を深く調べるにはメモリーアクセス解析、マイクロアーキテクチャーの問題を調べるにはマイクロアーキテクチャー全般解析、またはベクトル化固有のチューニングの詳細を調べるにはインテル® Advisor を使用するなど、追加のステップがあります。

インテル® VTune™ プロファイラーでインバランスの問題を特定するため MPI アプリケーションを解析するには、これらの基本手順に従ってください。

  1. Linux* ホスト上の MPI 解析向けにインストールを構成します。

  2. インテル® VTune™ プロファイラーを使用して MPI 解析を設定および実行します。

  3. MPI_Pcontrol 関数を使用して収集を制御します。

  4. MPI モジュールのシンボルを解決します。

  5. 収集されたデータを表示します。

MPI 解析に関連する追加情報を調査します。

Linux* ホスト上の MPI 解析向けにインストールを構成

Linux* クラスター上の MPI アプリケーション解析では、インテル® Parallel Studio XE Cluster Edition をインストールする際に、ユーザーごとのハードウェア・イベントベース・サンプリング・モードを有効にできます。このオプションは、収集中にインテル® VTune™ プロファイラーが現在のユーザーのデータのみを収集することを確実にします。インストール中に管理者によって有効にされると、通常ユーザーはこのモードを無効にすることができません。これは、ほかのユーザーのアクティビティーを含むノード全体のパフォーマンス・データを個々のユーザーが観察できないようにするためです。

インストール後、ターミナルセッションでそれぞれの vars.sh ファイルを使用して、適切な環境 (PATH、MANPATH) を設定できます。

インテル® VTune™ プロファイラーを使用して MPI 解析を設定

インテル® VTune™ プロファイラーを使用して、MPI アプリケーションのパフォーマンス・データを収集するには、コマンドライン・インターフェイス (vtune) を使用します。インテル® VTune™ プロファイラーのユーザー・インターフェイスのターゲット・オプションを使用して収集を設定できます。詳細は、「任意のターゲット」を参照してください。

通常、MPI ジョブは mpirunmpiexecsrunaprun などの MPI ランチャーを使用して開始されます。例では、mpirun を使用しています。MPI ジョブは次のような構文を使用します。

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

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

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

mpirunvtune には、必須もしくは推奨されるいくつかのオプションがありますが、デフォルト設定を使用することもできます。通常、コマンドは次のような構文を使用します。

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

mpirun オプションには以下が含まれます。

vtune オプションには以下が含まれます。

MPI アプリケーションが複数のノードで起動されると、インテル® VTune™ プロファイラーは現在のディレクトリーに計算ノードごとの my_result.<hostname1>my_result.<hostname2>、... my_result.<hostnameN> という名前の結果ディレクトリーを作成し、それぞれノードで実行されたすべてのランクのデータを同じディレクトリー内にカプセル化します。例えば、4 ノードで実行されたホットスポット解析 (ハードウェア・イベントベース・サンプリング・モード) は、それぞれの計算ノードのデータを収集します。

mpirun -n 16 –ppn 4 –l vtune -collect hotspots -k sampling-mode=hw -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 実行により、注目するランクでインテル® VTune™ プロファイラーのプロファイルを行います。これにより、処理と解析のデータ量が大幅に軽減されます。次の例では、ノードあたり 1 ランクで、16 プロセス中の 2 つのプロセスのメモリー・アクセス・データを収集します。

export VTUNE_CL=vtune -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 vtune -quiet -collect memory-access -trace-mpi -result-dir my_result ./a.out
-host myhost2 -n 7 ./a.out
-host myhost2 -n 1 vtune -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 "vtune -collect <analysis type> -r <my_result>:<rank_set>" <my_app> [my_app_options]

<rank_set> にはツールを実行するランクの範囲を指定します。カンマでランクを区切るか、ハイフン ("-") でランクの範囲を指定します。

次に例を示します。

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

例:

  1. この例は、推奨されるチューニングの開始点である HPC パフォーマンス特性解析タイプ (サンプリング・ドライバー・ベース) を実行します。

    mpirun -n 4 vtune -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 vtune -result-dir foo -c hotspots -k sampling-mode=hw ./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 vtune -quiet -collect hotspots -k sampling-mode=hw -result-dir foo ./a.out

    次のようにデータ収集を実行します。

    mpirun -configfile ./config.txt

    前の例と同じ結果を得るため、foo.myhost2 結果ディレクトリーが作成されます。

  4. この例では、すべてのノードおよびランクでメモリーアクセス解析を実行し、メモリー・オブジェクトをプロファイルします。

    mpirun n 16 -ppn 4 vtune -r my_result -collect memory-access -knob analyze-mem-objects=true -my_app [my_app_options]

  5. この例は、ランク 1、4-6、10 でホットスポット解析 (ハードウェア・イベントベース・サンプリング・モード) を実行します。

    mpirun –gtool "vtune -r my_result -collect hotspots -k sampling-mode=hw : 1,4-6,10" –n 16 -ppn 4 my_app [my_app_options]

上記の例では、mpiexecmpiexec.hydra に対して mpirun コマンドを使用していますが、実際のジョブでは mpiexec* を使用することがあります。mpirun は、現在のデフォルトと指定されたオプションに応じて、mpiexecmpiexec.hydra をディスパッチする上位コマンドです。ここで提示するすべての例は、mpirun コマンドと同様に mpiexec* コマンドでも動作します。

MPI_Pcontrol 関数を使用して収集を制御

デフォルトでは、インテル® VTune™ プロファイラーは実行したアプリケーション全体の統計情報を収集します。特定のアプリケーション・フェーズの収集を有効または無効にすることが重要となることがあります。例えば、最も時間を要するセクションに注目したり、初期化や終了フェーズの収集を無効にしたりできます。これには、インテル® VTune™ プロファイラーのインストルメントとトレース・テクノロジー (ITT) を利用します。インテル® VTune™ Amplifier 2019 Update 3 以降では、標準の MPI_Pcontrol 関数を使用して MPI アプリケーションのデータ収集を制御できます。

コマンド構文:

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

データの収集が完了すると、インテル® VTune™ プロファイラーは自動的にデータをファイナライズ (シンボルを解決してデータベースに変換) します。これは、コマンドライン収集が実行された計算ノード上で行われます。そのため、インテル® VTune™ プロファイラーは自動的にバイナリーとシンボルファイルを検索します。ほかの場所に格納されているシンボルファイルを指定するには、-search-dir オプションを使用して検索ディレクトリーを追加します。

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

収集したデータを表示

結果が収集されたら、インテル® VTune™ プロファイラーのグラフィカル・インターフェイスまたはコマンドライン・インターフェイスで結果を開くことができます。

コマンドライン・インターフェイスで結果を表示:

-report オプションを使用します。利用可能なインテル® VTune™ プロファイラーのレポートリストを確認するには、インテル® VTune™ プロファイラーの -help report を使用します。

グラフィカル・インターフェイスで結果を表示:

メニューボタンをクリックし、[開く] > [結果...] を選択して、結果ファイル (*.vtune) を参照します。

ヒント

結果を異なるシステムにコピーして、そこで表示することもできます (例えば、Linux* クラスターで収集された結果を Windows* ワークステーションで開くなど)。

インテル® VTune™ プロファイラーは、インテル® TBB や OpenMP* 関数と同様に MPI 関数をシステム関数として分類します。これは、MPI 内部よりも開発したコードに注目するためです。インテル® VTune™ プロファイラー GUI の[コールスタック・モード] フィルターバー・コンボボックスと、CLI の call-stack-mode オプションを使用して、システム関数を表示して MPI 実装内部を表示および解析することもできます。コールスタック・モード [ユーザー関数+1] は、CPU 時間を最も消費した (ホットスポット解析) または浪費した (スレッド化解析) MPI 関数を特定するのに役立ちます。例えば、コールチェーン main() -> foo() -> MPI_Bar() -> MPI_Bar_Impl() -> ... で、MPI_Bar() は実際に使用している MPI API 関数であり、それよりも深い階層の関数は MPI 実装の詳細です。コールスタック・モードは次のように動作します。

インテル® VTune™ プロファイラーは、プロファイル・バージョンの MPI 関数にプリフィクス P を追加します。例えば、PMPI_Init のようになります。

インテル® VTune™ プロファイラーは、インテル® TBB と OpenMP* をサポートします。MPI スタイルの並列処理に加えて、スレッドレベルの並列化ソリューションを使用し、クラスター全体で CPU リソースの利用を最大化する場合、そのレベルの並列処理のパフォーマンスを解析するためインテル® VTune™ プロファイラーを使用することを推奨します。インテル® VTune™ プロファイラーの MPI、OpenMP*、およびインテル® TBB 向けの機能はそれぞれ独立しているため、MPI プロセスで収集された結果を調査する際に、OpenMP* とインテル® TBB でサポートされる機能は通常すべて利用できます。ハイブリッド OpenMP* + MPI アプリケーションでは、上位 MPI ランクと OpenMP* メトリックを MPI ビジー待機の降順でリストしたサマリーを示します。低い通信時間は、MPI アプリケーション実行のクリティカル・パスでプロセスが長い時間を費やしていることを示します。より深く解析するには、クリティカル・パスにある MPI プロセスの OpenMP* 解析を行います。

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

vtune -R hotspots -group-by process,function -r result_dir.host1
vtune -R hotspots -group-by process,module -r result_dir.host2

MPI 実装のサポート

インテル® VTune™ プロファイラーを使用すると、インテル® MPI ライブラリー実装と他の MPI 実装の両方を解析できます。この場合、次のことに注意してください。

インテル® VTune™ プロファイラーで認識される MPI システムモジュール

インテル® VTune™ プロファイラーは、Perf 構文の正規表現を使用して次の MPI モジュールを識別します。

このリストはリファレンス用です。告知なしにバージョンごとで変わる可能性があります。

解析の制限

関連情報

MPI アプリケーション解析の詳細については、インテル® Parallel Studio XE Cluster Edition のドキュメントとオンラインの MPI ドキュメント (http://software.intel.com/en-US/articles/intel-mpi-library-documentation/(英語)) で参照できます。インテル® VTune™ プロファイラーをクラスター環境にインストールする方法については インテル® VTune™ プロファイラー・インストール・ガイド (Linux* 版) (英語) を参照してください。

インテル® VTune™ プロファイラーを他のインテル® Parallel Studio XE Cluster Edition のツールと併用する方法を説明したオンラインリソースも提供されています。

関連情報