グラフの帯域幅のプロファイリング - 2023.2 日本語

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

Document ID
UG1076
Release Date
2023-12-04
Version
2023.2 日本語

event::io_total_stream_running_to_idle_cycles プロファイリング イベントを使用して、プロファイリングされる AI エンジン - PL インターフェイスで発生する実行中イベントおよびストール イベントを追跡できます。つまり、インターフェイスがアクティブ (データが通過している) となっているサイクル数と、インターフェイスがストールしているサイクル数を追跡します。インターフェイスがアイドル状態であるサイクル数は追跡されません。

event::start_profiling() の実行後、パフォーマンス カウンターは実行中のデータの開始を待機し、ストリームがアイドル状態の場合は一時停止します。パフォーマンス カウンターが一時停止した後、データフローが再開されると再開します。event::stop_profiling() の実行後、パフォーマンス カウンターがクリアされ、解放されます。この API は、AI エンジンと PL カーネルが利用可能な帯域幅をどの程度利用しているかをレポートします。これは、ポート帯域幅のベスト ケースの使用率を示す指標ではありません。

入力ポートを使用したグラフの帯域幅のプロファイル

グラフの帯域幅は、グラフがデータを受信できる時間の割合で定義できます。

次に、グラフの入力ポートを使用してグラフの帯域幅を計測するコード例を示します。
const int WINDOW_SIZE_in_bytes=8192;
int iterations=999;
event::handle handle = event::start_profiling(gr_pl.in, event::io_total_stream_running_to_idle_cycles);
if(handle==event::invalid_handle){
    printf("ERROR:Invalid handle. Only two performance counter in a AIE-PL interface tile\n");
    return 1;
} 
auto mm2s_run = mm2s(nullptr, OUTPUT_SIZE_MM2S);
gr_pl.run(iterations);
gr_pl.wait(); 
long long cycle_count = event::read_profiling(handle);
double bandwidth = (double) (WINDOW_SIZE_in_bytes*iterations/4) / cycle_count; 
event::stop_profiling(handle);//Performance counter is released and cleared

ここで、合計実行サイクル数は転送されるバイト数から計算できます。1 サイクルごとに 4 バイトの場合、合計実行サイクル数は WINDOW_SIZE_in_bytes*iterations/4 です。合計実行サイクル数とストール サイクル数は、event::read_profiling() を使用してパフォーマンス カウンターから読み出します。

プロファイルされた帯域幅が 1 の場合は、グラフが PL カーネル mm2s よりも高速に実行されていることを意味し、入力ポートはストールしていません。

プロファイルされた帯域幅が 1 未満の場合は、PL カーネル mm2s はグラフまたは PL カーネル s2mm が受信できる速度よりも速くデータを送信できます。帯域幅の低下の原因がグラフまたは PL カーネル s2mm どちらであるかを評価する必要がある場合があります。

出力ポートを使用したグラフの帯域幅のプロファイル

グラフの帯域幅は、グラフがデータを送信できる時間の割合で定義できます。プロファイルされた帯域幅が 1 の場合は、グラフが PL カーネル s2mm によりブロックされていないことを意味します。プロファイルされた帯域幅が 1 未満の場合は、バック プレッシャーのため、グラフが s2mm によりある割合ブロックされていることを意味します。次に、グラフの出力ポートを使用してグラフの帯域幅を計測するコード例を示します。
const int WINDOW_SIZE_in_bytes=8192;
int iterations=999;
event::handle handle = event::start_profiling(gr_pl.dataout, event::io_total_stream_running_to_idle_cycles);
if(handle==event::invalid_handle){
    printf("ERROR:Invalid handle. Only two performance counter in a AIE-PL interface tile\n");
    return 1;
} 
gr_pl.run(iterations);
gr_pl.wait(); 
long long cycle_count = event::read_profiling(handle);
double bandwidth = (double) (WINDOW_SIZE_in_bytes*iterations/4) / cycle_count; 
event::stop_profiling(handle);//Performance counter is released and cleared