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 では
usleep
を wait
関数に置き換える必要があります。シミュレーションは低速なので、シミュレーション時間によっては待機時間が小さくなる場合があります。たとえば、上記のコードの usleep
関数は、AI エンジン シミュレータ用には次の関数呼び出しに置き換えて、シミュレーション時間を短縮できます。wait(20,SC_US);