プロファイリング データの生成
シミュレーション フレームワークでは、AI エンジン シミュレータで完全なアプリケーションのプロファイリング レポートを生成できます。このレポートは、–-profile
オプションを使用して生成します。
aiesimulator –pkg-dir=Work –-profile
テキスト ファイルおよび XML ファイルは、aiesimulator_output
ディレクトリに生成されます。列 C と行 R にあるタイルに対して 2 種類のファイルが生成されます。*_funct
は、各関数の呼び出し数とサイクル数をレポートします。*_instr
は、アセンブリ コードまでを含むレポートです。レポートを表示するには、Vitis 統合 IDE の [Analysis] ビューを使用します。
vitis -a aiesimulator_output/default.aierun_summary
Profile タブにプロファイル レポートが開き、情報を示すセクションのメニューが表示されます。
- [Summary]
- 合計サイクル数、合計命令数、およびメモリ内のプログラムのサイズをレポートします。
- [Function Reports]
- 関数の主要なインジケーターをグラフで示します。
- 呼び出し数
- 関数が実行される回数をレポートします。
- 合計関数時間 (サイクル数および %)
- 関数の実行時間 (サイクル数および %) をレポートします。これは、関数内のコードを実行するのに必要な時間であり、その子孫関数の呼び出しは含まれません。
- 合計関数時間 + 子孫時間 (サイクル数および %)
- 関数の実行時間と子孫関数の実行時間をレポートします (子孫関数とは、プロファイル情報がレポートされる関数によって呼び出される関数のこと)。合計関数時間 + 子孫時間は、関数内のコード実行に必要な時間と、その関数が呼び出す関数の実行に必要な時間の合計を表し、その関数の子孫関数で費やされる時間も含まれます。この時間には関数自体に費やされた時間だけでなく、その関数が直接または間接的に呼び出すすべての関数に費やされた時間も含まれます。
- 最小/平均/最大の関数時間 (サイクル数)
- 関数の最小/平均/最大の実行時間 (サイクル数および %) をレポートします。
- 最小/平均/最大の関数時間 + 子孫時間 (サイクル数)
- 関数の最小/平均/最大の実行時間と子孫関数の実行時間をレポートします (子孫関数とは、プロファイル情報がレポートされる関数によって呼び出される関数のこと)。
- プログラム カウンター Low/High
- 指定関数のプログラム カウンターの最小値と最大値をレポートします。
- [Profile Details]
- アセンブリ コードを関数ごとに有益な精度で示します。次の表に各列を示します。
列見出し | 内容 |
---|---|
[PC] | プログラム カウンター |
Instruction | 行ごとに 16 バイトまで |
[Assembly] | 7 ウェイ命令ワード全体を含むアセンブリ コードのニーモニック |
[Exe-count] | この行がプロセッサにより実行される回数 |
[Cycles] | 必要なサイクル数 |
[User Count] | |
[Wait States] | 一部の命令では、メモリの競合が発生し、多数の待機ステートが生成されることがあります。 |
[Relative cycle use within function] | 「*」の行として示され、関数でこの命令が使用される相対的なサイクル数を相対的な長さで表示します。 |
[Relative cycle use within simulation] | 「*」の行として示され、シミュレーション (main() およびすべての関数を含む) でこの命令が使用される相対的なサイクル数を相対的な長さで表示します。 |
[Relative wait-state use within function] | 「W」の行として示され、関数でこの命令中に待機ステートにより使用される相対的なサイクル数を相対的な長さで表示します。 |
[Relative wait state use within simulation] | 「*」の行として示され、シミュレーション (main() およびすべての関数を含む) でこの命令中に待機ステートにより使用される相対的なサイクル数を相対的な長さで表示します。 |
プロファイル データを使用したパフォーマンスのデバッグ
デザインのパフォーマンス向上は、サイクル数が最もかかる関数を最適化することから開始する必要があります。それが完了したら、サイクル数が少ない関数を最適化できます。合計関数時間グラフを使用すると、関数の選択に役立ちます。
最適化には、通常のパイプライン処理、ループ展開にプラグマ (chess_prepare_for_pipelining、chess_loop_range) を使用できます。Profile Details タブに、待機ステートに関する情報が表示されます。内側ループが完全に最適化されていても、待機ステートによってあるサイクル数が使用される可能性があります。これらの待機ステートは、リソース アクセスに競合がある場合に発生します。
- ローカル AI エンジンまたは 2 つの連続した AI エンジンからの、同じメモリ バンク内での 2 つの読み出しまたは 1 つの読み出しと 1 つの書き込み。
- ローカル AI エンジンは、メモリ DMA がデータ転送のためにアクセスしている間に、バンク (読み出しまたは書き込み) にアクセスしようとします。
次に、プロファイルの詳細の例を示します。
このスクリーンショットでは、まず内側ループが ls (ループ開始) と le (ループ終了) で局所化されています。上の図では、この内側ループを青で囲んで示しています。これらの行では実行回数がほかの行よりも多いので、これは正しいと思われます。
2 番目のステップでは、待機ステートがあるために 1 クロック サイクルではなく 2 クロック サイクルかかっている命令が局所化されます。
- 実行回数: 56
- サイクル数: 112
VMUL 命令は、レジスタ yd のデータと wc0 の係数を使用します。ロードでデータがレジスタで有効になるまでに 7 クロック サイクルかかります。3 番目のステップでは、最初のイテレーション (3) の前、または前のイテレーション (3') のループ内でコードを 7 クロックサイクル前に解析します。ここで、各ケースに同じバンクにある 2 つのロードがあることがわかります (すべての読み出しはソース コードの同じウィンドウから実行される)。