PS ホスト コードでイベント API を呼び出すことにより、デザインのプロファイル統計を収集できます。これらのイベント API は、シミュレーションおよびハードウェアでの実行で使用できます。
注記: このセクションで説明するイベント API は、前セクションのプロファイリング方法とは互換性がありません。イベント API は、ホスト コードで挿入されています。設計者は、イベントがいつ開始し、どのように停止するかを制御する必要があります。
AI エンジンにはパフォーマンス カウンターが含まれ、パフォーマンス メトリクスを計測するためにハードウェア イベントをカウントするよう設定できます。イベント API をグラフ制御 API と共に使用して、グラフの指定の期間実行して、特定のパフォーマンス メトリクスをプロファイリングできます。イベント API では、プラットフォーム I/O ポートの帯域幅、グラフのスループット、グラフのレイテンシなどのパフォーマンス メトリクスを計測するのにプラットフォーム I/O ポート (PLIO および GMIO) のみがサポートされます。
イベント API は、AI エンジン/PL インターフェイスを通過するネットのストリーム スイッチで発生したイベントを監視します。ネット上のストリーム スイッチのイベントには、次の図に示すように、idle
、running
、および 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(......);