インテル® VTune™ プロファイラーのコマンドライン・インターフェイス (vtune) を使用して、MPI アプリケーションをプロファイルします。
並列ハイパフォーマンス・コンピューティング (HPC) アプリケーションは、現代のクラスターの複数ノード・アーキテクチャーに関連することがあります。このようなアプリケーションのチューニングでは、単一ノードのパフォーマンス解析だけではなく、ノード間のアプリケーションの動作を解析する必要があります。インテル® Parallel Studio XE Cluster Edition には、アプリケーション・パフォーマンス・スナップショット (英語)、インテル® Trace Analyzer & Collector、およびインテル® VTune™ プロファイラーなど、MPI アプリケーションのパフォーマンス解析に役立つ情報を提供するパフォーマンス解析ツールが含まれています。次に例を示します。
アプリケーション・パフォーマンス・スナップショットは、MPI アプリケーションのパフォーマンス概要を素早く示します。
インテル® Trace Analyzer & Collector は、通信ホットスポット、同期のボトルネック、ロードバランスなどメッセージ・パッシング・インターフェイス (MPI) の使用効率を調査します。
インテル® VTune™ プロファイラーは、スレッド化、メモリー、およびベクトル化効率を示すメトリックを使用して、ノード内のパフォーマンスに注目します。
インテル® 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 アプリケーションを解析するには、次の基本ステップに従ってください。
MPI 解析に関連する追加情報を調査:
Linux* クラスター上の MPI アプリケーション解析では、インテル® Parallel Studio XE Cluster Edition をインストールする際に、[ユーザーごとのハードウェア・イベントベース・サンプリング] モードを有効にできます。このオプションは、収集中にインテル® VTune™ プロファイラーが現在のユーザーのデータのみを収集するようにします。インストール中に管理者によって有効にされると、通常のユーザーはこのモードを無効にすることができません。これは、ほかのユーザーのアクティビティーを含むノード全体のパフォーマンス・データを個々のユーザーが観察できないようにするためです。
インストール後に、それぞれの vars.sh ファイルを使用して、現在のターミナルセッションで適切な環境 (PATH、MANPATH) を設定できます。
インテル® 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 オプションには以下が含まれます。
<n> は、実行する MPI プロセス数です。
mpiexec/mpirun ツールの -l オプションは、MPI ランクで標準出力行をマークします。このオプションを使用することを推奨しますが、必須ではありません。
vtune オプションには以下が含まれます。
-quiet/-q オプションは、進行状況メッセージのような診断出力を抑制します。このオプションを使用することを推奨しますが、必須ではありません。
-collect <analysis type> は、インテル® VTune™ プロファイラー で実行する解析タイプです。利用可能な解析タイプのリストを表示するには、-help collect コマンドを実行します。
-trace-mpi は、結果ディレクトリー名にノードごとのサフックスを追加し、結果プロセス名にランク番号を追加します。このオプションは、インテル以外の MPI ランチャーで必要です。
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
例:
この例は、推奨されるチューニングの開始点である HPC パフォーマンス特性解析タイプ (サンプリング・ドライバー・ベース) を実行します。
mpirun -n 4 vtune -result-dir my_result -collect hpc-performance -- my_app [my_app_options]
この例は、ホスト上で分散された 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 番目のノードに割り当てられると仮定します)。
または、次の内容で設定ファイルを作成することもできます。
# 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 結果ディレクトリーが作成されます。
この例は、すべてのノードおよびランクでメモリーアクセス解析を実行し、メモリー・オブジェクトをプロファイルします。
mpirun n 16 -ppn 4 vtune -r my_result -collect memory-access -knob analyze-mem-objects=true -my_app [my_app_options]
この例は、ランク 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]
上記の例は、mpiexec と mpiexec.hydra ではなく mpirun コマンドを使用していますが、実際のジョブでは mpiexec* を使用することがあります。mpirun は、現在のデフォルトと指定されたオプションに応じて、mpiexec や mpiexec.hydra をディスパッチする上位コマンドです。リストされているすべての例は、mpirun コマンドと同様に mpiexec* コマンドでも動作します。
デフォルトでは、インテル® VTune™ プロファイラーは実行したアプリケーション全体の統計情報を収集します。状況によっては、特定のアプリケーションのフェーズの収集を有効または無効にすることが重要です。例えば、最も時間がかかるセクションに注目したり、初期化またはファイナライズ・フェーズの収集を無効にする場合です。この設定には、インテル® VTune™ プロファイラーのインストルメントとトレース・テクノロジー (ITT) を利用します。インテル® VTune™ Amplifier 2019 Update 3 から、標準 MPI_Pcontrol 関数を利用して 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 実装の詳細です。コールスタック・モードは次のように動作します。
[ユーザー関数のみ] コールスタック・モードは、MPI 呼び出しで費やされた時間をユーザー関数 foo() に関連付けるため、パフォーマンスを向上するにはどの関数を改善すべきか分かります。
デフォルトの [ユーザー関数+1] モードは、MPI 実装に費やされた時間を最上位のシステム関数 MPI_Bar() に分類するため、過度な MPI 呼び出しを容易に特定できます。
[ユーザー/システム関数] モードでは、関連付けされていない呼び出しツリーが表示されるため、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
インテル® VTune™ プロファイラーを使用すると、インテル® MPI ライブラリー実装の両方を解析できます。この場合、次のことに注意してください。
Linux* のみ: インテル® VTune™ プロファイラーは、PMI_RANK または PMI_ID 環境変数 (設定されているほう) に基づいて、取得したランク番号でプロセス名を拡張します。これは、インテル® VTune™ プロファイラーの結果の複数のランクを識別するのに役立ちます。プロセスの命名規則は、<process_name> (rank <N>) です。これらの環境変数を提供しない MPI 実装で MPI ランク ID を検出できるようにするには、-trace-mpi オプションを使用します。
インテル® MPI ライブラリーを使用する場合、インテル® VTune™ プロファイラーは MPI 関数/システム関数モジュール/モジュール (ユーザー関数+1 オプション) として分類し、それらの時間をシステム関数に関連付けます。このオプションは、非インテル MPI 実装のすべてのモジュールや関数に対応するわけではありません。この場合、インテル® VTune™ プロファイラーは、デフォルトで内部 MPI 関数とモジュールを表示する場合があります。
インテル以外の MPI 実装を使用する場合、このヘルプセクションのコマンドライン例を調整 (変更) する必要があるかもしれません。例えば、ジョブ内のプロセス数を制限するため、プロセスのランクを調整します。
MPI 実装は、ランチャープロセス (mpirun/mpiexec) とアプリケーションの間にインテル® VTune™ プロファイラーのプロセス (vtune) がある場合に動作する必要があります。つまり、多くの MPI 実装と同様に、通信情報は環境変数を介して渡されるべきです。インテル® VTune™ プロファイラーは、通信情報が親プロセスから直接渡されるような MPI 実装では動作しません。
インテル® VTune™ プロファイラーは、Perf* 構文の正規表現を使用して次の MPI モジュールを識別します。
impi\.dll
impid\.dll
impidmt\.dll
impil\.dll
impilmt\.dll
impimt\.dll
libimalloc\.dll
libmpi_ilp64\.dll
このリストはリファレンス用です。告知なしにバージョンごとで変わる可能性があります。
インテル® VTune™ プロファイラーは、動的な MPI プロセスをサポートしません (例えば、MPI_Comm_spawn 動的プロセス API)。
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 のツールと併用する方法を説明するオンラインリソースも提供されています。
「チュートリアル: OpenMP* と MPI アプリケーション解析」は、https://www.intel.com/content/www/us/en/docs/vtune-profiler/tutorial-vtune-itac-mpi-openmp/2020/overview.html (英語) で入手できます。
「ハイブリッド・アプリケーション: インテル® MPI ライブラリーと OpenMP*」は、https://www.intel.com/content/www/us/en/developer/articles/technical/hybrid-applications-mpi-openmp.html (英語) を参照してください。