AI エンジン グラフ アプリケーションのコンパイル

この章では、AI エンジン コンパイラ (aiecompiler) のすべてのコマンド ライン オプションについて説明します。このコンパイラにデータフロー グラフのコードと個々のカーネルのコードを入力すると、シミュレータ、エミュレーター、AI エンジン デバイスなど各種 AI エンジン ターゲット プラットフォームで動作するイメージが生成されます。特に指定しない限り、すべての入力ファイルのパスはカレント ディレクトリからの相対パスとなり、すべての出力ファイルのパスは Work ディレクトリからの相対パスとなります。

AI エンジン グラフとカーネルは、スタンドアロン アプリケーションとして単体でコンパイルして、エミュレーションまたはハードウェアを使用して AI エンジン プロセッサ アレイで実行できます。または、グラフとカーネルを大規模なシステム デザインの一部として使用し、Versal™ デバイスのエンベデッド プロセッサ上で動作する ELF アプリケーション、およびデバイスのプログラマブル ロジックで動作する PL カーネルと AI エンジン グラフを統合することもできます。単体構成で使用するか、大規模なシステムの一部として使用するかを問わず、グラフとカーネルは AI エンジン コンパイラを使用してコンパイルします。

Vitis IDE の使用 で説明するように、プロジェクトのビルド設定の作成と管理、および AI エンジン コンパイラの実行は、Vitis™ IDE から可能です。また、プロジェクトをコマンド ラインから (Vitis ツール フローを使用したアプリケーションの統合 参照)、あるいはスクリプトまたは Makefile でビルドすることもできます。いずれの方法でも、シミュレーションまたはエミュレーションを実行してグラフ アプリケーションまたは統合システム デザインを検証し、インタラクティブなデバッグ環境でデザインをデバッグした後、デザインをビルドしてハードウェアで実行および運用できます。どの方法でツールを使用するにせよ、最初に環境をセットアップが必要です。

Vitis ツール環境の設定

AI エンジン ツールは、Vitis 統合ソフトウェア プラットフォームの一部としてインストールされます。そのため、AI エンジン コンパイラや AI エンジン シミュレータなどの AI エンジン ツールを実行するには、Vitis ツールを設定する必要があります。Vitis 統合ソフトウェア プラットフォームには次の 2 つの構成要素があり、有効な Vitis ツール ライセンスと共に、これらをインストールおよび設定する必要があります。

  • Vitis ツールおよび AI エンジン ツール
  • ターゲット Vitis プラットフォーム (AI エンジン アプリケーション用の xilinx_vck190_base_202020_1 プラットフォームなど)

詳細は、『Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発』 (UG1393: 英語版日本語版) を参照してください。

Vitis ソフトウェア プラットフォームのこれらの構成要素をインストールしたら、次のスクリプトを実行して、特定のコマンド シェルで実行できるよう環境設定する必要があります。

#setup XILINX_VITIS and XILINX_HLS variables
 source <Vitis_install_path>/Vitis/<version>/settings64.csh
ヒント: settings64.sh および setup.sh スクリプトも同じディレクトリに含まれています。

最後に、次の環境変数を設定して、Vitis IDE および AI エンジン ツールで使用可能なプラットフォームの場所を指定します。

setenv PLATFORM_REPO_PATHS <path to platforms>
ヒント: PLATFORM_REPO_PATHS 環境変数には、プラットフォーム ファイル (XPFM) を含むディレクトリを指定します。これにより、プラットフォームのフォルダー名のみを使用してプラットフォームを指定できるようになります。

ツールのインストールおよび設定を確認するには、次のいずれかのコマンドを使用します。

which vitis
which aiecompiler

プラットフォームのインストールを確認するには、次のコマンドを使用します。

platforminfo --list

入力

AI エンジン コンパイラにいくつかの形式のファイルを入力すると、AI エンジン デバイス上で動作するアプリケーションの実行ファイルが生成されます。AI エンジン コンパイラを実行するためのコマンド ラインは、次のとおりです。

aiecompiler [options] <Input File>

ここで

  • <Input File>: AI エンジン グラフの main() アプリケーションを定義したデータフロー グラフのコードを指定します。入力フロー グラフは、データフロー グラフ言語を使用して記述します。データフロー グラフの説明は、データフロー グラフ (カーネルを含む) を作成する を参照してください。

次に、AI エンジン コンパイラのコマンド例を示します。

aiecompiler --verbose --pl-freq=100 --workdir=./myWork --platform=xilinx_vck190_202020_1.xpfm\
--include="./" --include="./src" --include="./src/kernels" --include="./data" --include="${XILINX_HLS}/include"  \
./src/graph.cpp

コマンド ラインには、次の入力オプションを含めることもできます。

  • --constraints=<jsonfile>: ロケーションや配置境界ボックスなどの制約を指定します。

出力

デフォルトでは、AI エンジン コンパイラはすべての出力を Work ディレクトリに出力し、それ以外に libadf.a も生成します。Work は、ツールを起動したカレント ディレクトリのサブディレクトリです。libadf.aVitis コンパイラの入力ファイルとして使用するファイルで、AI エンジン コンパイラを起動したのと同じディレクトリに作成されます。出力のタイプと出力ディレクトリの内容は、--target (AI エンジン コンパイラのオプション 参照) の指定により異なります。Vitis コンパイラの詳細は、『Vitis 統合ソフトウェア プラットフォームの資料』 (UG1416) のアプリケーション アクセラレーション開発フローの Vitis コンパイラ コマンド を参照してください。

ヒント: --workdir オプションを使用すると、出力ディレクトリを変更できます。

次の表に、./Work ディレクトリの構造と内容を示します。

表 1. Work ディレクトリの構造
ディレクトリ/ファイル 説明
./Work/
<name>.aiecompile_summary 生成されたこのファイルを Vitis アナライザーで開くと、コンパイルのサマリを確認できます。
config/scsim_config.json SystemC シミュレータへのオプションを指定する JSON スクリプト。この中には、AI エンジン アレイ タイルのジオメトリ、入力/出力ファイル仕様、およびストリーム スイッチへの接続に関する情報が含まれます。
arch/
logical_arch_aie.larch AI エンジン アプリケーションのハードウェア要件を記述した JSON ファイル。
aieshim_constraints.json この JSON ファイルが存在する場合、AI エンジン アプリケーションで提供される AI エンジン アレイとプログラマブル ロジック間のユーザー定義物理インターフェイス制約を表します。
aieshim_solution.aiesol AI エンジン アレイとプログラマブル ロジック間のインターフェイスをまたぐ論理チャネルから物理チャネルへのマップを記述した JSON ファイル。
cfgraph.xml AI エンジン アプリケーションのハードウェア要件を記述した XML ファイル。Vitis ツール フローで使用します。
aie/
Makefile すべての AI エンジンのコードをコンパイルするための Makefile
<n>_<m>/ AI エンジンごとのコンパイル ディレクトリ。
Release/ ELF ファイルを含む AI エンジンの Synopsys リリース ディレクトリ。
<n>_<m>.lst <n>_<m> のカーネルのマイクロコード。
<n>_<m>.map <n>_<m> のカーネルのメモリ マップを示します。メモリ サイズ、幅、およびオフセットの情報も含みます。
scripts/ Synopsys コンパイラ プロジェクトおよびリンカー スクリプト。
src/ カーネルと main を含むプロセッサ用ソース ファイル。
pl/systemC/ すべての PL カーネル用の SystemC モデルを含むディレクトリ。
Makefile すべての PL SystemC モデルをコンパイルするための Makefile。
generated-source/ 各 PL カーネル用の SystemC ラッパー。
generated-objects/ 各 PL カーネル用のコンパイル済み共有ライブラリ。
ps/c_rts/ PS との連携をモデル化するための C ベースのランタイム制御を含むディレクトリ。
aie_control.cpp プログラムに存在するグラフ オブジェクト用のグラフ API init,run,end を実装した AI エンジン制御コード。このファイルをアプリケーションの main とリンクして、シミュレータおよびベアメタル用の PS スレッドを作成します。
aie_control_xrt.cpp プログラムに存在するグラフ オブジェクト用のグラフ API init,run,end を実装した AI エンジン制御コード。このファイルをアプリケーションの main とリンクして、Linux アプリケーション用の PS スレッドを作成します。
systemC/ PS main 用の SystemC モデルを含むディレクトリ。
Makefile すべての PS SystemC モデルをコンパイルするための Makefile。
generated-source/ PS main 用の SystemC ラッパー。
generated-objects/ PS main 用のコンパイル済み共有ライブラリ。
ps/cdo/ グラフのコンフィギュレーションと初期化に使用する、コンフィギュレーション データ オブジェクト (CDO) 形式のジェネレーター コードを含むディレクトリ。System C-RTL シミュレーションおよび実際のハードウェア実行時に使用します。
Makefile グラフ CDO をコンパイルするための Makefile
generateAIEConfig グラフ CDO をビルドするための bash スクリプト。
generated-sources/ CDO を生成するための C++ プログラム。
generated-objects/ CDO を生成するためのコンパイル済みプログラム。
pthread/
PthreadSim.c 入力データフロー グラフのソースを、pthreads を使用して実装した C プログラム ソースに変換したもの。
sim.out PthreadSim.c を GCC でコンパイルしたバイナリ。
reports/
<graph>_mapping_analysis_report.txt AI エンジンへのカーネルの割り当て、および AI エンジン メモリ グループへのウィンドウ バッファーの割り当てを記述したマップ レポート。
<graph>.png カーネル グラフの接続と AI エンジンへの分割を示したビットマップ ファイル。
<graph>.xpe ハードウェア リソースの使用状況に基づいて見積もったグラフの消費電力プロファイルを記述した XML ファイル。Xilinx® Power Estimator (XPE) で使用します。
sync_buffer_address.json カーネル同期バッファーのアドレス (ローカルおよびグローバル アドレス) を示します。
lock_allocation_report.json ポート、およびどのロックとバッファーがカーネルに関連するかを記述します。
dma_lock_report.json AI エンジンに対する入力/出力の DMA ロック、およびこれらがバッファー情報を使用して接続するカーネルを示します。
temp/ AI エンジン コンパイラが一時ファイルを生成するディレクトリ。これらのファイルは、デバッグに役立ちます。また、CF グラフの .o ファイルもデフォルトでこのディレクトリに生成されます。

AI エンジン コンパイラのオプション

表 2. AI エンジンのオプション
オプション名 説明
--constraints=<string> ロケーションや境界ボックスなどの制約は、JSON ファイルを使用して指定できます。このオプションで、1 つまたは複数の制約ファイルを指定します。
--heapsize=<int> AI エンジンが使用するヒープ サイズ (単位: バイト) を指定します (デフォルトは 1024)。ユーザー グラフで明示的に接続されていない、残りのファイル スコープ データを割り当てるために使用します。
--stacksize=<int> AI エンジンが使用するスタック サイズ (単位: バイト) を指定します (デフォルトは 1024)。スタック割り当て済みのローカル変数およびレジスタあふれを含む標準コンパイラ呼び出し規約として使用します。
--pl-freq=<value> すべての PL カーネルおよび PLIO の周波数 (単位: MHz) を指定します。デフォルトの周波数は、AI エンジンの周波数の 1/4 です。各インターフェイス固有の PL 周波数は、グラフ内で指定します。
--pl-register-threshold=<value> レジスタを介する AI エンジン-PL インターフェイスの周波数 (MHz) しきい値を指定します。デフォルトの周波数は、AI エンジンの周波数 (デバイスのスピード グレードによる) の 1/8 です。
注記: AI エンジン アレイの周波数の 1/4 よりも大きい値を指定した場合は無視され、1/4 の値が適用されます。
表 3. CDO のオプション
オプション名 説明
--enable-ecc-scrubbing 使用するすべての AI エンジンに対する ECC スクラビングを有効にします。このオプションを指定すると、AI エンジン ELF CDO を生成する際に、ECC スクラビングが有効になります。(1 コアにつき 1 個のパフォーマンス カウンターが使用される)。デフォルトでは、ECC スクラビングは無効です。
表 4. コンパイラ デバッグ オプション
オプション名 説明
--kernel-linting グラフとカーネルの整合性チェックを実行します。デフォルトでは False です。
--log-level=<int> verbose のログ レベルを指定します (0: ログなし、5: すべてのデバッグ メッセージ)。デフォルトのレベルは 1 です。
注記: -–verbose を指定した場合のデフォルトのレベルは 5 です。
-v | --verbose AI エンジン コンパイラの出力を verbose に設定し、コンパイルの各種ステージでコンパイラ メッセージを出力するようにします。これらのデバッグおよびトレース ログは、コンパイル プロセスに関して有用なメッセージを提供します。
表 5. 実行ターゲット オプション
オプション名 説明
--pl-axi-lite=[true|false] PL AXI4-Lite インターフェイスを true または false で指定します (デフォルト: false)。
--target=<hw|x86sim> AI エンジン コンパイラはいくつかのビルド ターゲットをサポートします (デフォルト: hw)。
  • ターゲットに hw を指定すると、ターゲット プラットフォーム上のハードウェア デバイスで使用する libadf.a が生成されます。
  • ターゲットに x86sim を指定すると、x86simulator で使用するコードがコンパイルされます (x86 論理シミュレータ (x86simulator) 参照)。
表 6. ファイル オプション
オプション名 説明
--include=<string> このオプションを指定すると、コンパイラのフロンドエンド処理に使用するインクルード パスにディレクトリを追加できます。

1 つまたは複数のディレクトリを指定します。

--output=<string> 入力データフロー グラフ ファイルに対してフロントエンドが生成する output.json ファイルを指定します。この出力ファイルをバックエンドに渡して、AI エンジン デバイスのマップとコード生成を実行します。ほかのタイプの入力では、このオプションは無視されます。
--platform=<string>

ハードウェア設計およびその RTL 協調シミュレーションを実行する際に利用可能なハードウェアおよびソフトウェア コンポーネントを定義した Vitis プラットフォーム ファイルのパスを指定します。

--workdir=<string>

デフォルトでは、コンパイラはすべての出力をカレント ディレクトリ直下の Work サブディレクトリに生成します。別の出力ディレクトリを指定する場合に、このオプションを使用します。

表 7. 一般オプション
オプション名 説明
--help AI エンジン コンパイラで利用可能なオプションを、ここで示したグループ順に表示します。
--help-list AI エンジン コンパイラのオプションを、アルファベット順に表示します。
--version AI エンジン コンパイラのバージョンを表示します。
表 8. その他のオプション
オプション名 説明
--no-init AI エンジン データ メモリのウィンドウ バッファーの初期化を無効にします。このオプションを指定すると、System C-RTL 協調シミュレーション フレームワークへのバイナリ イメージの読み込みが高速化します。
ヒント: このオプションを指定しても、ルックアップ テーブルの静的初期化には影響しません。
--nodot-graph デフォルトでは、AI エンジン コンパイラはユーザーが指定したグラフおよび AI エンジンへの分割を可視化した .dot および .png ファイルを生成します。このオプションを指定すると、.dot ファイルが出力されなくなります。
--xlopt このレベルに基づいてカーネル最適化の組み合わせを有効にします (デフォルト: 0)。
  • 0: シングル コア コンパイラ最適化のみ。
  • 1: AI エンジン コンパイラによる解析とガイダンス。
    • このガイダンスにより、マップ ツールは大規模なグローバル アレイの割り当てを最適化でき、メモリ競合が最小に抑えられます。
    • ベクターとしてアクセスされるグローバル アレイを効率よくアライメントします。Versal AI エンジン アーキテクチャでは、このアライメントが必要です。
    • カーネル解析を使用して各コアのヒープ要件を自動的に計算します。ユーザーがヒープ サイズを指定する必要がなくなり、使いやすさが向上します。
注記: コンパイラ最適化 (xlopt > 0) を実行すると、デバッグ可視性が低下します。
表 9. モジュール固有オプション
オプション名 説明
--Xchess=<string> AI エンジン用コードをコンパイルする CHESS コンパイラにカーネル固有オプションを渡します。

オプション文字列を <kernel-function>:<optionid>=<value> として指定します。このオプション文字列は、特定のカーネル関数がマップされる AI エンジンの生成済みソース ファイルをコンパイルする際にインクルードされます。

--Xelfgen=<string> コンパイラの ELF 生成フェーズに追加のコマンド ライン オプションを渡します。現在、このフェーズでは 1 回の make コマンドですべての AI エンジン ELF ファイルを生成します。

たとえば、並列コンパイルの数を 4 までに制限するには、-Xelfgen="-j4" と指定します。

--Xmapper=<string> コンパイラのマップ フェーズに追加のコマンド ライン オプションを渡します。例:
--Xmapper=DisableFloorplanning

マップまたは配線段階でデザインが収まらない場合、またはメモリ バンクの競合を抑えて性能の改善を試みる場合に、これらのオプションを指定します。

オプションの一覧と説明は、マップ ツールおよびルーターのオプション を参照してください。

--Xpreproc=<string> すべてのソース コード コンパイル (AIE/PS/PL/x86sim) の PREPROCESSOR フェーズに一般オプションを渡します。例:
--Xpreproc=-D<var>=<value>
--Xpslinker=<string> PS LINKER フェーズに一般オプションを渡します。例:
--Xpslinker=-L<libpath> -l<libname>
--Xrouter=<string> ROUTER フェーズに一般オプションを渡します。例:
-Xrouter=enableSplitAsBroadcast
表 10. トレーシング オプション
オプション名 説明
--aie-heat-map AI エンジンのヒート マップ設定を有効にします (デフォルト: False)。
--event-trace=<value>

ただし <value> = functions

イベント トレースの値を設定します。functions は、AI エンジン上でどのファンクションの遷移をキャプチャするかを示します。
--num-trace-streams=<int> トレース ストリームの数。

マップ ツールおよびルーターのオプション

表 11. マップ ツールのオプション
オプション 説明
DisableFloorplanning このオプションを指定すると、マップ ツールの自動フロアプランニング フェーズが無効になります。制約の多いデザインにおいて、ロケーション制約を使用してユーザー主導でマッピング フェーズを実行する場合に役立ちます。
BufferOptLevel[1-9] このオプションを指定すると、メモリ バンクの競合を減らしてスループットを向上できます。BufferOptLevel の値を大きくすると、マップ ツールは同じメモリ バンクにマップされるバッファーの数を減らそうとします。この結果、全体的な性能に影響するバンク競合が生じる確率が低下します。BufferOptLevel の値を大きくすると全体的なマップ領域が広くなり、ごくまれにソリューションが見つからないことがあります。BufferOptLevel のデフォルト値は、BufferOptLevel0 です。
disableSeparateTraceSolve デフォルトのトレース動作では、トレース デバッグ機能を使用する際に AI エンジン マップ ツールはすべての PLIO/GMIO を元のデザイン ロケーションに維持します。ただし元のソリューションにトレース GMIO のためのスペースが残っていない場合、デザインの PLIO を移動する必要があります。このような場合に、このオプションを使用します。
表 12. ルーターのオプション
オプション 説明
enableSplitAsBroadcast このオプションを指定すると、1 つのスプリット ノードからのすべてのスプリット ネットを 1 つのネットとして扱い、100% の使用率を複数のポイントへブロードキャストします。このブロードキャスト ネットは、デザイン内のほかのパケット交換ネットとはリソースを共有しません。このオプションは、スプリット ノードの後の packetstream ネットで干渉が発生してスループットの低下が観察された場合に使用できます。
dmaFIFOsInFreeBankOnly このオプションを指定すると、ほかのバッファーがマップされていないメモリ バンクにのみ DMA FIFO が挿入されます。このオプションは、DMA FIFO バッファーへのアクセスと、同じバンクに配置されたほかのデザイン バッファーへのアクセスが同時に発生してメモリ ストールが観察された場合に使用できます。
disableSSFifoSharing 同じネットの 2 つ以上のターミナルでストリーム スイッチ FIFO を共有するルーター機能を無効にします。このオプションは、各ターミナルにそれぞれ専用の FIFO を割り当てるのに十分な数のストリーム スイッチ FIFO がデバイスに存在しない場合のみ使用してください。

Vitis アナライザーでのコンパイル結果の表示

AI エンジン グラフをコンパイル後、AI エンジン コンパイラはコンパイル結果を <graph-file-name>.aiecompile_summary という名前のサマリとして生成します。これは、Vitis アナライザーで表示できます。このサマリには各種レポート、およびコンパイルしたビルドで実装された AI エンジン アプリケーションのステートを反映した図が含まれます。このサマリは、AI エンジン コンパイラの --workdir オプションで指定する作業ディレクトリ (デフォルトでは ./Work) に出力されます。

AI エンジン コンパイラのサマリを開くには、次のコマンドを実行します。

vitis_analyzer ./Work/graph.aiecompile_summary

Vitis アナライザーが起動し、レポートの Summary ページが表示されます。Report Navigator ビューには、Summary に含まれる各種レポートがリスト形式で表示されます。Vitis アナライザーの詳細は、『Vitis 統合ソフトウェア プラットフォームの資料』 (UG1416) のアプリケーション アクセラレーション開発フローの Vitis アナライザーの使用 を参照してください。

リストには、次のレポートが含まれます。

Summary
最上位のレポートで、ビルドの詳細 (日付、ツール バージョン、グラフへのリンク、ビルドの作成に使用したコマンド ラインなど) が表示されます。
Graph
各種カーネル間のデータフローを示す AI エンジン グラフのフロー図が表示されます。グラフ表示は、必要に応じてズームとパンが可能です。Reports ビューの下部には、カーネル、バッファー、ポート、およびネットなどグラフに関するサマリ情報が表形式で表示されます。グラフ内のオブジェクトをクリックすると、表内でそのオブジェクトがハイライト表示されます。
ヒント: Kernels の表には、グラフに含まれるカーネル、およびカーネル ソース コードへのリンクとグラフ ヘッダー定義がリスト形式で表示されます。リンクのいずれかをクリックすると、Source Code ビューにソース コードが読み出し専用で表示されます。
Array
Versal デバイスの AI エンジン プロセッサ アレイの図が表示されます。グラフ カーネルと接続が、アレイのコンテキスト内に配置されます。アレイ図の一部をズームして、エレメントを選択できます。ここでも、アレイ内のオブジェクトをクリックすると、Reports ビューの下部にある表でそのオブジェクトがハイライト表示されます。
Mapping Analysis
テキスト形式のレポート graph_mapping_analysis_report.txt が表示されます。グラフとデバイス リソース間のブロック マップ、ポート マップ、およびメモリ バンク マップが表示されます。
DMA Analysis
グラフからの DMA アクセスのサマリ情報を記述したテキスト形式のレポート DMA_report.txt が表示されます。
DMA Lock
ポート インスタンス上の DMA ロックをリストにしたテキスト形式のレポート Lock_report.txt が表示されます。

次の図は、Vitis アナライザーで graph.aiecompile_summary レポートを開き、Array の図を表示したところです。図と表で AI エンジン カーネルが 1 つ選択されており、そのカーネルのソース コードが Source Code ビューに表示されています。

1: Vitis アナライザーのグラフ サマリ