アプリケーションのプロファイリング

Vitis™ コア開発キットでは、コンパイル中にシステムおよびカーネルのリソースとパフォーマンスに関するさまざまなレポートが生成されます。これらのレポートは、アプリケーションのパフォーマンスのベースラインを確立し、ボトルネックを特定して、ハードウェアでアクセラレーション可能なターゲット関数を決定するのに役立ちます (デバイス アクセラレーション アプリケーションの設計手法 を参照)。ザイリンクス ランタイム (XRT) では、エミュレーションおよびハードウェア ビルドの両方で、アプリケーションの実行中にプロファイリング データが収集されます。レポート可能なプロファイリングおよびイベント データの例は、次のとおりです。

  • ホストおよびデバイスのタイムライン イベント
  • OpenCL™ または XRT ネイティブの API 呼び出しシーケンス
  • カーネルの実行シーケンス
  • カーネルの開始および停止信号
  • AXI トランザクションを含む FPGA トレース データ
  • アクセラレータ カードの消費電力プロファイル データ
  • AI エンジン プロフィリングおよびイベント トレース
  • ユーザー イベントおよび範囲プロファイリング

プロファイリング レポートおよびデータは、アプリケーションのパフォーマンスのボトルネックを特定し、システム内で問題を検出し、デザインを最適化してパフォーマンスを向上するために使用できます。アプリケーションの最適化には、アプリケーション ホスト コードとハードウェアでアクセラレーションされるカーネルの両方の最適化が必要です。ホスト コードはデータ転送とカーネル実行がスムーズに実行されるように最適化する必要があり、カーネルではパフォーマンスとリソース使用量が適切なものになるよう最適化する必要があります。

Vitis でアルゴリズムを最適化する際には、システムのリソース使用量とパフォーマンス、カーネル最適化、ホスト最適化、およびデータ転送最適化の 4 つのエリアがあります。次の Vitis レポートおよびグラフィカル ツールは、これらのエリアをプロファイリングおよび最適化するのに役立ちます。

アプリケーションでのプロファイリングのイネーブル に示すように正しくイネーブルにしておけば、レポートはコマンド ライン (アプリケーションのビルドおよび実行 を参照) または Vitis 統合設計環境 (IDE) のいずれから実行しても、アクティブ ビルドを実行したときに自動的に生成されます。ビルド ターゲットごとに別のレポートが生成され、該当するレポート ディレクトリに保存されます。これらのレポートの場所については、v++ コマンドの出力ディレクトリ または Vitis IDE からの出力ディレクトリ を参照してください。

レポートは、Vitis アナライザーから表示できるほか、Vitis IDE から表示できることもあります。Vitis アナライザーからこれらのレポートにアクセスするには、Vitis アナライザーの使用 の説明に従って run_summary レポートを開きます。

機能とパフォーマンスのベースライン

Vitis ソフトウェア プラットフォームでのアプリケーションのアクセラレーション手法 では、アプリケーションの開発の概要を説明し、アプリケーションをプロファイリングしてアクセラレーションする関数を特定することから開始して、C/C++ アクセラレータの開発に推奨される方法を示します。このガイドで説明するように、最適化を開始する前に、まずアプリケーションのアーキテクチャおよびパフォーマンスを理解しておくことが重要です。これには、アプリケーションの機能とパフォーマンスのベースラインを確立します。

1: 機能とパフォーマンスのベースライン フロー

ボトルネックの検出

まず、ターゲット プラットフォームで実行しているアプリケーションのボトルネックを特定します。最も効果的なのは、ホスト アプリケーションのカスタム プロファイリング で説明するユーザー プロファイリング機能や、valgrindcallgrind、および GNU gprof などのプロファイリング ツールを使用してアプリケーションを実行する方法です。これらのツールで生成されるプロファイリング データには、すべての関数呼び出しの回数と実行時間を示すコールグラフが表示されます。

ソフトウェアおよびハードウェア エミュレーションの実行

エミュレーションの実行 に説明されているように、アクセラレーション アプリケーションのソフトウェアおよびハードウェア エミュレーションを実行して機能が正しいかどうかを確認し、ホスト コードおよびカーネルのプロファイリング データを生成します。Vitis アナライザーを使用してカーネル コンパイル レポート、プロファイル サマリ、タイムライン トレース、およびデバイス ハードウェア トランザクションを解析し、タイミング間隔、レイテンシ、DSP やブロック RAM などのリソース使用量のベースライン パフォーマンス見積もりを理解します。

アプリケーションのビルドおよび実行

アプリケーション ハードウェア ビルドの実行 で説明するように、ベースライン作成の最後に、アプリケーションをビルドして FPGA アクセラレーション カード (Alveo™ データセンター アクセラレータ カードなど) で実行します。システム コンパイルからのレポートおよびアプリケーション実行からのプロファイリング データを解析し、ハードウェアでの実際のパフォーマンスおよびリソース使用量を確認します。

ヒント: ベースライン作成中のレポートはすべて保存して、最適化時に参照して結果を比較できるようにしておきます。

アプリケーションでのプロファイリングのイネーブル

プロファイリングをイネーブルにし、アプリケーション実行中にイベント トレース データを収集するには、このタスク用にアプリケーションをインストルメント化する必要があります。また、追加のロジックをイネーブルにし、追加のデバイス リソースを使用して、ホストおよびカーネルの実行段階を記録し、イベント データをする必要があります。このプロセスでは、カスタム データを収集するようにホスト アプリケーションを変更し (オプション)、コンパイル時にカーネル XO を変更し、リンク時に XCLBIN を変更して、デバイス側の動作から異なるタイプのプロファイル データを収集し、アプリケーション ランタイム中にデータが取得されるようにザイリンクス ランタイム (XRT) を設定します (xrt.ini ファイル を参照)。

ヒント: プロファイリング データの収集は、アクセラレーション アプリケーションのビルド時のプロファイリングおよび最適化プロセスに重要ですが、追加のリソースを使用するので、パフォーマンスに影響します。最終的なプロダクション ビルドからは、これらのエレメントを忘れずに削除する必要があります。

アプリケーションのプロファイリングには、システムに含まれる要素や取得するデータの種類に応じて、さまざまな種類があります。次の表に、イネーブルにできるプロファイリングのレベルの一部を示します。また、無償のプロファイルとそうでないプロファイルについて説明します。

表 1. ホストおよびカーネルのプロファイル
プロファイル/トレース 説明 コメント
ホスト アプリケーションの OpenCL API および一部の限定されたデバイス側 (カーネル) プロファイリング。 xrt.ini ファイルで profile および timeline_trace オプションを指定します。 profile_summary.csv および timeline_trace.csv ファイルを生成します。
ホスト アプリケーションの XRT ネイティブ API xrt.ini ファイルで xrt_profile オプションを指定します。 XRT API のトレース イベントを生成します。
ホスト アプリケーションのユーザー イベント プロファイリング ホスト アプリケーションのカスタム プロファイリング に示すように、ホスト アプリケーションにコードを追加する必要があります。 ホスト アプリケーションのユーザー範囲データおよびユーザー イベントを生成します。
オーバーヘッドの少ないプロファイリング xrt.ini ファイルで lop_trace オプションを指定します。 オーバーヘッドの少ないプロファイリングのイネーブル に示すように、lop_trace.csv ファイルを生成します。

xrt.ini ファイルで profile=true を指定すると、ディスエーブルになります。

デバイス側プロファイリング --profile オプション に示すように、v++ コンパイル時およびリンク時に --profile オプションを使用するとイネーブルになります。 ホストとカーネル間のデータ トラフィック、カーネルの停止、カーネルと計算ユニット (CU) の実行時間を取得するほか、Versal AI エンジン の動作を監視します。
AI エンジン グラフとカーネル xrt.ini ファイルで aie_profile および aie_trace オプションを指定します。これらのオプションは、一緒に指定することも、別々に指定することもできます。

aie_profile_<device>.csv および aie_trace_##_<stream id>.txt レポートを生成します。

xrt.ini フィルでは profile=true と一緒には使用できません。

ホスト アプリケーションにユーザー イベント プロファイリングが存在しても、ディスエーブルになります。

消費電力プロファイル xrt.ini ファイルで xrt_profile オプションを指定します。 power_profile_<device>.csv レポートを生成します。
Vitis AI プロファイリング xrt.ini ファイルで vitis_ai_profile オプションを指定します。 DPU のカウンター プロファイリングをイネーブルにして、profile_summary.csv ファイルを生成します。

xrt.ini ファイルで profile=true を指定すると、ディスエーブルになります。

デバイス バイナリ (xclbin) ファイルが、デフォルトでデバイス側のプロファイリング データを収集するよう設定されます。ただし、Vitis コンパイラのリンク プロセスで --profile オプションを使用すると、システムにアクセラレーション モニターと AXI パフォーマンス モニターが追加されて、デバイス バイナリがインストルメント化されます。このオプションには、--profile オプション で示すように、--profile.data--profile.stall、および --profile.exec などの複数のインストルメント オプションがあります。

次に、v++ リンク コマンドに --profile.data を追加する例を示します。
v++ -g -l --profile.data all:all:all ...
ヒント: ソフトウェアまたはハードウェア エミュレーションでデバッグできるようにカーネル コードをコンパイルする場合は、必ず v++ -g オプションも使用してください。

v++ コンパイルおよびリンク プロセス中にアプリケーションのプロファイリングをイネーブルにしたら、上記に説明するように、アプリケーション ランタイム中のデータ収集がイネーブルになるように xrt.ini ファイルを編集する必要があります。たとえば、次の xrt.ini ファイルは、アプリケーションの実行時に OpenCL プロファイリング、消費電力プロファイリング、およびイベントとストールのトレース取得をイネーブルにします。

[Debug]
profile=true
power_profile=true
timeline_trace=true
data_transfer_trace=coarse
stall_trace=all

[Kernel Internals] データのプロファイリングをイネーブルにするには、xrt.ini[Emulation] セクションに debug_mode タグも追加する必要があります。

[Emulation]
debug_mode=batch

大量のトレース データを収集する場合は、v++ リンク中に --trace_memory オプションを指定して、データを取得するのに使用可能なメモリ容量を増やし、xrt.initrace_buffer_size キーワードを追加します。

--trace_memory
トレース データの収集に使用するメモリのタイプを示します (Vitis コンパイラの一般オプション を参照)。
trace_buffer_size
アプリケーション ランタイム中にトレース データを収集するのに使用するメモリの容量を指定します。

連続トレース キャプチャをイネーブルにして、アプリケーションの実行中にデバイスのトレース データを継続的にオフロードすることもできます。このようにすると、アプリケーションまたはシステムがクラッシュした場合に、トレース データの一部にアクセスできるので、アプリケーションのデバッグに役立ちます。これをイネーブルにするには、xrt.ini ファイルに continuous_trace キーワードを追加します。

ホスト アプリケーションのカスタム プロファイリング

ホスト アプリケーションからのすべての XRT 関連動作は、OpenCL API 呼び出しまたは XRT API 呼び出しのいずれかを使用して、プロファイリングのために自動的にトラックされます。ただし、XRT 関連イベント以外のホスト アプリケーションをプロファイルして、ユーザー指定の動作またはイベントに基づいてイベント データを取得することもできます。この機能には、次の 2 種類のカスタム プロファイリングがあります。

[User range]
指定した開始時刻と終了時刻をコード範囲全体でプロファイルします。これにより、ホスト アプリケーションで動作が発生する期間が取得されます。
[User events]
タイムライン内のイベントをマークします。ユーザー イベントは、発生した時点でタイムライン波形に追加されます。
ヒント: これらの機能は、機能とパフォーマンスのベースライン で説明されるようにデザイン プロセスの初期段階で使用でき、ザイリンクス デバイス ハードウェアで実行する関数を分離する前でも使用できます。

カスタム プロファイリングを使用するには、ホスト アプリケーションのソース コードとビルド プロセスをいくつか変更する必要があります。次に説明するように、コード内で C または C++ API を使用する必要があります。また、ホスト アプリケーションをリンクするときに、xrt_coreutil ライブラリを含める必要もあります。

C ++コードのプロファイリング

C ++コードの場合、次のオブジェクトが提供されます。

user_range
このオブジェクトは、指定した ID のアクティビティの測定範囲の開始時刻と終了時刻を取得します。オブジェクト コンストラクターは、次のとおりです。
user_range(const std::string& label,const std::string& tooltip);
user_event
このオブジェクトは、特定の時点で発生するイベントをマークし、指定したラベルをタイムライン トレースに追加します。オブジェクト コンストラクターは、次のとおりです。
user_event() 

user_range を使用してオブジェクトを作成し、作成直後に時間の追跡を開始します。user_range オブジェクトの使用方法の詳細:

  • user_range がデフォルトのコンストラクターを使用してインスタンシエートされる場合、ユーザーがラベルとツール ヒントを使用して user_range.start() を呼び出すまで、時間はマークされません。
  • ラベルおよびツール ヒント文字列を渡す user_range オブジェクトは、インスタンシエートできます。こうすると、即座に範囲の監視が開始されます。
  • 特定の時間範囲を取得するには、user_range.start() および user_range.stop() を呼び出す必要があります。
  • user_range.stop() が呼び出されない場合、範囲は user_range オブジェクトが破棄されるまで追跡され続けます。
  • user_range オブジェクトは、ホスト コードで user_range.start() および user_range.stop() を呼び出すことによって、何度でも再利用できます。
  • user_range.start() の連続呼び出しは、最初の呼び出し以外すべて無視されます。
  • user_range.stop() の連続呼び出しは、最初の呼び出し以外すべて無視されます。

user_event オブジェクトの使用方法の詳細:

  • user_event オブジェクトは、デフォルトのコンストラクターを使用してインスタンシエートする必要があります。
  • user_event.mark() を呼び出すと、タイムライン トレースの特定時間にユーザー マーカーが作成されます。
  • user_event.mark() はオプションの const char* 引数を読み込んで、タイムライン トレースにラベルとして表示します。

ホスト アプリケーションのユーザー イベント プロファイリングの例は、Vitis_Accel_Examplesdebug_profile の例 を参照してください。ホスト アプリケーションが正しくインストルメント化されていれば、XRT でこれらのユーザー定義の範囲とイベント、および標準 XRT API ベースのイベントからプロファイルデータを取得できます。前述のように、xrt.ini ファイルでプロファイルをイネーブルにする必要があります。

重要: 現在のところ、ユーザー イベントは、OpenCL プロファイリングに使用される [Application Timeline] とは別のタイムラインに表示されます。Vitis アナライザーで実行サマリを表示すると、2 つのタイムラインが表示されます。

C コードのプロファイリング

C コードで提供される関数は次のとおりです。

xrtURStart()
指定された ID のアクティビティの測定範囲の開始時刻を設定します。関数シグネチャは、次のとおりです。
void xrtURStart(unsigned int id, const char* label, const char* tooltip)
xrtUREnd()
指定された ID で測定範囲の終了時刻をマークします。関数シグネチャは、次のとおりです。
void xrtUREnd(unsigned int id) 
xrtUEMark()
特定の時点で発生するイベントをマークし、指定したラベルをタイムライン トレースに追加します。関数シグネチャは、次のとおりです。
void xrtUEMark(const char* label) 

xrtURStart() および xrtUREnd() 関数を使用して、時間追跡をすぐに開始し、開始/終了呼び出しをペアリングする ID を指定して、ユーザー範囲を定義します。user_range 関数の使用方法の詳細は、次のとおりです。

  • 1 つの ID の開始/終了範囲は、別の ID のほかの開始/終了範囲内で指定できます。
  • 必ずプロファイルする開始/終了範囲の ID が一致していることを確認してください。
    重要: 同じ ID で xrtURStart および xrtUREnd への複数の呼び出しがあると、予期しない動作が発生する可能性があります。
  • ユーザー範囲にはラベルを付けてタイムラインに追加できるほか、ユーザー範囲の上にカーソルを置くと表示されるツールヒントを含めることができます。

xrtUEMark() を呼び出すと、イベントの時点でタイムライン トレース上にユーザー マーカーが作成されます。

  • xrtUEMark() では、イベントのラベルを指定できます。ラベルはタイムラインにマークと共に表示されます。
  • ラベルに NULL を使用すると、ラベルのないマークを追加できます。

コードの例は次のとおりです。

int main(int argc, char* argv[]) {
 58 
 59   xrtURStart(0, "Software execution", "Whole program execution") ;
 60 ...
 61   //TARGET_DEVICE macro needs to be passed from gcc command line
 62   if(argc != 2) {
 63       std::cout << "Usage: " << argv[0] <<" <xclbin>" << std::endl;
 64       return EXIT_FAILURE;
 65    }
....
153     q.enqueueTask(krnl_vector_add);
154 
155     // The result of the previous kernel execution will need to be retrieved in
156     // order to view the results. This call will transfer the data from FPGA to
157     // source_results vector
158     q.enqueueMigrateMemObjects({buffer_result},CL_MIGRATE_MEM_OBJECT_HOST);
159 ····
160     q.finish();
161 
162     xrtUEMark("Starting verification") ;
163

オーバーヘッドの少ないプロファイリングのイネーブル

Vitis ソフトウェア プラットフォームでは、実行時間にほとんど影響のない、最小限の情報を提供するオーバーヘッドの少ないプロファイリングがサポートされています。ランタイム中にこのオプションを使用した場合、タイムライン トレースは表示されますが、情報量は限られたものになります。オーバーヘッドの少ないプロファイリングは、OpenCL イベントで最小限の情報を取り込み、実行の終了時に lop_trace.csv という CSV ファイルをダンプします。オーバーヘッドが少ないプロファイリングは、3 つのフロー (ハードウェア、ハードウェア エミュレーション、およびソフトウェア エミュレーション) すべてで実行できます。

オーバーヘッドの少ないプロファイリングをイネーブルにするには、xrt.ini ファイル の [Debug] セクションに示すように lop_trace という新しいオプションを使用します。デフォルトでは、lop_trace は FALSE なので、イネーブルにする場合は ini パラメーターを TRUE に設定する必要があります。

xrt.ini file
[Debug]
lop_trace=true
ヒント: lop_trace パラメーターはほかのパラメーターと一緒にイネーブルにすることはできますが、すべてのプロファイリング データもキャプチャすることになるので、オーバーヘッドを少なくするメリットがなくなります。

lop_trace=true をイネーブルにすると、ランタイムが Vitis アナライザーの Run Summary で表示可能な lop_trace.csv ファイルが生成されます。

vitis_analyzer <project>.run_summary

最小限のオーバーヘッドを取得するため、標準の OpenCL プロファイリングで収集される情報は省かれます。特に、オーバーヘッドの少ないプロファイリング トレースでは次の情報含まれません。

  • 計算ユニット実行またはカーネル メモリ転送などのデバイス イベント
  • デスティネーション アドレスまたはサイズなどのメモリ読み出しまたは書き込みに関する情報
  • カーネル名や NDRange サイズなどのカーネル エンキューに関する情報
  • バッファー転送とカーネル エンキュー間の依存

ガイダンス

Vitis コア開発キットには、デザインで検出された問題に対して、ソフトウェア アプリケーション開発者が即座に実行可能なガイダンスを提供する包括的な設計ガイダンス ツールが含まれています。問題の原因は、ソース コードに関係している場合や、ツールで最適化が実行されなかった場合などがあります。また、ルールはさまざまな基準デザイン セットからの経験に基づく汎用ルールであり、デザインによっては当てはまらない場合もあります。そのため、ガイダンス ルールを理解して、特定のアルゴリズムおよび要件に基づいて適切な操作を実行するようにしてください。

ガイダンスは、Vitis HLS、Vitis プロファイラー、および v++ コンパイラで起動された Vivado Design Suite から生成されます。生成された設計ガイダンスには、いくつかの重要度レベルがあります。警告メッセージ、情報メッセージエラー、デザイン ルール チェックは、ソフトウェア エミュレーション、ハードウェア エミュレーション、およびシステム ビルド中に表示されます。プロファイルの設計ガイダンスは、プロファイリング結果を解釈し、パフォーマンスを向上するのに役立ちます。

ガイダンスには、レポートされた違反に関するメッセージテキスト、推奨される解決方法の概要、詳細な解決方法へのウェブ リンクが含まれます。推奨される解決方法に基づいて、次の手順を決定できます。これにより、問題をすばやく特定し、Vitis テクノロジの使用に関する情報にアクセスできるので、生産性が向上します。

設計ガイダンスは、コマンド ラインまたは Vitis IDE でデザインをビルドまたは実行すると自動的に生成されます。

ガイダンス レポートを開く方法は、Vitis アナライザーの使用 に説明されています。ガイダンス レポートにアクセスするには、コンパイル サマリ、リンク サマリ、または実行サマリを開き、ガイダンス レポートを開きます。

  • カーネル ガイダンスは、v++ コンパイル コマンドを使用してカーネルがビルドされた後に、Vitis HLS ツールにより生成されます。これは、コンパイル サマリ レポートを開くことにより、Vitis アナライザーで表示できます。カーネル ガイダンスおよびコンパイル サマリ ファイルは、コンパイルされる各カーネルに対して生成されます。カーネル ガイダンスには、データフローの使用に関する推奨項目と、予測されるスループットが達成されない理由として考えられることが含まれます。
  • カーネル ガイダンスは、v++ リンク コマンドを使用してカーネルがビルドされた後に生成されます。これは、リンク サマリ レポートを開くことにより、Vitis アナライザーで表示できます。システム ガイダンスには、すべてのカーネル ガイダンス チェックが含まれ、アプリケーションを実行する前に包括的なレビューを提供します。
  • 実行ガイダンスは XRT の機能であり、生成された .xclbin を実行すると生成されます。これは、実行サマリを開くことにより Vitis アナライザーで表示できます。実行ガイダンスには、カーネルのストール時間が 50% を超えているかなどのチェック、DDR の代わりに PLRAM を使用できるかなどの推奨項目が含まれます。

ガイダンス レポートを開くと、メッセージと解決方法を含む表が表示されます。解決方法には、関連情報へのウェブリンクも含まれます。

次の図に、Vitis アナライザーで表示されるガイダンス レポートの例を示します。たとえば、[Name] 列のリンクをクリックすると、ルール チェックの説明が表示されます。[Details] 列のリンクをクリックすると、ソース コードが開いてカーネルなどのデザイン オブジェクトが選択されるか、別のレポートが開きます。

2: 設計ガイダンスの例
ヒント: ガイダンスしきい値の設定 に説明するように、Run Guidance レポートの Threshold 列の値を手動で編集すると、レポートをカスタマイズできます。

v++ コマンドの各実行 (コンパイルおよびリンクを含む) に対して、1 つの HTML ガイダンス レポートが生成されます。レポート ファイルは、--report_dir の特定の出力名の下に保存されます。次に例を示します。

  • v++ コンパイル: v++_compile_<output>_guidance.html
  • v++ リンク: v++_link_<output>_guidance.html

[Resolution] 列のウェブ リンクをクリックすると、その解決方法に関する追加情報が表示されます。ガイダンス メッセージ ウェブ ページに、現在のすべてのメッセージがリストされています。

3: ガイダンス メッセージ ウェブ ページ

カーネル オブジェクト、計算ユニット オブジェクト、およびプロファイルでレポートされるデータ値も、システム ダイアグラムやプロファイル レポートなどのビューにクロスプローブできます。詳細は、レポートの使用 を参照してください。

ガイダンス レポートの表示

カーネルがコンパイルされたとき、および FPGA バイナリがリンクされたときに、v++ コマンドによりガイダンス レポートが自動的に生成されます。これらのレポートを表示するには、Vitis アナライザーからアプリケーション プロジェクトの <output_filename>.compile_summary または <output_filename>.link_summary を開きます。<output_filename>v++ コマンドの出力です。

たとえば、Vitis アナライザーを起動してレポートを開くには、次のコマンドを使用します。

vitis_analyzer <output_filename>.link_summary

Vitis アナライザーが開くと、リンク サマリ レポート、コンパイル サマリ、およびコンパイルおよびリンク プロセスで生成されたさまざまなレポートが表示されます。左側のペインで Build をクリックすると、コンパイルとリンクの両方の段階でガイダンス レポートが生成されます。詳細は、Vitis アナライザーの使用 を参照してください。

ガイダンス データの解釈

[Guidance] ビューには、入力項目が行ごとに表示されます。各行には、ガイダンス ルール名、しきい値、実際の値、そのルールの簡単な説明が表示されます。最後のフィールドには、ルール違反を理解して回避するために役立つ参照資料へのリンクが含まれます。

GUI の [Guidance] ビューでは、[Name] 列にイダンス ルールと ID がカテゴリ別にまとめられ、重要度を示すシンボルと共に表示されます。これらは、HTML レポートに個別にリストされます。また、HTML レポートにはヒントは表示されませんが、[Full Name] 列が含まれます。

次に、HTML ガイダンス レポートに含まれるすべてのフィールドとその説明を示します。

Id
各ガイダンス ルールには ID 値が割り当てられています。この ID は、ガイダンス レポートから特定のメッセージを見つけるために使用します。
Name
ガイダンス ルールを識別するためのニーモニック名が表示されます。これらの名前は、特定のガイダンス ルールを記憶しやすくするために付けられています。
Severity
ガイダンス ルールの重要度を示します。
Full Name
[Name] 列のニーモニック名よりも詳細な名前が示されます。
Categories
ほとんどのメッセージはカテゴリに分類されています。これにより、GUI で [Guidance] ビューの共通ツリー ノードの下にメッセージが論理的なカテゴリ別に表示されます。
Threshold
ルールが満たされているかどうかの判断基準となるしきい値が表示されます。しきい値は、良いデザインおよびコーディング プラクティスに従っている多数のアプリケーションに基づいて決定されています。
Actual
デザインでの実際の値が表示されます。この値が基準値と比較され、ルールが満たされたかどうかが判断されます。
Details
現在のルールを説明する簡単なメッセージが表示されます。
Resolution
ルールを満たすために変更可能なモデル ソース コードまたはツール変更によく使用される方法へのリンクが含まれます。リンクをクリックすると、特定の問題に適用可能なヒントやコードを含むポップアップ ウィンドウまたは資料が開きます。

システム見積もりレポート

プロセスで実行時間が最も長いのは、ハードウェア システムのビルドとザイリンクス デバイス上での FPGA バイナリの実行です。ビルド時間は、ターゲット デバイスと FPGA ファブリックにインスタンシエートする計算ユニット数にもよります。そのため、システム ハードウェア用にビルドせずにアプリケーションのパフォーマンスを見積もることができれば便利です。

システム見積もりレポートには、FPGA リソース使用量およびハードウェアでアクセラレーションされたカーネルが動作可能な見積もり周波数が示されます。このレポートは、ハードウェア エミュレーションおよびシステム ハードウェア ビルドで自動的に生成されます。レポートには、リソース使用量および見積もり周波数を含むユーザー カーネルの全体的な情報が含まれます。このレポートをデサイン最適化のガイドとして使用できます。

システム見積もりレポートは、次のオプションを使用して強制的に生成することもできます。

v++ .. --report_level estimate

次の図に、サンプル レポートを示します。

4: システム見積もり

システム見積もりリレポートを開く

システム見積もりレポートは、Vitis アナライザー ツールで開くことができ、Vitis コンパイラでアプリケーションをビルドしたとき、および XRT ライブラリでアプリケーションを実行したときに表示されるようになっています。Vitis アナライザーを起動してレポートを開くには、次のコマンドを使用できます。

vitis_analyzer <output_filename>.link_summary

<output_filename> は、v++ コマンドの出力ファイルです。これにより Vitis アナライザー ツールでアプリケーション プロジェクトのリンク サマリが開くので、[System Estimate] レポートを選択します。詳細は、Vitis アナライザーの使用 を参照してください。

システム見積もりレポートの解釈

v++ で生成されるシステム見積もりレポートには、アプリケーションのバイナリ コンテナーごとおよびデザインの計算ユニットごとの情報が示されます。レポートの構成は次のとおりです。

  • ターゲット デバイス情報
  • アプリケーションのカーネルごとのサマリ
  • バイナリ コンテナーごとの詳細な情報

次に、見積もりレポートに含まれる情報の例を示します。

----------------------------------------------------------------------------
Design Name:             mmult.hw_emu.xilinx_u200_xdma_201830_2
Target Device:           xilinx:u200:xdma:201830.2
Target Clock:            300.000000MHz
Total number of kernels: 1
----------------------------------------------------------------------------

Kernel Summary
Kernel Name  Type  Target              OpenCL Library                          Compute Units
-----------  ----  ------------------  --------------------------------------  -------------
mmult        c     fpga0:OCL_REGION_0  mmult.hw_emu.xilinx_u200_xdma_201830_2  1


-----------------------------------------------------------------------------
OpenCL Binary:     mmult.hw_emu.xilinx_u200_xdma_201830_2
Kernels mapped to: clc_region

Timing Information (MHz)
Compute Unit  Kernel Name  Module Name  Target Frequency  Estimated Frequency
------------  -----------  -----------  ----------------  -------------------
mmult_1       mmult        mmult        300.300293        411.015198

Latency Information (clock cycles)
Compute Unit  Kernel Name  Module Name  Start Interval  Best Case  Avg Case  Worst Case  
------------  -----------  -----------  --------------  ---------  --------  ----------  
mmult_1       mmult        mmult        826 ~ 829       825        827       828         

Area Information
Compute Unit  Kernel Name  Module Name  FF     LUT    DSP   BRAM  URAM
------------  -----------  -----------  -----  -----  ----  ----  ----
mmult_1       mmult        mmult        81378  35257  1036  2     0
----------------------------------------------------------------------------

デザインおよびターゲット デバイスのサマリ

すべてのデザイン見積もりレポートの最初に、ターゲット デバイスに関するアプリケーションのサマリと情報が表示されます。デバイス情報は、レポートのその後のセクションに含まれます。

----------------------------------------------------------------------------
Design Name:             mmult.hw_emu.xilinx_u200_xdma_201830_2
Target Device:           xilinx:u200:xdma:201830.2
Target Clock:            300.000000MHz
Total number of kernels: 1
----------------------------------------------------------------------------

デザイン サマリには、次の情報が含まれます。

Target Device
Vitis コンパイラでビルドされた FPGA バイナリを実行するターゲット プラットフォームに含まれるザイリンクス デバイスの名前。
Target Clock
FPGA ファブリックにマップされた計算ユニットの動作周波数。

カーネル サマリ

このセクションには、アプリケーション プロジェクトに対して定義されたカーネルすべてがリストされます。次に、カーネル サマリの例を示します。

Kernel Summary
Kernel Name  Type  Target              OpenCL Library                          Compute Units
-----------  ----  ------------------  --------------------------------------  -------------
mmult        c     fpga0:OCL_REGION_0  mmult.hw_emu.xilinx_u200_xdma_201830_2  1

カーネル名に加え、実行ターゲットおよび入力ソースのタイプも表示されます。OpenCL™、C、C/C++ ソース ファイルではコンパイルおよび最適化手法が違うので、カーネル ソース ファイルのタイプが指定されます。

[Kernel Summary] セクションは、レポートの最後に表示されるサマリ情報で、この後に各計算ユニットのバイナリ コンテナーに関する詳細な情報が含まれます。

タイミング情報

各バイナリ コンテナーの詳細セクションには、各計算ユニット (CU) の実行ターゲットと、タイミング情報が示されます。通常、FPGA バイナリの周波数見積もりがターゲット周波数よりも高い場合は、CU はデバイスで実行できます。周波数見積もりがターゲット周波数よりも低い場合は、FPGA ファブリックで正しく実行されるように、CU のカーネル コードをさらに最適化がする必要があります。次に、この情報の例を示します。

OpenCL Binary:     mmult.hw_emu.xilinx_u200_xdma_201830_2
Kernels mapped to: clc_region

Timing Information (MHz)
Compute Unit  Kernel Name  Module Name  Target Frequency  Estimated Frequency
------------  -----------  -----------  ----------------  -------------------
mmult_1       mmult        mmult        300.300293        411.015198

重要なのは、ターゲット周波数と周波数見積もりの差を理解することです。CU は FPGA ファブリック内に隔離して配置されているわけではありません。CU は、アプリケーションのクラスをサポートするためにデバイス開発者が定義したその他のコンポーネントを含む有効な FPGA デザインの一部として配置されます。

CU カスタム ロジックはカーネルごとに生成されるので、見積もり周波数がターゲットよりも高いということは、CU が高い見積もり周波数で実行できるということです。そのため、FPGA バイナリのインプリメンテーションでは、CU がターゲット周波数でタイミングを満たす必要があります。

レイテンシ情報

レイテンシ情報には、バイナリ コンテナーの各 CU の実行プロファイルが示されます。このデータを解析する際は、すべての値が CU 境界からカスタム ロジックを介してされていることに注意してください。グローバル メモリへのデータ転送に関連するインシステム レイテンシは、これらの値の一部としてはレポートされません。また、FPGA ファブリックでターゲットとなる CU のみのこのレイテンシがレポートされます。次に、レイテンシ レポートの例を示します。

Latency Information (clock cycles)
Compute Unit  Kernel Name  Module Name  Start Interval  Best Case  Avg Case  Worst Case  
------------  -----------  -----------  --------------  ---------  --------  ----------  
mmult_1       mmult        mmult        826 ~ 829       825        827       828        

レイテンシ レポートは、次のフィールドに分けられます。

  • 開始間隔
  • ベスト ケース レイテンシ
  • 平均ケース レイテン
  • ワースト ケース レイテンシ

開始間隔は、特定のカーネルにおける CU の実行間の時間を定義します。

ベスト、平均、ワースト ケース レイテンシは、CU がそのカーネルの 1 つの ND Range データ タイルの結果を生成するのにかかる時間を示します。カーネルにデータが依存する計算ループがない場合、レイテンシは同じになります。ループのデータ依存実行があると、データごとにレイテンシが変わります。これらはレイテンシ レポートに含まれます。

間隔およびレイテンシの数は、次のいずれかまたは複数の条件の場合、カーネルに対して「undef」 (未定義) とレポートされます。
  • OpenCL カーネルに明示的な reqd_work_group_size(x,y,z) がない
  • カーネルに可変境界のループがある
注記: レイテンシ情報は、ループの変換とそのモデルの並列処理の解析に基づいた見積もりを反映します。パイプライン処理およびデータフローなどの高度な変更があると、実際のスループット数がかなり変わります。このため、レイテンシは run 間の相対的なガイドとしてのみ使用してください。

エリア情報

FPGA は空白の計算キャンバスと考えることもできますが、各 FPGA で使用可能な基本的な構築ブロック数には限りがあります。これらの基本的な構築ブロック (FF、LUT、DSP、ブロック RAM) は、Vitis コンパイラでデザイン内の計算ユニットごとにカスタム ロジックを生成するために使用されます。1 つの CU のカスタム ロジックにインプリメントする必要のある基本的なリソース数により、FPGA ファブリックに同時に読み込むことができる CU の数が決まります。次に、1 つの CU に対してレポートされるエリア情報を示します。

Area Information
Compute Unit  Kernel Name  Module Name  FF     LUT    DSP   BRAM  URAM
------------  -----------  -----------  -----  -----  ----  ----  ----
mmult_1       mmult        mmult        81378  35257  1036  2     0
----------------------------------------------------------------------

HLS レポート

HLS レポートは、ハードウェア エミュレーションおよびシステム ビルドのコンパイル プロセスで生成され、ユーザー カーネルの高位合成 (HLS) プロセスに関する詳細を提供します。このプロセスでは、カーネル ロジックを FPGA にインプリメントするため、C/C++ および OpenCL カーネルをハードウェア記述言語に変換します。カスタム ハードウェア ロジックの FPGA リソース使用量の見積もり、動作周波数、レイテンシ、およびインターフェイス信号が示されます。これらの詳細は、カーネルの最適化に役立つ多数の情報を提供します。

Vitis IDEから実行した場合、このレポートは _x/<kernel_name>.<target>.<platform>/<kernel_name>/<kernel_name>/solution/syn/report ディレクトリに保存されます。

HLS レポートを表示するには、Vitis アナライザーの使用 に説明されているように、Vitis アナライザーからコンパイル サマリまたはリンク サマリを開きます。次に、HLS レポートの例を示します。

5: HLS レポート

HLS レポートの生成と表示

重要: ビルド プロセス中は --save-temps オプションを指定して、Vitis HLS で生成されるレポートを含む中間ファイルを保存する必要があります。HLS レポートおよび HLS ガイダンスは、C および OpenCL カーネルのハードウェア エミュレーションおよびシステム ビルドでのみ生成されます。ソフトウェア エミュレーションや RTL カーネルの場合は生成されません。

HLS レポートを表示するには、Vitis アナライザーからアプリケーション プロジェクトの <output_filename>.compile_summary または <output_filename>.link_summary を開きます。<output_filename>v++ コマンドの出力です。

Vitis アナライザーを起動してレポートを開くには、次のコマンドを使用できます。

vitis_analyzer <output_filename>.compile_summary

Vitis アナライザーが開くと、コンパイルのサマリと、コンパイル プロセスで生成されたレポートが表示されます。詳細は、Vitis アナライザーの使用を参照してください。

HLS レポートの解釈

HLS 合成レポートは、左側の列にモジュール階層を示すスプレッドシートです。HLS の実行により生成されたモジュールおよびループが、この階層に表示されます。HLS 合成レポートには、次の情報が含まれます。

  • 違反のタイプ
  • クロック サイクル数で示されたレイテンシ
  • 絶対時間 (µs) で示されたレイテンシ
  • 反復レイテンシ
  • 反復間隔
  • ループのトリップカウント
  • パイプライン処理の有無
  • BRAM、DSP、FF、および LUT の使用率見積もり
  • 負のスラック

この情報が階層ブロックの一部である場合は、その階層に含まれるブロックの情報すべてがまとめられます。どのインスタンスがデザイン全体に影響しているのかがわかっている場合は、レポート内から階層をナビゲートすることもできます。

注意: サイクル数およびレイテンシの絶対値は、HLS 合成時の見積もりに基づいているので、パイプラインおよびデータフローなどの高度な変換を使用する場合は特に、最終的な結果を正確に反映していない可能性があります。レポートにクエスチョン マーク (?) が表示される場合、原因は可変境界ループにある可能性があるので、このようなループにはトリップカウントを設定し、このレポートに相対的な見積もりが表示されるようにすることをお勧めします。

プロファイル サマリ レポート

正しく設定されていれば、ザイリンクス ランタイム (XRT) でホスト アプリケーションおよびカーネルのプロファイリング データが収集されます。XRT では、OpenCL または XRT API 呼び出しを使用してランタイムに呼び出しコールを発信するときに、ホスト アプリケーションのプロファイル データを自動的に取得します。ホスト アプリケーションのカスタム プロファイリング で説明されるように、ホスト アプリケーションにユーザー呼び出しを追加すると、追加のプロファイリング情報を取得できます。カーネル演算の詳細を取得するには、次のセクションで説明する --profile オプションを使用してカーネルをインストルメント化する必要があります。

アプリケーションの実行が終了すると、プロファイル サマリが .csv ファイルとしてホスト コードがコンパイルされたディレクトリに保存されます。プロファイル サマリには、全体的なアプリケーション パフォーマンスに関する注釈付きの詳細が表示されます。アプリケーションの実行中に生成されたすべてのデータが複数のカテゴリに分類されます。プロファイル サマリでは、カーネル実行とデータ転送の統計を確認できます。

ヒント: プロファイル サマリ レポートは、すべてのビルド コンフィギュレーションで生成できます。ただし、ソフトウェア エミュレーション ビルドでは、カーネル実行効率およびデータ転送効率の下にデータ転送の詳細は含まれません。この情報は、ハードウェア エミュレーションおよびシステム ビルド コンフギュレーションでのみ生成されます。

次に、プロファイル サマリ レポートの例を示します。

6: プリファイル サマリ

プロファイル サマリ レポートの生成と表示

プロファイル サマリに必要なデータをキャプチャするには、アプリケーションを実行する前に次の手順を実行する必要があります。

  1. FPGA バイナリ (xclbin) ファイルは、デフォルトでプロファイリング データをキャプチャするよう設定されます。ただし、リンク プロセス中に v++ --profile オプションを使用すると、キャプチャしたプロファイリング データが詳細に表示できるようになります。詳細は、--profile オプションを参照してください。
  2. ランタイムでは、xrt.ini ファイル に説明されているように、xrt.ini ファイルにプロファイリング データをキャプチャするためのキーワードを含める必要があります。
    [Debug]
    profile = true
  3. [Kernel Internals] データのプロファイリングをイネーブルにするには、xrt.ini[Emulation] セクションに debug_mode タグも追加する必要があります。
    [Emulation]
    debug_mode = batch

デバイス バイナリおよび xrt.ini ファイルでプロファイリングをイネーブルにすると、アプリケーションを実行したときに、ランタイムでprofile_summary.csv レポート ファイルが生成されるほか、Kernel Internals をオンにしたときに profile_kernels.csv および timeline_kernels.csv ファイルも作成されます。これらのファイルは Profile Summary レポートにリンクされ、Run Summary を使用して Vitis アナライザー ツールで表示できます。次のコマンドで Run Summary を開きます。

vitis_analyzer <project>.run_summary

関連情報

プロファイル サマリの解釈

プロファイル サマリには、ホスト アプリケーションおよびカーネルに関する有益な統計が多数含まれます。このレポートには、アプリケーションの機能的なボトルネックの概要が示されます。次の表に、プロファイル サマリ レポートの説明を示します。

Settings

レポートおよび XRT のコンフィギュレーション設定を表示します。

Summary

デバイスの実行時間、デバイスの消費電力を含む、サマリ統計を表示します。

Kernels & Compute Units

[Kernel Execution] セクションは、スケジューリングおよび実行されたすべてのカーネル関数のプロファイル データ サマリを表示します。

表 2. Kernel Execution
名前 説明
Kernel カーネル名
Enqueues カーネルがエンキューされる回数。カーネルが 1 回のみエンキューされる場合は、この後の統計はすべて同じです。
Total Time すべてのエンキューの合計実行時間 (OpenCL API 実行モデルで START から END まで測定) (ms)
Minimum Time すべてのエンキューの最短実行時間
Average Time カーネルの平均実行時間 (ms)

(合計時間) / (エンキュー数)

Maximum Time すべてのエンキューの最長実行時間 (ms)

[Top Kernel Execution] セクションは、最上位カーネル関数のプロファイル データ サマリを表示します。

表 3. Top Kernel Execution
名前 説明
Kernel カーネル名
Kernel Instance Address カーネル インスタンスのホスト アドレス (16 進数)
Context ID ホストのコンテキスト ID
Command Queue ID ホストのコマンド キュー ID
Device カーネルが実行されたデバイス名 (フォーマット:<device>-<ID>)
Start Time 実行の開始時間 (ms)
Duration 実行期間 (ms)

[Compute Unit Utilization] セクションは、デバイス上の計算ユニットすべてのサマリ プロファイル データを表示します。

表 4. Compute Unit Utilization
名前 説明
Compute Unit 計算ユニット名
Kernel 計算ユニットが関連付けられているカーネル
Device デバイスの名前 (フォーマット: <device>-<ID>)
Calls 計算ユニットが呼び出される回数
Dataflow Execution CU がデータフローを使用して実行されているかを指定
Max Parallel Executions データフロー領域での実行回数
Dataflow Acceleration データフロー実行によるパフォーマンスの向上
CU Utilization (%) カーネルの合計実行時間のうち CU で使用される時間の割合
Total Time すべての呼び出しの合計実行時間 (ms)
Minimum Time すべての呼び出しの最短実行時間 (ms)
Minimum runtime of all calls (合計時間) / (ワーク グループ数)
Maximum Time すべての呼び出しの最長実行時間 (ms)
Clock Frequency 該当アクセラレータに使用するクロック周波数 (MHz)

[Compute Unit Running Times & Stalls] セクションは、デバイス上の計算ユニットの実行時間およびストールのプロファイル サマリ データを表示します。

表 5. Compute Unit Running Times & Stalls
名前 説明
Compute Unit 計算ユニット名
Running Time 計算ユニットが実行される合計時間 (µs)
Intra-Kernel Dataflow Stalls (%) カーネル内ストリームにより計算ユニットがストールしている時間の割合。
External Memory Stalls (%) 外部メモリ アクセスにより計算ユニットがストールしている時間の割合
Inter-Kernel Pipe Stalls (%) カーネル間パイプ アクセスにより計算ユニットがストールしている時間の割合。

Kernel Data Transfers

[Data Transfer] セクションは、カーネルからグローバル メモリへのデータ転送を表示します。

表 6. Data Transfer
名前 説明
Compute Unit Port 計算ユニット/ポート名
Kernel Arguments このポートに接続されるカーネル引数のリスト
Device デバイス数 (フォーマット: <device>-<ID>)
Memory Resources このポートでアクセスされるメモリ リソース
Transfer Type カーネル データ転送のタイプ
Number of Transfers カーネル データ転送数 (AXI トランザクション数)
注記: printf 転送が含まれる場合があります。
Transfer Rate カーネル データ転送レート (MB/s)

転送レート = (合計バイト数) / (合計 CU 実行時間)

合計 CU 実行時間は CU がアクティブな実行時間
Avg Bandwidth Utilization (%) カーネル データ転送の平均帯域幅

帯域幅使用率 (%) = (100 * 転送レート) / (0.6 * 論理的な最大レート)

Avg Size カーネル データ転送の平均帯域幅 (KB)

平均サイズ (KB) = (合計 KB) / (転送数)

Avg Latency カーネル データ転送の平均レイテンシ (ns)

[Top Data Transfer] セクションは、カーネルからグローバル メモリへの最上位データ転送を表示します。

表 7. Top Data Transfer
名前 説明
Compute Unit 計算ユニット名
Device デバイス名
Number of Transfers 書き込みおよび読み出しのデータ転送数
Avg Bytes per Transfer カーネル データ転送の平均バイト数

平均バイト数 = (合計バイト数) / (転送数)

Transfer Efficiency (%) カーネル データ転送の効率:

効率 = (平均バイト数) / min((メモリ バイト幅 * 256), 4096)

Total Data Transfer カーネルで転送された合計データ量 (MB):

合計データ量 = (書き込みの合計量) + (読み出しの合計量)

Total Write カーネルで書き込まれた合計データ量 (MB)
Total Read カーネルで読み出された合計データ量 (MB)
Total Transfer Rate 平均合計データ転送レート (MB/s):

合計転送レート = (合計データ転送) / (合計 CU 実行時間)

合計 CU 実行時間は CU がアクティブな実行時間

[Data Transfer Streams] セクションは、データ転送ストリームを表示します。

注記: この表は、ストリーム データがある場合にのみ表示されます。
表 8. Data Transfer Streams
名前 説明
Master Port マスター計算ユニットおよびポートの名前
Master Kernel Arguments このポートに接続されるカーネル引数のリスト
Slave Port スレーブ計算ユニットおよびポートの名前
Slave Kernel Arguments このポートに接続されるカーネル引数のリスト
Device デバイス数 (フォーマット: <device>-<ID>)
Number of Transfers ストリーム データ パケット数
Transfer Rate ストリーム データ転送レート (MB/s)

転送レート = (合計バイト数) / (合計 CU 実行時間)

合計 CU 実行時間は CU がアクティブな実行時間

Avg Size カーネル データ転送の平均帯域幅 (KB)

平均サイズ (KB) = (合計 KB) / (転送数)

Link Utilization (%) リンク使用率 (%):

リンク使用率 = 100 * (リンク Busy サイクル数 - リンク ストール サイクル数 - リンク Starve サイクル数) / (リンク Busy サイクル数)

Link Starve (%) リンク Starve の割合 (%):

リンク Starve の割合 = 100 * (リンク Starve サイクル数 / (リンク Busy サイクル数)

Link Stall (%) リンク ストールの割合 (%):

リンク ストールの割合 = 100 * (リンク ストール サイクル数 / (リンク Busy サイクル数)

Host Data Transfers

[Top Memory Writes] セクションは、PCI Express® リンクを介したホストとデバイス メモリ間のすべての書き込み転送のプロファイル データを表示します。

表 9. Top Memory Writes
名前 説明
Buffer Address バッファーのアドレス ロケーション
Context ID ホスト上での OpenCL コンテキスト ID
Command Queue ID ホスト上での OpenCL コマンド キュー ID
Start Time 書き込み操作の開始時間 (ms)
Duration 書き込み操作の時間 (ms)
Buffer Size 転送されたデータ量 (KB)
Writing Rate データ転送レート (MB/s):

(バッファー サイズ)/(時間)

[Top Memory Reads] は、PCI Express® リンクを介したホストとデバイス メモリ間のすべての読み出し転送のプロファイル データを表示します。

表 10. Top Memory Reads
名前 説明
Buffer Address バッファーのアドレス ロケーション
Context ID ホストのコンテキスト ID
Command Queue ID ホストのコマンド キュー ID
Start Time 読み出し操作の開始時間 (ms)
Duration 読み出し操作の時間 (ms)
Buffer Size 転送されたデータ量 (KB)
Reading Rate データ転送レート (MB/s):

(バッファー サイズ) / (時間)

[Data Transfer] セクションは、ホストからグローバル メモリへのデータ転送を表示します。

表 11. Data Transfer
名前 説明
Context:Number of Devices コンテキスト ID およびコンテキスト内のデバイス数
Transfer Type カーネル ホスト転送のタイプ
Number of Buffer Transfers ホスト バッファー転送数
注記: printf 転送が含まれる場合があります。
Transfer Rate ホスト データ転送レート (MB/s)

転送レート = (合計バイト数) / (合計時間 (µs))

Avg Bandwidth Utilization (%) ホスト バッファー転送の平均帯域幅:

帯域幅使用率 (%) = (100 * 転送レート) / (論理的な最大レート)

Avg Size ホスト バッファー転送の平均サイズ (KB)

平均サイズ (KB) = (合計 KB) / (転送数)

Total Time ホスト バッファー転送の合計時間 (ms)
Avg Time ホスト バッファー転送の平均時間 (ms)

API Calls

ホスト アプリケーションで実行されるすべての OpenCL ホスト API 関数呼び出しのプロファイル データを表示します。上部には、合計時間に対する API 呼び出しの時間の割合が棒グラフで示されます。

表 12. API Calls
名前 説明
API Name API 関数の名前 (例: clCreateProgramWithBinaryclEnqueueNDRangeKernel)
Calls ホスト アプリケーションからこの API が呼び出された回数
Total Time すべての呼び出しの合計実行時間 (ms)
Minimum Time すべての呼び出しの最短実行時間 (ms)
Average Time 平均時間 (ms)

(合計時間) / (呼び出し回数)

Maximum Time すべての呼び出しの最長実行時間 (ms)

Device Power

デバイスの電源のプロファイルを表示します。

表 13. Device Power
名前 説明
Power Used By Platform データセンター アクセラレータ カードの 3 つの電源レールのグラフを表示します。
  • 12V 補助電源
  • 12V PCIe
  • 内部電源
カードの時間の経過に伴う消費電力を示します。
Temperature 温度測定値が 0 以外のデバイスごとに 1 つのチャートが作成されます。温度センサーごとに 1 行ずつ表示されます。単位は ℃ です。
Fan Speed ファン速度が 0 以外のデバイスごとに、1 つのチャートが作成されます。ファン速度は RPM 単位で測定されます。

Kernel Internals

[CU Runtime and Stalls] セクションは、計算ユニットの実行時間 (µs) と、ストール時間の実行時間に対する割合を表示します。

ヒント: [Kernel Internals] タブでは時間が µs でレポートされますが、ほかのプロファイル サマリ レポートでは時間が ms でレポートされます。
表 14. CU Runtime and Stalls
名前 説明
Compute Unit 計算ユニットのインスタンス名
Running Time CU の合計実行時間 (µs)
Intra-Kernel Dataflow Stalls (%) カーネル間のデータ ストリーミング中にストールした時間の実行時間に対する割合
External Memory Stalls (%) CU 外のメモリ転送でストールした時間の実行時間に対する割合
Inter-Kernel Pipe Stalls (%) CU 外とのデータ ストリーミング中にストールした時間の実行時間に対する割合

[CU Port Data Transfers] セクションは、計算ユニットの特定のポートでのデータ転送を表示します。

表 15. CU Port Data Transfers
名前 説明
Port 計算ユニットのポート名
Compute Unit 計算ユニットのインスタンス名
Write Time ポート上でのデータ書き込み合計時間 (µs)
Outstanding Write (%) 実行時間で書き込み処理に使用された割合
Read Time ポート上でのデータ読み出し合計時間 (µs)
Outstanding Read (%) 実行時間で読み出し処理に使用された割合

[Functional Port Data Transfers] セクションは、計算ユニットの関数ポートのデータ転送を表示します。

表 16. Functional Port Data Transfers
名前 説明
Port ポート名
Function 関数名
Compute Unit 計算ユニット名
Write Time ポートに待機中の書き込みがあった合計時間 (µs)
Outstanding Write (%) ポートに待機中の書き込みがあった時間の割合
Read Time ポートに待機中の読み出しがあった合計時間 (µs)
Outstanding Read (%) ポートに待機中の読み出しがあった時間の割合

[Functions] セクションは、計算ユニットの実行時間およびストールを表示します。

表 17. Functions
名前 説明
Compute Unit 計算ユニット名
Function 関数名
Running Time 関数が実行される合計時間 (ms)
Intra-Kernel Dataflow Stalls カーネル内ストリームにより関数がストールしている時間の割合 (ms)
External Memory Stalls 外部メモリ アクセスにより関数がストールしている時間の割合 (ms)
Inter-Kernel Pipe Stalls カーネル間パイプ アクセスにより関数がストールしている時間の割合 (ms)

Shell Data Transfers

[DMA Data Transfer] セクションは、DMA データ転送を表示します。

表 18. DMA Data Transfer
名前 説明
Device デバイス数 (フォーマット: <device>-<ID>)
Transfer Type データ転送のタイプ
Number of Transfers データ転送数 (AXI トランザクション数)
Transfer Rate データ転送レート (MB/s):

転送レート = (合計バイト数) / (合計時間 (µs))

Total Data Transfer 転送されるデータの合計量 (MB)
Total Time データ転送の合計時間 (ms)
Avg Size データ転送の平均サイズ (KB)

平均サイズ (KB) = (合計 KB) / (転送数)

Avg Latency データ転送の平均レイテンシ (ns)

DMA バイパスおよびグローバル メモリからグローバル メモリへのデータ転送については、上記の [DMA Data Transfer] 表を参照してください。

NoC Counters

[NoC Counters] には、[NoC Counters Read] および [NoC Counters Write] が表示されます。これらのセクションは、0 以外の NoC カウンター データがある場合にのみ表示されます。

各セクションには、転送レートと遅延の折れ線グラフとサマリ データを含む表があります。グラフには複数の NoC カウンターを含めることができるため、表の [Chart] 列のチェック ボックスを使用してカウンターのオン/オフを切り替えることができます。

デザインによっては、NoC カウンターを CU ポートに関連付けることができます。この場合、CU ポートが表に表示され、選択すると、システム ダイアグラム、プロファイル サマリ、および CU ポートを選択可能なオブジェクトとして含むその他のビューにクロスプローブされます。

表 19. NoC Counters Read or Write
名前 説明
Name NoC ポート名
Traffic Class トラフィック クラスのタイプ
Requested QoS QoS (MB/s): 要求されたサービス品質 (MB/s)
Min Transfer Rate 最小データ転送レート (MB/s)
Avg Transfer Rate 平均データ転送レート (MB/s)
Max Transfer Rate 最大データ転送レート (MB/s)
Avg Size データ転送の平均サイズ (KB)

平均サイズ (KB) = (合計 KB) / (転送数)

[Min Latency] データ転送の最小レイテンシ (ns)
[Avg Latency] データ転送の平均レイテンシ (ns)
[Max Latency] データ転送の最大レイテンシ (ns)

AI Engine Counters

AI エンジン カウンターは、0 以外の AI エンジン カウンター データがある場合に表示されます。AI エンジン カウンターの設定に互換性がない場合、このセクションには、設定がパフォーマンス プロファイリングをサポートしていないことを示すメッセージが表示されます。

このセクションには、アクティビティ時間と使用率の折れ線グラフとサマリ データを含む表があります。使用率チャートは、ストール プロファイリングが有効になっている場合にのみ使用できます。

グラフには複数の AI エンジン カウンターを含めることができるため、表の [Chart] 列のチェック ボックスを使用してカウンターのオン/オフを切り替えることができます。

タイルは、AI エンジン アレイ ビューおよびグラフ ビューにクロスプローブできるようになります。

表 20. AI Engine Counters
名前 説明
Tile AI エンジン タイル [列、行]
Active Time (ms) このタイルがアクティブだった時間 (ms)
Stall Time (ms) このタイルがアクティブでも停止していた時間 (ms)
Stall Time (%) このタイルがアクティブでも停止していた時間の割合 (%)
Active Utilization (ms) このタイルがアクティブでも停止していなかった時間 (ms)
Active Utilization (%) このタイルがアクティブでも停止していなかった時間の割合 (%)
Clock Frequency (MHz) AI エンジン タイルに使用されるクロックの周波数 (MHz)

アプリケーション タイムライン

アプリケーション タイムラインは、ホストとカーネルのイベント情報を収集し、共通のタイムラインに表示します。これは、システムの全体的な状態とパフォーマンスを視覚的に表示して理解するのに役立ちます。このグラフィカル表示により、カーネル同期および並列実行の効率に関する問題を確認できます。表示されるイベントには、次のものがあります。

  • ホスト コードからの OpenCL API 呼び出し。
  • 計算ユニット、AXI トランザクションの開始/停止を含むデバイス トレース データ。
  • ホスト イベントおよびカーネルの開始/停止。

これはアプリケーションのデバッグおよびプロファイリングには有益ですが、アプリケーション実行に余計な時間がかかるので、タイムラインとデバイス トレース データはデフォルトでは収集されません。ただし、トレース データはカーネルの専用リソースに収集されるので、カーネルの機能には影響しません。データは実行の最後にのみ解放されます (v++ --trace_memory オプション)。

次の図に、ホストおよびデバイスのイベントを共通のタイムラインに表示する [Application Timeline] ウィンドウの例を示します。ホスト アクティビティが上部に、カーネル アクティビティが下部に表示されます。ホスト アクティビティには、プログラムの作成、カーネルの実行、およびグローバル メモリとホスト間のデータ転送が含まれます。カーネル アクティビティには、読み出し/書き込みアクセス、およびグローバル メモリとカーネル間の転送が含まれます。この情報は、アプリケーション実行の詳細を理解し、パフォーマンスを向上できる部分を特定するのに有益です。

7: アプリケーション タイムライン

コマンド ライン フローでもタイムライン データの収集をイネーブルにできますが、表示には Vitis アナライザーを使用する必要があります。詳細は、Vitis アナライザーの使用 を参照してください。

アプリケーション タイムラインの生成と表示

アプリケーション タイムライン レポートを生成するには、次の手順に従って、コマンド ライン フローでタイムラインとデバイス トレース データ収集イネーブルにします。

  1. --profile オプション に示すように、リンク時に v++ --profile オプションを使用して、カーネルにアクセラレーション モニターおよび AXI パフォーマンス モニターを追加することにより FPGA バイナリをインストルメント化します。次に、v++ リンク コマンドに --profile.data を追加する例を示します。
    v++ -g -l --profile.data all:all:all ...
  2. ビルド プロセスでカーネルをインストルメント化したら、xrt.ini ファイルを編集してアプリケーションのランタイム実行時にデータ収集をイネーブルにする必要があります。詳細は、xrt.ini ファイル を参照してください。

    次の xrt.ini ファイルでは、アプリケーションの実行時に最大限の情報が収集されます。

    [Debug]
    profile=true
    timeline_trace=true
    data_transfer_trace=coarse
    stall_trace=all
    
    ヒント: 大量のトレース データを収集する場合、v++ コマンドで --trace_memory を指定し、xrt.initrace_buffer_size キーワードを含める必要がある場合があります。

    アプリケーションの実行後、アプリケーション タイムライン データは timeline_trace.csv という CSV ファイルに保存されます。

  3. CSV レポートを表示するには、Vitis アナライザー ツールでアプリケーション実行中に生成された Run Summary を開きます。Vitis アナライザーを起動して Run Summary を開くには、次のコマンドを使用します。
    vitis_analyzer <project>.run_summary

アプリケーション タイムラインの解釈

[Application Timeline] ビューは、ホストおよびデバイスのイベントを共通のタイムラインに表示します。この情報は、アプリケーション実行の詳細を理解し、パフォーマンスを向上できる部分を特定するのに有益です。アプリケーション タイムライン レポートには、[Host] と [Device] の 2 つのセクションがあります。[Host] セクションには、ホスト側から開始されるアクティビティのトレースが表示され、[Device] セクションには、FPGA の CU のアクティビティが表示されます。

レポートは、次のような構成になっています。

  • Host
    OpenCL API Calls
    すべての OpenCL API 呼び出しがトレースされます。アクティビティ時間はホストの視点から測定されます。
    General
    clCreateProgramWithBinaryclCreateContextclCreateCommandQueue などの一般的な OpenCL API 呼び出しがトレースされます。
    Queue
    特定のコマンド キューに関連する OpenCL API 呼び出しがトレースされます。これには、clEnqueueNDRangeKernelclEnqueueMigrateMemObjects などのコマンドが含まれます。ユーザー アプリケーションで複数のコマンド キューが作成された場合は、このセクションにすべてのキューとそのアクティビティが表示されます。
    Data Transfer
    ホストからデバイス メモリまでの DMA 転送がトレースされます。OpenCL ランタイムにインプリメントされる DMA スレッドは複数あり、通常は同数の DMA チャネルがあります。DMA 転送は、ユーザー アプリケーションが clEnqueueMigrateMemObjects などの OpenCL API を呼び出すことにより開始されます。これらの DMA 要求がランタイムに転送され、スレッドの 1 つに割り当てられます。ホストからデバイスまでのデータ転送は Write の下、デバイスからホストまでのデータ転送は Read の下に表示されます。
    Kernel Enqueues
    ホスト プログラムによりエンキューされたカーネルが表示されます。ここに示されるカーネルを、デバイスのカーネル/CU と混同しないようにしてください。ここではカーネルとは NDRangeKernels および OpenCL コマンド clEnqueueNDRangeKernels および clEnqueueTask で作成されるタスクを指します。これらはホストの視点から測定された時間に対してプロットされます。複数のカーネルが同時に実行されるようにスケジュールでき、実行がスケジュールされた時点からカーネル実行の終了までがトレースされます。複数のエントリがあるのは、このためです。行数は、オーバーラップするカーネル実行の数によって異なります。
    注記: 実際にはプロセスが即座に実行できない場合もあるので、カーネルのオーバーラップはデバイス上の並列実行とは異なります。
  • Device "name"
    Binary Container "name"
    バイナリ コンテナーの名前。
    Accelerator "name"
    FPGA 上の計算ユニット (アクセラレータ) の名前。
    User Functions
    Vitis HLS ツールのカーネルの場合、データフロー プロセスとしてインプリメントされる関数がトレースされます。これらの関数のトレースは、現在並列実行されているこれらの関数のアクティブなインスタンス数を示します。これらの名前は、波形がイネーブルの場合にハードウェア エミュレーションで生成されます。
    注記: 関数レベルのアクティビティは、ハードウェア エミュレーションでのみ可能です。
    • Function: "name a"
    • Function: "name b"
    Read
    CU は、AXI-MM ポートを使用して DDR から読み出しを実行します。CU で読み出されるデータのトレース データがここに表示されます。アクティビティはトランザクションとして表示され、各トランザクションのツール ヒントに詳細な AXI トランザクションが表示されます。これらの名前は、--profile.data がを CU のために使用されると生成されます。
    Write
    CU は、AXI-MM ポートを使用して DDR への書き込みを実行します。CU で書き込まれるデータのトレースがここに表示されます。アクティビティはトランザクションとして表示され、各トランザクションのツール ヒントに詳細な AXI トランザクションが表示されます。これは、--profile.data が CU 用に指定されたときに生成されます。

[Waveform] ビューおよびライブ波形ビューアー

Vitis コア開発キットでは、ハードウェア エミュレーションを実行したときに [Waveform] ビューが表示されます。[Waveform] ビューには、システム レベル、CU レベル、および関数レベルの詳細が表示されます。表示される詳細には、カーネルとグローバル メモリ間のデータ転送、カーネル パイプ間のデータフローが含まれます。これらの詳細を利用すると、システム レベルから個々の関数呼び出しまでのパフォーマンスのボトルネックを理解して、アプリケーションを最適化できるようになります。

ライブ波形ビューアーは、[Waveform] ビューに似ていますが、さらに下位レベルの詳細が表示され、ある程度のインタラクティブ機能も提供されています。ライブ波形ビューアーは、Vivado ロジック シミュレータ xsim を使用して開くこともできます。

注記: [Waveform] ビューを使用すると、Vitis アナライザー (Vitis アナライザーの使用 を参照) からデバイス トランザクションを直接確認できます。ライブ波形ビューアーでは、Vivado シミュレーション波形ビューアーを開いて、選択した信号に加え、ハードウェア トランザクションを確認できます。

波形データを収集するには、ランタイムでハードウェア エミュレーション中にシミュレーション波形を生成する必要があり、時間もディスク容量も消費するので、デフォルトでは実行されません。これらの機能をイネーブルにする方法は、波形レポートの生成と表示 を参照してください。

8: [Waveform] ビュー

または、Linux コマンド ラインから Vivado ロジック シミュレータで波形データベース (.wdb) ファイルを開きます。

xsim -gui <filename.wdb> &
ヒント: .wdb ファイルは、コンパイルされたホスト コードが実行されるディレクトリに含まれます。

波形レポートの生成と表示

ハードウェア エミュレーション中にコマンド ラインから波形データの収集をイネーブルにしてビューアーで開くには、次の手順に従います。

  1. コンパイルおよびリンクを実行するときに、-g オプションを指定してデバッグ コードの生成をイネーブルにします。
    v++ -c -g -t hw_emu ...
  2. ホスト実行ファイルと同じディレクトリに、次の次内容の xrt.ini ファイルを作成します (詳細は xrt.ini ファイル を参照)。
    [Debug]
    profile=true
    timeline_trace=true
    
    [Emulation]
    debug_mode=batch

    debug_mode=batch にすると、バッチ モードでシミュレーションを実行して、波形データ (.wdb) をキャプチャできるようになります。xrt.ini で次の設定を使用して、ライブ波形ビューアーを有効にして、インタラクティブ モードでシミュレーションを起動することもできます。

    [Emulation]
    debug_mode=gui
    ヒント: ライブ波形ビューアーをイネーブルにしている場合は、ハードウェア エミュレーションの実行時にシミュレーション波形が開きます。
  3. アプリケーション ハードウェア ビルドの実行の手順に従って、アプリケーションのハードウェア エミュレーション ビルドを実行します。ハードウェア トランザクション データは、<hardware_platform>-<device_id>-<xclbin_name>.wdb 波形データベース ファイルに収集されます。これらのレポートの場所については、v++ コマンドの出力ディレクトリ または Vitis IDE からの出力ディレクトリ を参照してください。
  4. [Run Summary] を開いて波形レポートを開くと、Vitis アナライザーの波形ビューが開きます。
    vitis_analyzer <project>.run_summary

[Waveform] ビューのデータの解釈

次の図に、[Waveform] ビューを示します。

9: [Waveform] ビュー

[Waveform] ビューおよびライブ波形ビューアーは、ナビゲートしやすいように階層形式で表示されます。

  • [Waveform] ビューはハードウェア エミュレーション (カーネル トレース) 中に実際に生成された波形に基づいているので、抽象化されたデータの基になっている個別信号まで詳細に表示できます。ただし、[Waveform] ビューは後処理されたデータから生成されるので、信号を追加することはできず、DATAFLOW トランザクションなどのランタイム解析の一部は表示されません。
  • ライブ波形ビューアーは Vivado ロジック シミュレータ (xsim) の実行の一部として表示されるので、RTL デザインの信号および内部信号をライブ波形に追加できます。波形ビューアーの詳細は、『Vivado Design Suite ユーザー ガイド: ロジック シミュレーション』 (UG900) を参照してください。

[Waveform] ビューおよびライブ波形ビューアーには、次のような階層があります。

Device "name"
ターゲット デバイスの名前。
Binary Container "name"
バイナリ コンテナーの名前。
Memory Data Transfers
ホストからバンクに到着する読み出しおよび書き込みトランザクションすべてのトレースを DDR バンクごとに示します。
Kernel "name" 1:1:1
各カーネルおよびそのカーネルの計算ユニットごとに、計算ユニットからのアクティビティを示します。
Compute Unit: "name"
計算ユニットの名前。
CU Stalls (%)
外部メモリ アクセス、内部ストリーム (データフロー)、または外部ストリーム (OpenCL パイプ) が原因で回路の一部がストールした場合に通知するため、Vitis HLS ツールからストール信号が提供されています。カーネル トレースに詳細に示されるストール バスは、最下位のストール信号をすべてコンパイルし、すべての時点でのストールしている割合 (%) をレポートします。これにより、カーネルのどの程度がシミュレーションでストールしているかがわかります。

たとえば、100 個の最下位ストール信号があり、あるクロック サイクルでそのうち 10 個がアクティブであれば、[CU Stall (%)] は 10% です。そのうちの 1 つがアクティブでなくなれば、9% になります。

Data Transfers
計算ユニットの各マスター AXI ポートから DDR への読み出し/書き込みデータ転送アクセスを示します。
User Functions
HLS カーネル用に表示される情報で、ユーザー関数を示します。
Function: "name"
関数名。
Dataflow/Pipeline Activity
関数がデータフロー プロセスとしてインプリメントされる場合、並列実行される関数の数を示します。
Active Iterations
現在のアクティブなデータフローのイテレーションを示します。すべての同時実行を表示するため、行数は動的に増加します。
StallNoContinue
データフロー プロセスにより出力でストールが発生した (関数は完了したが隣接するデータフロー プロセスからの続行信号は受信していない) ことを示すストール信号です。
RTL Signals
データフロー プロセスの上記のトランザクション ビューを解釈するために使用された RTL 制御信号です。
Function Stalls
プロセスで発生したさまざまなタイプのストールを示します。
External Memory
DDR メモリにアクセス中に発生したストール。
Internal-Kernel Pipe
計算ユニットがパイプを使用して通信する場合に、関連するストールを示します。
Intra-Kernel Dataflow
内部からカーネルへの FIFO アクティビティ。
Function I/O
実際のインターフェイス信号。
Function: "name"
関数名。
Function: "name"
関数名。