ファブリック・プロファイラーと OpenSHMEM* コード解析

ファブリック・プロファイラー (プレビュー機能) は、OpenSHMEM* アプリケーションのランタイム動作の詳細な特性を特定するパフォーマンス・ツールです。

これは、プレビュー機能です。プレビュー機能は、正式リリースに含まれるかどうかは未定です。有用性に関する皆さんからのフィードバックが、将来の採用決定の判断に役立ちます。プレビュー機能で収集されたデータは、将来のリリースで下位互換性が保証されません。

アプリケーションは 2 つのパートで構成されます。

ファブリック・プロファイラー・ツールは、インテル® VTune™ プロファイラーの一部として提供されます。ツールのドキュメント、例題、および収集済みのトレースファイルは、ファブリック・プロファイラーのパッケージに含まれています。

データコレクターの設定

ファブリック・プロファイラーのデータコレクターは、アプリケーションの OpenSHMEM* 呼び出しをインターセプトし、ネットワーク活動を監視するライブラリーとして実装されています。この情報をバイナリー・トレース・ファイルに入力します。

前提条件: module load esp を実行して、esp モジュールをロードします。データコレクターのパッケージは、環境変数 ESP_ROOT が示す先にインストールされます。

データコレクターは 2 つのサードパーティー・ライブラリーを必要とします。

アナライザーの設定

アナライザーは、MATLAB* ランタイム環境で動作する MATLAB* プログラムのコレクションです。これらは、トレースファイルを読み取って結果を表示します。

前提条件: アナライザーをインストールするには、MATLAB* ランタイム環境が必要です。これは、https://www.mathworks.com/products/compiler/mcr.html (英語) から無料でダウンロードできます。R2018a(9.4) 以降のバージョンを選択します。

アナライザーは、esp/bin/analyzer 下の release ディレクトリーにあります。これは、fabric_profiler_v100 という MATLAB* プログラムです。

アナライザーを開始するには fpro スクリプトを実行します。

ファブリック・プロファイラーのワークフロー

ファブリック・プロファイラーのワークフローで次の手順を実行します。

  1. データコレクターを使用してアプリケーションをビルドし実行します。
  2. トレースファイルを生成します。
  3. アナライザーを使用してトレースファイルを表示します。

アプリケーションをビルドして実行

Linux* または Windows* マシンにファブリック・プロファイラーをインストールし、次の手順でアプリケーションをビルドおよび実行します。

  1. ソースコードにファブリック・プロファイラー領域を定義します。

    名前付き領域は、アナライザーで表示およびハイライトされ、解析が改善されます。

    1. esp.h ヘッダーファイルをインクルードします。
    2. 注目する領域をマークします。
      esp_enter("<region_name>");     
               exit_exit("<region_name>");
    3. アプリケーションをリビルドします。

    領域を入れ子またはインターリーブすることはできません。
  2. ファブリック・プロファイラーのインストルメントを使用する静的リンクされたアプリケーションをビルドします。

    ファブリック・プロファイラーのモジュール (esp) をロードする場合、環境変数には重要なフラグが定義されます。これらの変数を使用して、SHMEM ライブラリーの前にファブリック・プロファイラーのデータ・コレクター・ライブラリーをコードにリンクします。

    例えば、Cray SHMEM を使用して (examples ディレクトリーから) fixed-round の例をビルドするには、次のように入力します。

    CC -static -o fixed-round $ESP_CFLAGS fixed-round.c $ESP_LDFLAGS $ESP_LDADD

    通常のビルドからの変更に準拠していることを確認してください。

    • C 言語アプリケーションでも C++ コンパイラーを使用してください。データ・コレクター・ライブラリーは C++ を使用しており C++ がないとリンクできません。

    • $ESP_CFLAGS に esp.h へのパスを追加します。また、トレースファイルの品質を向上するため、-g オプションも追加します。

    • $ESP_LDFLAGS にデータ・コレクター・ライブラリーのパスを追加します。

    • $ESP_LDADD にデータ・コレクター・ライブラリーを追加します。

  3. ファブリック・プロファイラーのインストルメントを使用する動的にリンクされたアプリケーションをビルドします。

    ファブリック・プロファイラーは、ランタイムに LD_PRELOAD を使用して、SHMEM ライブラリーの前にデータ・コレクター・ライブラリーをリンクします。そのため、ソースコードにファブリック・プロファイラー領域を追加していない限り、アプリケーションをビルドする必要はありません。

    例えば、fixed-round.c アプリケーションは (examples ディレクトリーにある) C 言語で記述されています。上記の静的リンクとは異なり、この C 言語アプリケーションをファブリック・プロファイラーでインストルメントするため、C++ コンパイラーでリビルドする必要はありません。

    cc -o fixed-round $ESP_CFLAGS fixed-round.c -dynamic

    $ESP_CFLAGS に esp.h へのパスを設定し、-g を追加します。

  4. ファブリック・プロファイラーのインストルメントを使用してアプリケーションを実行します。

    1. データ・コレクター・ライブラリーは、PAPI ライブラリーと OTF2 ライブラリーを使用します。共有ライブラリーを使用する場合、module load papi を実行するか、PAPI をライブラリーのパスに追加する必要があります。score-p.org (英語) から OTF2 をダウンロードできます。

    2. ファブリック・プロファイラーのモジュールをロードします。

      module load esp
    3. ファブリック・プロファイラーの設定パラメーターは多数あります。モジュールは、アプリケーションを最初に実行する際に十分なデフォルト値を設定します。設定パラメーターについては、別のセクションで説明します。

    4. 動的アプリケーションの場合、データ・コレクター・ライブラリーを LD_PRELOAD 変数に追加します。

      次に例を示します。

      export LD_PRELOAD=$ESP_ROOT/lib/libesp.so:$LD_PRELOAD srun --export=LD_PRELOAD,ALL <rest of srun command>
      esp モジュールをロードした場合、環境変数 ESP_LIB には libesp.so へのパスを含みます。examples ディレクトリーにある *.slurm と *.lsf サンプル・ジョブ・スクリプトを参照してください。

トレースファイルの生成

データコレクターを実行すると、アプリケーションの実行とネットワークのアクティビティーが監視されます。アプリケーションの実行が終了すると、トレースファイルが書き込まれます。トレースファイルへの書き込み時間を確保するため、ウォール時間に 1 割を追加してください。

  1. アプリケーションの出力を見て、データコレクターのインストルメントが成功したことを確認します。確認するには以下を行います。

    1. 環境変数 ESP_VERBOSITY_LEVEL に 0 ではなく 1 が設定されていることを確認してください。

    2. shmem_init を呼び出します。ファブリック・プロファイラーの起動バナーが表示されます。

    3. shmem_finalize を呼び出します。ファブリック・プロファイラーの停止バナーが表示されます。

    環境変数 ESP_VERBOSITY_LEVEL が正しく設定されていても、関数呼び出し時にバナーが表示されない場合、esp-support@intel.com までお問い合わせください。

  2. トレースファイルをマージします。

    ファブリック・プロファイラーのバナーには、トレースファイルへのパスが表示されます。トレースをマージするには、esp_merge_traces.sh スクリプトを実行します。

    $ESP_ROOT/bin/esp_merge_traces.sh \    
    <アプリケーションの実行ファイルへのパス> <トレース・ディレクトリーのパス> <PE の数>
  3. traces ディレクトリーのルートレベルにあるトレースファイルを、アナライザーをインストールしたマシンにコピーします。

アナライザーを使用してトレースファイルを表示

トレースファイルを読み取るアナライザーには 5 つのタイプがあります。いずれも、ファブリック・プロファイラーのパッケージの esp/bin/analyzer にあります。

前の手順で生成されたトレースファイルを使用するか、esp/examples/samples/trace にある事前収集されたサンプルトレースを使用できます。これらのトレースは、esp/examples ディレクトリーにある SHMEM アプリケーションに対応しています。

espr は、すべてのトレースデータを HTML 形式に統合した一般的なレポートです。examples ディレクトリーにあるサンプル・アプリケーションにはこのレポートが含まれており、SHMEM アプリケーションや MATLAB ランタイムを実行しなくても、サンプル・アプリケーションのレポートを閲覧できます。esp/examples/samples/html ディレクトリーは、{app name}_{number of Pes}.html という名前のファイルを含み、{app name}_{number of Pes}_html_files というディレクトリーに関連付けられています。ブラウザーで HTML ファイルを開くと、esp/examples/output/samples/trace にある対応するトレースファイルからアナライザーが生成したレポートが表示されます。

トレースファイルの内容

ファブリック・プロファイラーの動作中にアプリケーションが shmem_finalize を呼び出すと、データコレクターはアプリケーションの動作に関する情報を含む 5 つのトレースファイルに書き込みます。

トレースファイル 形式 説明
{trace-file-prefix}.uc1.func

バイナリー

プロファイルされたすべての SHMEM 関数呼び出しに関する情報。各プロセスは異なる関数トレースファイルに書き込みます。ジョブが完了すると、それぞれの関数トレースファイルは esp/bin/collector/esp_merge_traces.sh スクリプトで 1 つのファイルにマージされます。アナライザーはマージされたファイルを使用します。

{trace-file-prefix}.uc1.hfi

バイナリー

SHMEM アプリケーションの実行中、ファブリック・プロファイラーはホストのファブリック・インターフェイス・カードの送信および受信カウンターを監視します。HFI ファイルには、タイムスタンプ付きのカウンター値が格納されます。

{trace-file-prefix}.uc1.profile

バイナリー

SHMEM アプリケーションの実行中、ファブリック・プロファイラーはシステムのパフォーマンスを監視し、システムの情報を収集します。このデータは profile ファイルに書き込まれます。各プロセスは異なる profile ファイルに書き込みます。ジョブが完了すると、それぞれの profile トレースファイルは、esp/bin/collector/esp_merge_traces.sh スクリプトで 1 つのファイルにマージされます。アナライザーはマージされたファイルを使用します。

{trace-file-prefix}.uc1.put

バイナリー

ファブリック・プロファイラーは、各 shmem_put 呼び出しでネットワークに注入されるデータ量と、各 put 操作のデスティネーション・ノードを監視します。put ファイルにはこれらの値が含まれます。

{trace-file-prefix}.uc1.ev.txt

テキスト

environment ファイルは、SHMEM アプリケーションのランタイムで定義されるすべての環境変数のリストを含みます。

アナライザーのタイプ

この表では、ファブリック・プロファイラーのパッケージに含まれるアナライザーと、実行可能な関連操作について説明しています。

アナライザーのタイプ 名前 目的 推奨される操作
espba

バリア・トレース・アナライザー

関数トレースファイルを読み取り、各 PE のソースコード内のバリア呼び出しによるバリアの待機時間を表示します。

  • 次のいずれかを測定します。

    • PE 待機時間
    • PE 到達時間
    • ノード待ち密度
    • PE パーセント率
    • PE 異常値率
  • しきい値を変化させます。
  • 結果を特定の字句の出現に制限します (バリアを含む特定のソースコード行)。
espfbla

ファブリック・バックログ・アナライザー

put トレースファイルを読み取り HFI トレースファイルに関連付けて、任意の時点でファブリックのバックログを視覚化します。

  • [領域の境界を表示] を選択し、注目する領域を選びます。SHMEM コードで定義されたコード領域の場合、時間に対するネットワークのバックログのグラフで、時間領域がハイライトされます。

  • 個々のノードを選択して関連するバックログを表示します。

  • 注入または注入バックログを表示 (実際の要求数は少なくなります)

    • 注入が要求されてアプリケーションのこのノードからほかのノードに送られたデータ

    • 実際の注入、HFI からネットワークに送信されたデータ

    • 要求された排出、アプリケーション内のほかのノードからこのノードに送られたデータ

    • 排出の実績、HFI によるネットワークからの受信

  • ズームとパンで領域に焦点を合わせます。

  • オフセットの調整モードを試してください。

  • トグル表示とレート (比率) 表示を切り替えます。

  • データカーソルを使用します。ウィジェットを最初にクリックします。次に、プロット上の任意の場所をクリックすると、そのポイントのデータが表示されます。

espla

関数 (レイテンシー) トレース・アナライザー

関数トレースファイルを読み取り、インストルメントされたすべての SHMEM 呼び出しの関数レイテンシーを表示します。およそ 10 万回の関数呼び出しを含むトレースファイルでは、完了までに数分かかる場合があります。デフォルト表示では、各時点におけるすべての呼び出しの複合 PE 待機時間が表示されます。

  • 個々の関数呼び出しを選択し、それぞれの呼び出しレイテンシーのホットスポットを表示します。

  • アプリケーションがファブリック・プロファイラー領域を定義している場合、[領域を表示] をクリックします。領域を選択すると、コード領域を表すグラフ上の時間スパンがハイライト表示されます。

  • 通信マトリクスに切り替えます。これは、各 PE からほかの PE に送信されるデータ量を可視化したものです。

  • ズーム、パン、データ・カーソル・ウィジェット (ファイルメニューとヘルプメニューの下) を使用して、表示データをドリルダウンすることができます。

  • 周波数、高値、低値のしきい値の調整を試してください。

espmsa

メッセージ欠落アナライザー

関数トレースファイルを読み取り、トレースファイル内のアクティビティーと HFI トレースファイル内のネットワークのアクティビティーを関連付けます。

 
espr

アナライザーのレポート

SHMEM アプリケーションのp実行に関連する情報を収集し、HTML 形式で表示する非対話形式のレポートです。レポートが出来上がるまで数分かかることがあります。完了すると、プロファイル・トレース・ファイルと同じ場所に、同じ名前の HTML レポートが保存されます。

特定のアプリケーション実行のプロファイル・トレース・ファイルを選択するには、[ファイル] メニューを使用します。