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 インバランスのメトリックが含まれます。さらに追加のステップとして、インテル® Trace Analyzer & Collector で MPI 通信効率、メモリーアクセス解析でメモリーの問題、マイクロアーキテクチャー全般解析でマイクロアーキテクチャーの問題、またはインテル® 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 ジョブは、mpirun、mpiexec、srun、aprun などの MPI ランチャーを使用して開始されます。ここでは、mpirun を使用する例を示します。MPI ジョブは次のような構文を使用します。

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

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

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

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

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

例:

この例は、任意の解析タイプで解析された関数とモジュールのパフォーマンス・レポートを表示します。この例は、ノードごとの結果ディレクトリー (result_dir.host1、result_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 ライブラリー実装の両方を解析できます。この場合、次のことに注意してください。

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

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

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

解析の制限

関連情報

MPI アプリケーション解析の詳細は、インテル® Parallel Studio XE Cluster Edition のドキュメントおよびオンラインの MPI ドキュメント (https://www.intel.com/content/www/us/en/developer/tools/oneapi/mpi-library-documentation.html (英語)) を参照してください。インテル® VTune™ プロファイラーをクラスター環境にインストールする方法については 『インテル® VTune™ プロファイラー・インストール・ガイド for Linux*』 (英語) を参照してください。

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

関連情報