グラフの入力および出力用のイベント プロファイル API - 2023.2 日本語

AI エンジン ツールおよびフロー ユーザー ガイド (UG1076)

Document ID
UG1076
Release Date
2023-12-04
Version
2023.2 日本語
PS ホスト コードでイベント API を呼び出すことにより、デザインのプロファイル統計を収集できます。これらのイベント API は、シミュレーションおよびハードウェアでの実行で使用できます。
注記: このセクションで説明するイベント API は、前セクションのプロファイリング方法とは互換性がありません。イベント API は、ホスト コードで挿入されています。設計者は、イベントがいつ開始し、どのように停止するかを制御する必要があります。

AI エンジンにはパフォーマンス カウンターが含まれ、パフォーマンス メトリクスを計測するためにハードウェア イベントをカウントするよう設定できます。イベント API をグラフ制御 API と共に使用して、グラフの指定の期間実行して、特定のパフォーマンス メトリクスをプロファイリングできます。イベント API では、プラットフォーム I/O ポートの帯域幅、グラフのスループット、グラフのレイテンシなどのパフォーマンス メトリクスを計測するのにプラットフォーム I/O ポート (PLIO および GMIO) のみがサポートされます。

イベント API は、AI エンジン/PL インターフェイスを通過するネットのストリーム スイッチで発生したイベントを監視します。ネット上のストリーム スイッチのイベントには、次の図に示すように、idlerunning、および stall があります。

図 1. ネット上のイベント
  • ストリーム スイッチを通過するデータがない場合、ストリーム スイッチは idle ステートになります。
  • ストリーム スイッチを通過するデータがある場合、ストリーム スイッチは running ステートになります。
  • ネット上のすべての FIFO がフルになると、ストリーム スイッチは stall ステートになります。
  • データ転送が再開すると、ストリーム スイッチは running ステートになります。

次に、データが mm2s PL カーネルから AI エンジンに転送されるグラフの例を示します。グラフがデータを AI エンジンから s2mm PL カーネルに送信することも示します。

図 2. グラフの例

異なるポートが同じ AI エンジン/PL インターフェイス列を通過できます。この列は、インターフェイスのパフォーマンス カウンターを共有します。Vitis IDE の array ビューで、これらのポートの配線がどの列を通過しているかを確認できます。次の図に、上記の例の array を示します。赤い丸で囲まれた部分はストリーム スイッチであり、ここでイベント API が監視します。

図 3. [Array] ビューの例
注記:
  • AI エンジンの入力バッファー buf0 は、グラフの初期化後に mm2s PL カーネルからのデータを受信できるようになります。mm2s PL カーネルが開始すると、buf0 に接続されたストリーム スイッチ内のピンポン バッファーと FIFO が順次充填されます。これらのバッファーとの間で転送されるデータは、graph.run() に依存しません。
  • AI エンジン/PL インターフェイスの各列に、2 つのパフォーマンス カウンターがあります。パフォーマンス カウンターの数は限られるので、event::stop_profiling() を使用してパフォーマンス カウンターを解放できます。
  • グラフとプロファイリング API を呼び出す際に、オーバーヘッドが発生します。プロファイリング結果は、event::read_profiling() を使用して読み出すことができます。event::read_profiling() の前にパフォーマンス カウンターが停止していない場合、プロファイリング結果が変動することがあります。
重要: これらの API は、AI エンジン シミュレーション、ハードウェア エミュレーション、およびハードウェア フローで使用できます。ハードウェア エミュレーションおよびハードウェア フローでは、イベント プロファイル API を使用する前に adf::registerXRT が必要です。次に例を示します。
#include "adf/adf_api/XRTConfig.h"
......
auto device = xrt::device(0); //device index=0
auto uuid = device.load_xclbin(xclbinFilename);
auto dhdl = xrtDeviceOpenFromXcl(device);
adf::registerXRT(dhdl, uuid.get());
event::handle handle = event::start_profiling(......);