実行中イベントおよびグラフのスループットのプロファイリング - 2023.2 日本語

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

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

AMD では、実行中イベント (ネットを介して送信されたサンプル数) をカウントする event::io_stream_running_event_count を提供しています。event::start_profiling() を実行すると、パフォーマンス カウンターが開始します。パフォーマンス カウンターは、データ サンプルが AI エンジン/PL インターフェイスを通過するたびにインクリメントされます。event::read_profiling() でリードバックされた値は、インターフェイスを介して送信されたサンプル数です。

送信および受信されるサンプルのカウント方法

この方法は、グラフがストールする前に送信または受信されたサンプル数をカウントするのに使用できます。次に、グラフがストールする前に AI エンジン ポートから受信するサンプル数をカウントする例を示します。
event::handle handle = event::start_profiling(gr_pl.dataout, event::io_stream_running_event_count);
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);
sleep(2);//Wait for enough time
long long cycle_count = event::read_profiling(handle);
printf("Sample number: %d\n", cycle_count);
event::stop_profiling(handle);//Performance counter is released and cleared
次に、グラフがストールする前に AI エンジン ポートに送信するサンプル数をカウントする例を示します。
event::handle handle = event::start_profiling(gr_pl.in, event::io_stream_running_event_count);
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);//After start profiling, send data from mm2s
gr_pl.run(iterations);

sleep(2);//Wait for enough time
long long cycle_count = event::read_profiling(handle);
printf("Sample number: %d\n", cycle_count);
event::stop_profiling(handle);//Performance counter is released and cleared

ポートのスループットのプロファイリング

ポートのスループットは、特定の時間内に転送れたサンプル数で定義されます。グラフの実行後、ホスト コードに次のコードを挿入してポートのスループットを計測できます。デザインのポートのスループットを安定した状態でプロファイルするには、ポートのスループットをプロファイルする前に、データ転送が安定した状態であることを確認する必要があります。
gr_pl.run(iterations); // The graph may also have been started during device boot-up
usleep(100); // Wait enough time (here 100us) to be in a steady state IO activity
int wait_time_us=20000;
event::handle handle = event::start_profiling(gr_pl.dataout, event::io_stream_running_event_count);
if(handle==event::invalid_handle){
    printf("ERROR:Invalid handle. Only two performance counter in a AIE-PL interface tile\n");
    return 1;
} 
long long count0 = event::read_profiling(handle); 
usleep(wait_time_us); 
long long count1 = event::read_profiling(handle); 
event::stop_profiling(handle); 
long long samples = count1 - count0; 
std::cout << "num runnning samples: " << samples << std::endl; 
std::cout << "Throughput: " << (double)samples / wait_time_us << " MSPS " << std::endl;

AMD では、正確にするため、デザインをハードウェアで繰り返し実行することをお勧めします。ハードウェア エミュレーションでは、この方法の精度は変動します。

AI エンジン シミュレータでも、このプロファイリング方法が適用されます。SystemC では usleepwait 関数に置き換える必要があります。シミュレーションは低速なので、シミュレーション時間によっては待機時間が小さくなる場合があります。たとえば、上記のコードの usleep 関数は、AI エンジン シミュレータ用には次の関数呼び出しに置き換えて、シミュレーション時間を短縮できます。
wait(20,SC_US);