目次
デザインのビルド
デザインのビルド
デザインのビルド
このセクションでは、AI エンジンのインプリメンテーションを使用して GeMM デザインを構築および実行します。AI エンジン デザインをコンパイルしたら大きいシステム デザインに統合します (PL カーネルおよび PS ホスト アプリケーションを含む)。一般的なフローについては、AI エンジン資料の Vitis ツール フローを使用したアプリケーションの統合を参照してください。
このセクションの最後に、デザイン フローでは新しいディレクトリ (build/
) が生成されます。その下には、Mat A と Mat B の次元とビルドで選択されている x$(GEMM_INSTS)
インスタンスの数によりますが、(gemm_$(MAT_DIMS)/
(たとえば gemm_32x32x32/
) という名前のサブディレクトリがあります。各サブディレクトリには、hw_emu/
や hw/
サブフォルダーが含まれます。各サブフォルダーには、hw
または hw_emu
をそれぞれターゲットとする Work/
および libadf.a
、AI エンジン コンパイラからの出力、ホスト アプリ実行ファイル、およびビルドが含まれます。hw_emu/
サブフォルダーには、ハードウェア エミュレーション用のビルドが含まれます。hw/
サブフォルダーには、VCK190 ボードで実行するハードウェア用のビルドが含まれます。
make ステップ
make ステップ
次の make
ステップ (make kernels
や make graph
など) は、AIE/
フォルダーで実行する必要があります。make
ステップで指定できるオプションは、次のとおりです。
TARGET:
これは hw
または hw_emu
に設定し、それぞれハードウェアまたはハードウェア エミュレーション フローでデザインを構築できます。デフォルト オプションは hw_emu
です。
GEMM_INSTS:
これはデフォルトで 1
に設定され、変更はできません。
GEMM_SIZE
: 行列の次元です。たとえば、値が 32
であれば、行列 A (入力行列 1)、行列 B (入力行列 2)、および行列 C (出力行列) が 32
次元の正方行列であることを意味します。指定可能な値は、32
、64
、128
、256
、512
、1024
です。
ITER_CNT:
デザインの実行反復回数。デフォルトは 1
です。
EN_TRACE:
トレース プロファイリングをイネーブルにするフラグ。0
にするとディスエーブル、1
にするとイネーブルになります。デフォルトは 0
(ディスエーブル) です。
Makefile では、次のディレクトリ参照が使用されます。
## Relative gemm directory
RELATIVE_PROJECT_DIR := ./
## Absolute gemm directory = <user path>/Tutorials/AI_Engine/gemm
PROJECT_REPO := $(shell readlink -f $(RELATIVE_PROJECT_DIR))
DESIGN_REPO := $(PROJECT_REPO)/design
AIE_SRC_REPO := $(DESIGN_REPO)/aie_src
PL_SRC_REPO := $(DESIGN_REPO)/pl_src
HOST_APP_SRC_REPO := $(DESIGN_REPO)/host_app_src
SYSTEM_CONFIGS_REPO := $(DESIGN_REPO)/system_configs
PROFILING_CONFIGS_REPO := $(DESIGN_REPO)/profiling_configs
EXEC_SCRIPTS_REPO := $(DESIGN_REPO)/exec_scripts
VIVADO_METRICS_SCRIPTS_REPO := $(DESIGN_REPO)/vivado_metrics_scripts
DIRECTIVES_REPO := $(DESIGN_REPO)/directives
BASE_BLD_DIR := $(PROJECT_REPO)/build
GEMM_BLD_DIR := $(BASE_BLD_DIR)/gemm_$(MAT_DIMS)
INSTS_BLD_DIR := $(GEMM_BLD_DIR)/x$(GEMM_INSTS)
BUILD_TARGET_DIR := $(INSTS_BLD_DIR)/$(TARGET)
REPORTS_REPO := $(PROJECT_REPO)/reports_dir
BLD_REPORTS_DIR := $(REPORTS_REPO)/gemm_$(MAT_DIMS)/x$(GEMM_INSTS)
XPE_REPO := $(PROJECT_REPO)/xpe_dir
BLD_XPE_DIR := $(XPE_REPO)/gemm_$(MAT_DIMS)/x$(GEMM_INSTS)/$(TARGET)
VCD_FILE_NAME := gemm_$(MAT_DIMS)_x$(GEMM_INSTS)
BLD_TGT_VCD_FILE := $(BUILD_TARGET_DIR)/$(VCD_FILE_NAME).vcd
XPE_FILE := $(BLD_XPE_DIR)/graph_$(VCD_FILE_NAME).xpe
EMBEDDED_PACKAGE_OUT := $(BUILD_TARGET_DIR)/package
EMBEDDED_EXEC_SCRIPT := run_script.sh
WORK_DIR := Work
AIE_SIM_IO_BASE_DIR := $(AIE_SRC_REPO)/aiesim_data
AIE_SIM_IO_DIR := $(AIE_SIM_IO_BASE_DIR)/gemm_$(MAT_DIMS)_ioFiles
1 つのコマンドを使用したデザイン全体のビルド
1 つのコマンドを使用したデザイン全体のビルド
AI エンジンおよび Vitis カーネル コンパイル フローを理解している場合は、1 つのコマンドで各 gemm_$(MAT_DIMS)
に対するデザイン全体を構築できます。
make run (default target is hardware emulation, 1 instance, gemm_$(MAT_DIMS) matrix dimensions, iterations=1 and no trace-profiling )
または
make run TARGET=hw ITER_CNT=16 EN_TRACE=1 GEMM_SIZE=64 (hardware, 16 iterations, , matrix dimentions 64 for Mat A, B and C and enable trace profiling )
このコマンドは、指定した TARGET
に基づいてハードウェア エミュレーション用またはハードウェア (VCK190 ボード) での実行用に、make kernels
、make graph
、make xsa
、make application
、make package
、および make run_emu
を実行します。設定は、下にリストする個々の make ステップにも適用されます。
各 gemm_$(MAT_DIMS)
に対して生成されたファイルは、個々のディレクトリ $(BUILD_TARGET_DIR)/
の下に配置されます。デザインを構築する各 make
ステップについては、以降のセクションで説明します。また、使用するオプションと、入力および出力ファイルのディレクトリについても説明します。
make kernels: PL カーネルのコンパイル
make kernels: PL カーネルのコンパイル
このステップでは、Vitis コンパイラはターゲット プラットフォーム (xilinx_vck190_base_202410_1
) の PL 領域の Vitis コンパイラ カーネル (RTL または HLS C) と、AI エンジン カーネルおよびグラフを取得して、対応する XO ファイルにコンパイルします。次のコマンドは、カーネルをコンパイルします (デフォルト TARGET=hw_emu
、GEMM_INSTS=1
、GEMM_SIZE=32
、ITER_CNT=1
、および EN_TRACE=0
)。
make kernels
コマンドと使用するオプションは次のとおりです (dma_hls
の場合)。
$(BUILD_TARGET_DIR)/$(DATAMOVER_KERNEL_XO).xo:
mkdir -p $(BUILD_TARGET_DIR); \
cd $(BUILD_TARGET_DIR); \
v++ --target $(TARGET) $(DATAMOVER_KERNEL_VPP_FLAGS) \
$(VPP_FLAGS) -c -k $(DATAMOVER_KERNEL_TOP) \
$(DATAMOVER_KERNEL_SRC) -o $@
すべての Vitis コンパイラ オプションの詳細は、こちらのページを参照してください。次の表に、使用するオプションをまとめます。
オプション | 説明 |
---|---|
--target | -t [hw|hw_emu] | ビルド ターゲットを指定します。 |
--platform | -f | サポートされるアクセラレーション プラットフォームの名前を $PLATFORM_REPO_PATHS 環境変数で指定されているように指定するか、XPFM プラットフォーム ファイルへの完全パスを指定します。 |
--save-temps | -s | Vitis コンパイラ コマンドでコンパイルおよびリンク プロセス中に作成された中間ファイル/ディレクトリを保存します。--temp_dir オプションを使用すると、中間ファイルを保存するディレクトリを指定できます。 |
--temp_dir |
ビルド プロセス中に作成された一時ファイルを保存するディレクトリを指定します。--save-temps オプションを指定しておかない場合、一時的な結果は Vitis コンパイラで書き出された後削除されます。 |
--verbose | 詳細/デバッグ情報を表示します。 |
--compile | -c | コンパイルしてカーネル ソース ファイルから XO ファイルを生成するのに必要です。 |
--kernel \<arg>|-k \<arg> | 入力ファイルから指定したカーネルのみをコンパイルします。Vitis コンパイラ コマンドごとに使用できる -k オプションは 1 つだけです。 |
--output | -o | V++ コマンドで生成された出力ファイルの名前を指定します。DMA HLS カーネル出力は XO にする必要があります。 |
入力 | 説明 |
---|---|
$(PL_SRC_REPO)/dma_hls.cpp | データ ムーバー PL カーネルを定義します。 |
出力 | 説明 |
---|---|
$(BUILD_TARGET_DIR)/dma_hls.hw_emu.xo | データ ムーバー カーネル オブジェクト ファイル。 |
make graph: Vitis コンパイラ フローの AI エンジン ADF グラフの作成
make graph: Vitis コンパイラ フローのための AI エンジン ADF グラフを作成します。
ADF グラフは、エクステンシブル Vitis プラットフォームに接続できます (グラフ I/O は、Vitis コンパイラ接続指示子を使用して、プラットフォーム ポートまたは Vitis カーネルのポートのいずれかに接続可能)。
デザインの AI エンジン ADF C++ グラフには、AI エンジン カーネルおよび PL カーネルが含まれます。
カーネル間のインターコネクトはすべて C++ グラフで定義されます。
外部 I/O へのすべての相互接続は、C++ ADF グラフ オブジェクトをインスタンス化する C++ シミュレーション テストベンチ (
graph.cpp
) で完全に指定されます。
Makefile フロー タイプ (デフォルト TARGET=hw_emu
、GEMM_INSTS=1
、GEMM_SIZE=32
、ITER_CNT=1
、EN_TRACE=0
) を使用してグラフをコンパイルします。
make graph
次の AI エンジン コンパイラ コマンドは、次のオプションを指定して、AI エンジン デザイン グラフをコンパイルします。
...
AIE_FLAGS := -include=$(AIE_SRC_REPO)
AIE_FLAGS += -include=$(DSPLIB_ROOT)/L1/include/aie
AIE_FLAGS += -include=$(DSPLIB_ROOT)/L1/src/aie
AIE_FLAGS += -include=$(DSPLIB_ROOT)/L1/tests/aie/inc
AIE_FLAGS += -include=$(DSPLIB_ROOT)/L1/tests/aie/src
AIE_FLAGS += -include=$(DSPLIB_ROOT)/L2/include/aie
AIE_FLAGS += -include=$(DSPLIB_ROOT)/L2/tests/aie/common/inc
AIE_FLAGS += --verbose
AIE_FLAGS += --Xpreproc="-DITER_CNT=$(ITER_CNT)"
AIE_FLAGS += --Xpreproc="-DGRAPH_ITER_CNT=$(GRAPH_ITER_CNT)"
AIE_FLAGS += --Xpreproc="-DGEMM_SIZE=$(GEMM_SIZE)"
AIE_FLAGS += --Xpreproc="-DGEMM_INSTS=$(GEMM_INSTS)"
AIE_FLAGS += --platform=$(PLATFORM)
#AIE_FLAGS += --target=$(TARGET)
AIE_FLAGS += --log-level=5
#AIE_FLAGS += --test-iterations=2
AIE_FLAGS += --pl-freq=$(PL_FREQ)
#AIE_FLAGS += --dataflow
#AIE_FLAGS += --constraints=$(AIE_SRC_REPO)/constraints.aiecst
AIE_FLAGS += --Xmapper=BufferOptLevel9
AIE_FLAGS += --Xrouter=DMAFIFOsInFreeBankOnly
AIE_FLAGS += --workdir=$(WORK_DIR)
AIE_SIM_FLAGS := --pkg-dir $(WORK_DIR)/
AIE_SIM_FLAGS += -i=$(AIE_SIM_IO_DIR)
...
graph: $(LIBADF_A)
$(LIBADF_A): $(AIE_SRC_REPO)/graph.*
mkdir -p $(BUILD_TARGET_DIR); \
cd $(BUILD_TARGET_DIR); \
aiecompiler $(AIE_FLAGS) $(GRAPH_SRC_CPP) 2>&1 | tee -a aiecompiler.log
AI エンジン プログラム環境の資料は、こちらのページを参照してください。
次の表に、使用するオプションをまとめます。
オプション | 説明 |
---|---|
--include=\<string> | コンパイル時のインクルード ディレクトリを指定します (ゼロ以上)。 |
--verbose|-v | AI エンジン コンパイラの出力を詳細出力に設定し、コンパイルのさまざまな段階でコンパイラ メッセージを出力します。これらのデバッグおよびトレース ログは、コンパイル プロセスに関して有用なメッセージを提供します。 |
--Xpreproc="-D\<Pre-processor Macro String>" | コンパイル時のマクロを指定します。 |
--Xchess="\<Chess Make Options>" | コンパイル時の Chess make オプションを指定します ("main:bridge.llibs=softfloat m" にすると浮動小数点演算がイネーブルになる)。 |
--heapsize=\<int> | ヒープ サイズ (バイト数)。 |
--log-level=\<int> | 詳細ログのレベル (デフォルトは 1)。 |
--workdir=\<string> | デフォルトでは、コンパイラのすべての出力が現在のディレクトリの Work サブディレクトリに生成されます。異なる出力ディレクトリを指定する場合に、このオプションを使用します。 |
次は、AI エンジン コンパイラ (aiecompiler
) コマンドを実行した結果の出力オブジェクトの説明です。
入力ソース | 説明 |
---|---|
$(AIE_SRC_REPO)/graph.cpp | GeMM グラフ オブジェクトを定義します。 |
出力オブジェクト | 説明 |
---|---|
$(BUILD_TARGET_DIR)/libadf.a | コンパイル済みの AI エンジンのデザイン グラフ。 |
$(BUILD_TARGET_DIR)/Work/ | AI エンジンのコンパイラの出力すべてを保存するディレクトリです。 |
make xsa: Vitis ツールを使用した AI エンジンおよび HLS カーネルとプラットフォームとのリンク
make xsa: Vitis ツールを使用した AI エンジンおよび HLS カーネルとプラットフォームとのリンク
AI エンジン カーネルおよびグラフと、PL HLS カーネルがコンパイルされたら、Vitis コンパイラを使用してプラットフォームとリンクし、XSA ファイルを生成できます。
Vitis ツールを使用すると、AI エンジン、HLS、および RTL カーネルを既存のエクステンシブル プラットフォームに統合できます。これは、ソフトウェア開発者の観点からすると自動化されたステップで、選択したプラットフォームはハードウェア設計者から提供されます。または、AMD が提供している多数のエクステンシブル ベース プラットフォームの中から 1 つを使用することを選択し、Vitis ツールを使用してハードウェア デザインを構築し、AI エンジンおよび PL カーネルをそれに統合することもできます。
この機能をこのチュートリアルでテストするには、ベース VCK190 プラットフォームを使用してデザインを構築します。このステップを実行するコマンドを、次の例に示します (デフォルト TARGET=hw_emu
、GEMM_INSTS=1
、GEMM_SIZE=32
、ITER_CNT=1
、EN_TRACE=0
)。
make xsa
オプションを指定したコマンドは次のとおりです。
...
VPP_FLAGS := --platform $(PLATFORM)
VPP_FLAGS += --save-temps
VPP_FLAGS += --temp_dir $(BUILD_TARGET_DIR)/_x
VPP_FLAGS += --verbose
VPP_FLAGS += -g
...
VPP_LINK_FLAGS += --clock.freqHz $(VPP_CLOCK_FREQ):$(DATAMOVER_KERNEL_TOP)_0
VPP_LINK_FLAGS += --clock.defaultTolerance 0.001
### If Profiling for Performance Measurement is enabled..
ifeq ($(EN_TRACE),1)
ifeq ($(TARGET),hw)
VPP_LINK_FLAGS += --profile.data $(DATAMOVER_KERNEL_TOP):all:strmInp_from_C0
VPP_LINK_FLAGS += --profile.trace_memory DDR
endif
endif
VPP_LINK_FLAGS += --config $(SYSTEM_CONFIGS_REPO)/x$(GEMM_INSTS).cfg
VPP_LINK_FLAGS += --vivado.prop fileset.sim_1.xsim.simulate.log_all_signals=true
VPP_LINK_FLAGS += --vivado.prop run.impl_1.STEPS.PLACE_DESIGN.TCL.PRE=$(DIRECTIVES_REPO)/prohibit_select_bli_bels_for_hold.tcl
VPP_LINK_FLAGS += --vivado.prop run.synth_1.STEPS.SYNTH_DESIGN.ARGS.CONTROL_SET_OPT_THRESHOLD=16
VPP_LINK_FLAGS += --vivado.prop run.impl_1.{strategy}={Performance_ExplorePostRoutePhysOpt}
...
xsa: kernels graph $(BUILD_TARGET_DIR)/$(XSA)
$(BUILD_TARGET_DIR)/$(XSA):$(KERNEL_XOS) $(SYSTEM_CONFIGS_REPO)/*
cd $(BUILD_TARGET_DIR); \
v++ -l $(VPP_FLAGS) $(VPP_LINK_FLAGS) -t $(TARGET) -o $@ $(KERNEL_XOS) $(LIBADF_A)
Vitis リンク オプションの詳細は、こちらのページを参照してください。
オプション | 説明 |
---|---|
--platform | -f | サポートされるアクセラレーション プラットフォームの名前を $PLATFORM_REPO_PATHS 環境変数で指定されているように指定するか、XPFM プラットフォーム ファイルへの完全パスを指定します。 |
--save-temps | -s | V++ コマンドでコンパイルおよびリンク プロセス中に作成された中間ファイル/ディレクトリを保存します。--temp_dir オプションを使用すると、中間ファイルを保存するディレクトリを指定できます。 |
--temp_dir |
ビルド プロセス中に作成された一時ファイルを保存するディレクトリを指定します。--save-temps オプションを指定しておかない場合、一時的な結果は Vitis コンパイラで書き出された後削除されます。 |
--verbose | 詳細/デバッグ情報を表示します。 |
--config |
V++ オプションを含むコンフィギュレーション ファイルを指定します。 |
--output | -o | V++ コマンドで生成された出力ファイルの名前を指定します。このデザインでは、XO ファイルに、AI エンジンとインターフェイスする DMA HLS カーネルおよび PL カーネルの出力が含まれます。 |
--profile.data [ |
モニター IP を介してデータ ポートを監視します。このオプションは、リンク時には指定する必要があります。プロファイリング オプションの詳細は、こちらのページを参照してください。 |
--profile.trace_memory \<FIFO>:\<size>|\<MEMORY>[\<n>] | ハードウェア ターゲット (-t=hw) を構築する際に、トレース データを取り込むのに使用するメモリのタイプおよび量を指定できます。プロファイリング オプションの詳細は、こちらのページを参照してください。 |
AI エンジンおよび PL カーネルを一緒に接続する方法をリンカーに指示するための情報は、コンフィギュレーション ファイル system_configs/x$(GEMM_INSTS).cfg
に記述されます。これは、システムの接続方法全体が記述されたファイルです。
[connectivity]
nk=dma_hls:1:dma_hls_0
#Connections For GEMM Insts 0...
stream_connect=dma_hls_0.strmOut_to_A0:ai_engine_0.DataInA0_CASC0:512
stream_connect=dma_hls_0.strmOut_to_A1:ai_engine_0.DataInA0_CASC1:512
stream_connect=dma_hls_0.strmOut_to_A2:ai_engine_0.DataInA0_CASC2:512
stream_connect=dma_hls_0.strmOut_to_A3:ai_engine_0.DataInA0_CASC3:512
stream_connect=dma_hls_0.strmOut_to_A4:ai_engine_0.DataInA0_CASC4:512
stream_connect=dma_hls_0.strmOut_to_A5:ai_engine_0.DataInA0_CASC5:512
stream_connect=dma_hls_0.strmOut_to_A6:ai_engine_0.DataInA0_CASC6:512
stream_connect=dma_hls_0.strmOut_to_A7:ai_engine_0.DataInA0_CASC7:512
stream_connect=dma_hls_0.strmOut_to_B0:ai_engine_0.DataInB0_CASC0:512
stream_connect=dma_hls_0.strmOut_to_B1:ai_engine_0.DataInB0_CASC1:512
stream_connect=dma_hls_0.strmOut_to_B2:ai_engine_0.DataInB0_CASC2:512
stream_connect=dma_hls_0.strmOut_to_B3:ai_engine_0.DataInB0_CASC3:512
stream_connect=dma_hls_0.strmOut_to_B4:ai_engine_0.DataInB0_CASC4:512
stream_connect=dma_hls_0.strmOut_to_B5:ai_engine_0.DataInB0_CASC5:512
stream_connect=dma_hls_0.strmOut_to_B6:ai_engine_0.DataInB0_CASC6:512
stream_connect=dma_hls_0.strmOut_to_B7:ai_engine_0.DataInB0_CASC7:512
stream_connect=dma_hls_0.strmOut_to_B8:ai_engine_0.DataInB1_CASC0:512
stream_connect=dma_hls_0.strmOut_to_B9:ai_engine_0.DataInB1_CASC1:512
stream_connect=dma_hls_0.strmOut_to_B10:ai_engine_0.DataInB1_CASC2:512
stream_connect=dma_hls_0.strmOut_to_B11:ai_engine_0.DataInB1_CASC3:512
stream_connect=dma_hls_0.strmOut_to_B12:ai_engine_0.DataInB1_CASC4:512
stream_connect=dma_hls_0.strmOut_to_B13:ai_engine_0.DataInB1_CASC5:512
stream_connect=dma_hls_0.strmOut_to_B14:ai_engine_0.DataInB1_CASC6:512
stream_connect=dma_hls_0.strmOut_to_B15:ai_engine_0.DataInB1_CASC7:512
stream_connect=dma_hls_0.strmOut_to_B16:ai_engine_0.DataInB2_CASC0:512
stream_connect=dma_hls_0.strmOut_to_B17:ai_engine_0.DataInB2_CASC1:512
stream_connect=dma_hls_0.strmOut_to_B18:ai_engine_0.DataInB2_CASC2:512
stream_connect=dma_hls_0.strmOut_to_B19:ai_engine_0.DataInB2_CASC3:512
stream_connect=dma_hls_0.strmOut_to_B20:ai_engine_0.DataInB2_CASC4:512
stream_connect=dma_hls_0.strmOut_to_B21:ai_engine_0.DataInB2_CASC5:512
stream_connect=dma_hls_0.strmOut_to_B22:ai_engine_0.DataInB2_CASC6:512
stream_connect=dma_hls_0.strmOut_to_B23:ai_engine_0.DataInB2_CASC7:512
stream_connect=ai_engine_0.DataOutC0:dma_hls_0.strmInp_from_C0
stream_connect=ai_engine_0.DataOutC1:dma_hls_0.strmInp_from_C1
stream_connect=ai_engine_0.DataOutC2:dma_hls_0.strmInp_from_C2
[advanced]
# Disable Profiling in hw_emu so that it is faster...
param=hw_emu.enableProfiling=false
Vitis コンパイラ コンフィギュレーション ファイルの詳細は、こちらのページを参照してください。
オプション | 備考 |
---|---|
--connectivity.nk | カーネル数。dma_hls:1:dma_hls_0 の場合、Vitis コンパイラは 1 つの dma_hls カーネルをインスタンシエートして、インスタンス名を dma_hls_0 に設定する必要があることを意味します。 |
--connectivity.stream_connect | カーネルが IP、プラットフォーム、またはその他のカーネルに接続する方法。AI エンジン コンパイラの出力により、接続する必要のあるインターフェイスが示されます。dma_hls_0.strmOut_to_A0:ai_engine_0.DataIn0 の場合、PLIO インスタンシエーションの一部として $(AIE_SRC_REPO)/graph.cpp に定義されているように、Vitis コンパイラは dma_hls PL カーネルのポート strmOut_to_A0 を、論理名が DataIn0 という AI エンジンのシム チャネルに接続する必要があることを意味します。 |
param=compiler.addOutputTypes=hw_export | このオプションは Vitis コンパイラに、XCLBIN ファイルの作成だけでなく、Vitis ソフトウェア開発用のポスト Vivado 固定プラットフォームを作成するのに必要な XSA ファイルを出力するよう指示します。 |
Vitis コンパイラは、内部で Vivado™ IP インテグレーターを呼び出してデザインを構築します。プラットフォームおよびカーネルは、Vivado Design Suite への入力で、デザインの配置配線を実行した後にシミュレーション XSA または XSA を生成します。Vivado から XSA が生成される時点は、Vitis コンパイラ コマンド ラインで設定した -target
オプションによって異なります。
これで、$(BUILD_TARGET_DIR)/_x/link/vivado/vpl/prj
ディレクトリにある Vivado プロジェクトを表示できます。プラットフォームでデザインを実行するのに使用される XCLBIN ファイルが生成されました。
make application: ホスト アプリケーションのコンパイル
make application: ホスト アプリケーションのコンパイル
Cortex A72 用の次の一般的なクロス コンパイル フローに従って、ホスト アプリケーションをコンパイルできます。アプリケーションを構築するため、次のコマンドを実行します (デフォルトは TARGET=hw_emu
、GEMM_INSTS=1
、GEMM_SIZE=32
、ITER_CNT=1
、EN_TRACE=0
)。
make application
または
application: graph $(BUILD_TARGET_DIR)/$(APP_ELF)
REG_GCC_FLAGS := $(GCC_FLAGS)
REG_GCC_FLAGS += -DITER_CNT=$(ITER_CNT)
REG_GCC_FLAGS += -DGRAPH_ITER_CNT=$(GRAPH_ITER_CNT)
$(BUILD_TARGET_DIR)/$(APP_ELF): $(HOST_APP_SRC)/* $(LIBADF_A)
@rm -rf $(BUILD_TARGET_DIR)/app_control.o $(BUILD_TARGET_DIR)/gemm_aie_app.o $(BUILD_TARGET_DIR)/$(APP_ELF)
$(CXX) $(REG_GCC_FLAGS) $(GCC_INC_FLAGS) $(AIE_CONTROL_CPP) -o $(BUILD_TARGET_DIR)/app_control.o
$(CXX) $(REG_GCC_FLAGS) $(GCC_INC_FLAGS) $(APP_SRC_CPP) -o $(BUILD_TARGET_DIR)/gemm_aie_app.o $(GCC_INC_LIB) $(GCC_LIB)
$(CXX) $(BUILD_TARGET_DIR)/app_control.o $(BUILD_TARGET_DIR)/gemm_aie_app.o $(GCC_INC_LIB) $(GCC_LIB) -o $(BUILD_TARGET_DIR)/$(APP_ELF)
XRT の資料は、こちらのページを参照してください。ホスト アプリケーション プログラミングの詳細は、こちらのページを参照してください。
オプション | 説明 |
---|---|
-O | Optimize. | コンパイルを最適化するには時間がかかり、大型ファンクションではメモリも多く必要です。-O を使用すると、コンパイラは、かなりのコンパイル時間がかかる可能性のある最適化を実行せずに、コード サイズおよび実行時間の削減を試みます。 |
-D__linux__ | |
-DXAIE_DEBUG | 特定のコア ステータス、イベント ステータス、またはスタック トレースを出力できるデバッグ インターフェイス機能をイネーブルにします。 |
-D\<Pre-processor Macro String>=\<value> | クロス コンパイラにプリプロセッサ マクロ定義を渡します。 |
-I \<dir> | ヘッダー ファイルを検索するディレクトリのリストにディレクトリ dir を追加します。 |
-o \<file> | ファイル <file> に出力を配置します。これは、生成される出力が実行ファイル、オブジェクト ファイル、アセンブラー ファイル、または前処理された C コードであるかどうかにかかわらず適用されます。 |
--sysroot=\<dir> | ヘッダーおよびライブラリの論理ルート ディレクトリとして dir を使用します。たとえば、コンパイラが /usr/include でヘッダー、/usr/lib でライブラリを通常は検索する場合、代わりに dir/usr/include および dir/usr/lib で検索します。これは、env_setup.sh スクリプトにより自動的に設定されます。 |
-l\<library> | リンク中に library というライブラリを検索します。GeMM チュートリアルには、adf_api_xrt と xrt_coreutil ライブラリが必要です。 |
-L \<dir> | -l を検索するディレクトリのリストにディレクトリ <dir> を追加します。 |
次は、AI エンジン コンパイラ コマンドでコンパイルされる入力ソースの説明です。
入力ソース | 説明 |
---|---|
$(HOST_APP_SRC_REPO)/gemm_aie_app.cpp | A72 プロセッサで実行する gemm_aie_xrt.elf のソース アプリケーション ファイル。 |
$(BUILD_TARGET_DIR)/Work/ps/c_rts/aie_control_xrt.cpp | GeMM グラフ用のグラフ API をインプリメントして生成された AI エンジン制御コード。 |
次は、上記の入力およびオプションを使用して AI エンジン コンパイラ コマンドを実行した結果の出力オブジェクトの説明です。
出力オブジェクト | 説明 |
---|---|
$(BUILD_TARGET_DIR)/gemm_aie_xrt.elf | A72 プロセッサで実行する実行ファイル。 |
make package: デザインのパッケージ
make package: デザインのパッケージ
AI エンジン出力および新しいプラットフォームが作成されたら、プログラマブル デバイス イメージ (PDI) と、SD カードで使用されるパッケージを生成できます。PDI には、デバイスの実行ファイル、ビットストリーム、およびコンフィギュレーションがすべて含まれます。パッケージされた SD カード ディレクトリには、Linux のブートに必要なすべてのもの、生成されたアプリケーション、および XCLBIN が含まれます。
このステップを実行するコマンドは次のようになります (デフォルトは、TARGET=hw_emu
、GEMM_INSTS=1
、GEMM_SIZE=32
、ITER_CNT=1
、EN_TRACE=0
)。
make package
または
...
PKG_FLAGS := -t $(TARGET)
PKG_FLAGS += --save-temps
PKG_FLAGS += --temp_dir $(BUILD_TARGET_DIR)/_x
PKG_FLAGS += -f $(PLATFORM)
PKG_FLAGS += --package.rootfs $(COMMON_IMAGE_VERSAL)/rootfs.ext4
PKG_FLAGS += --package.kernel_image $(COMMON_IMAGE_VERSAL)/Image
PKG_FLAGS += --package.boot_mode=sd
PKG_FLAGS += --package.out_dir $(EMBEDDED_PACKAGE_OUT)
PKG_FLAGS += --package.image_format=ext4
PKG_FLAGS += --package.sd_file $(BUILD_TARGET_DIR)/$(APP_ELF) $(BUILD_TARGET_DIR)/$(XSA) $(LIBADF_A)
PKG_FLAGS += --package.sd_file $(BUILD_TARGET_DIR)/$(APP_ELF_INF_RUN)
PKG_FLAGS += --package.sd_file $(EXEC_SCRIPTS_REPO)/$(EMBEDDED_EXEC_SCRIPT)
## If Profiling for Performance Measurement is enabled..
ifeq ($(EN_TRACE),1)
ifeq ($(TARGET),hw)
PKG_FLAGS += --package.sd_file $(PROFILING_CONFIGS_REPO)/xrt.ini
endif
endif
## If XRT_ROOT is set...
ifdef XRT_ROOT
PKG_FLAGS += --package.sd_dir $(XRT_ROOT)
endif
PKG_FLAGS += --package.defer_aie_run
...
package: application application_inf_run xsa $(EMBEDDED_PACKAGE_OUT)
$(EMBEDDED_PACKAGE_OUT): $(PROFILING_CONFIGS_REPO)/* $(EXEC_SCRIPTS_REPO)/* $(BUILD_TARGET_DIR)/$(APP_ELF) $(BUILD_TARGET_DIR)/$(XSA) $(BUILD_TARGET_DIR)/$(APP_ELF_INF_RUN)
rm -rf $(EMBEDDED_PACKAGE_OUT)
cd $(BUILD_TARGET_DIR); \
v++ -p $(PKG_FLAGS)
システムのパッケージの詳細は、こちらのページを参照してください。
オプション | 説明 |
---|---|
--target | -t [hw|hw_emu] | ビルド ターゲットを指定します。 |
--package | -p | Vitis コンパイルおよびリンク ビルド プロセスの終わりで最終的な出力をパッケージします。 |
--package.rootfs \<arg> | \<arg>: 処理された Linux ルート ファイル システム ファイルへの絶対パスまたは相対パスを指定します。プラットフォーム RootFS ファイルは、xilinx.com からダウンロードできます。詳細は、Vitis ソフトウェア プラットフォームのインストールを参照してください。 |
--package.kernel_image \<arg> | \<arg>: Linux カーネル イメージ ファイルへの絶対パスまたは相対パスを指定します。プラットフォームで使用可能な既存のイメージを上書きします。プラットフォーム イメージ ファイルは、xilinx.com からダウンロードできます。詳細は、Vitis ソフトウェア プラットフォームのインストールを参照してください。 |
--package.boot_mode \<arg> | \<arg>: |
--package.image_format | \<arg>: \<ext4|fat32> で出力イメージ ファイル形式を指定します。ext4 は Linux ファイル システム、fat32 は Windows ファイル システムです。 |
--package.sd_file | \<arg>: sd_card ディレクトリ/イメージにパッケージする ELF またはその他のデータ ファイルを指定します。このオプションを繰り返し使用すると、複数のファイルを sd_card ディレクトリに追加できます。 |
--package.defer_aie_run | AI エンジン アプリケーションに ELF ファイルを読み込みますが、graph.run で命令されるまで実行を開始しないようにします。これは PS ベースの AI エンジン フローで必要です。 |
入力ソース | 説明 |
---|---|
$(PLATFORM_REPO_PATHS)/sw/versal/xrt | PS ホスト アプリケーションを実行するには、このフォルダーに XRT ヘッダーが必要です。 |
$(PLATFORM_REPO_PATHS)/sw/versal/xilinx-versal/rootfs.ext4 | PetaLinux のルート ファイル システム ファイル。 |
$(PLATFORM_REPO_PATHS)/sw/versal/xilinx-versal/Image | プロセッサがブートされる構築済みの PetaLinux イメージ。 |
$(BUILD_TARGET_DIR)/gemm_aie_xrt.elf | make application ステップで作成された PS ホスト アプリケーション実行ファイル。 |
$(BUILD_TARGET_DIR)/vck190_aie_gemm.hw_emu.xsa | make xsa ステップで作成された XCLBIN ファイル。 |
$(BUILD_TARGET_DIR)/libadf.a | make graph ステップで作成された、コンパイルされた AI エンジン デザイン グラフ。 |
Vitis コンパイラ パッケージ ステップの出力は、ハードウェア エミュレーションを実行するためのコンテンツを含むパッケージ ディレクトリです。
出力オブジェクト | 説明 |
---|---|
$(BUILD_TARGET_DIR)/package | ブート ファイル、ハードウェア エミュレーション起動スクリプト、PLM および PMC ブート ファイル、PMC および QEMU コマンド引数仕様ファイル、Vivado シミュレーション フォルダーを含むハードウェア エミュレーション パッケージ。 |
make run_emu: ハードウェア エミュレーションの実行
make run_emu: ハードウェア エミュレーションの実行
パッケージ後、ハードウェア エミュレーションの実行に必要なものがすべて設定されます。エミュレーションを実行するには、次のコマンドを実行します (デフォルト TARGET=hw_emu
)。
make run_emu
または
###########################################################################
Hardware Emulation Goto:
$(BUILD_TARGET_DIR)/package
and do:
./launch_hw_emu.sh or ./launch_hw_emu.sh -g (for waveform viewer) or ./launch_hw_emu.sh -run-app $(EMBEDDED_EXEC_SCRIPT) (to check results without opening waveform viewer) ...
ハードウェア エミュレーションが起動すると、QEMU シミュレータ ロードが表示されます。自動ブート カウントダウンがゼロになるまで待ちます。数分後、root Linux プロンプトが表示されます。
root@versal-rootfs-common-2024_1:~#
root プロンプトが表示されたら、次のコマンドを入力してデザインを実行します。
mount /dev/mmcblk0p1 /mnt
cd /mnt
./gemm_aie_xrt.elf a.xclbin
gemm_aie_xrt.elf
が実行されます。数分後、TEST PASSED
という出力がコンソールに表示されるはずです。これが表示されたら、次のキーワード コマンドを入力して QEMU インスタンスを終了します。
#To exit QEMU Simulation
Press CtrlA, let go of the keyboard, and then press x
波形を使用して実行する手順は、次のとおりです。
cd $(BUILD_TARGET_DIR)/package
./launch_hw_emu.sh -g
XSIM 波形ビューアーが起動します。ビューアーに信号をドラッグ アンド ドロップし、[Play] をクリックしてエミュレーションを開始します。ターミナルに戻り、Linux プロンプトが表示されるまで待ちます。XSIM 波形ビューアーでは、波形に追加した信号が表示され、デザインの実行が調整されます。これが終わったら、[Pause] ボタンをクリックし、ウィンドウを閉じてエミュレーションを終了します。
次の図に、gemm_32x32x32 - 1x デザインの波形を示します。
TARGET=hw: ハードウェアでの実行
ハードウェアでの実行
ハードウェアでデザインを実行するには、次の make
ステップを、TARGET=hw
およびその他の該当オプション (上記に示した make
ステップを参照) を使用して再実行します。
make kernels xsa package TARGET=hw
これらのコマンドは、ハードウェアでの実行用にカーネル、XSA、および package
を含む $(BUILD_TARGET_DIR)
フォルダーを作成します。
次のステップを実行し、実行ファイル、生成されたイメージ、およびベース イメージ ($(BUILD_TARGET_DIR)/package/sd_card
および $(BUILD_TARGET_DIR)/package/sd_card.img
) を設定します。
make run_emu TARGET=hw
これらのコマンドは、ハードウェアでの実行用にカーネル、XSA、および package
を含む build/hw
フォルダーを作成します。手順 1 ~ 9 に従い、VCK190 ボードで gemm_aie_xrt.elf
実行ファイルを実行します。
手順 1: ボードの電源がオフになっていることを確認します。
手順 2: SD カード ライター (balenaEtcher など) を使用して sd_card.img
ファイルを SD カードのフラッシュ メモリに書き込みます。
手順 3: フラッシュ メモリに書き込んだ SD カードを VCK190 ボードの一番上のスロットに挿入します。
手順 4: スイッチを設定します (SW1 Mode\[3:0\]=1110 = OFF OFF OFF ON
)。
手順 5: ボードに同梱されている USB ケーブルを使用して、VCK190 ボードにコンピューターを接続します。
手順 6: TeraTerm ターミナルを開き、正しい COM ポートを選択します。ポート設定を次のように指定します。
Port: <COMMXX>
Speed: 115200
Data: 8 bit
Parity: none
Stop Bits: 1 bit
Flow control: none
Transmit delay: 0 msec/char 0 msec/line
手順 7: ボードに電源を投入します。
手順 8: root@versal-rootfs-common-2024.1
Linux コマンド プロンプトが表示されるまで待ちます。xinit
エラーが表示されなくなるまで Enter キーを数回押します。
手順 9: TeraTerm ターミナルで次のコマンド実行します。
cd /mnt/sd-mmcblk0p1
./gemm_aie_xrt.elf a.xclbin
ハードウェア デザインの詳細
GeMM AI エンジン インプリメンテーション アーキテクチャおよび AI エンジン/PL ファンクション分割
GeMM AI エンジン インプリメンテーション アーキテクチャおよび AI エンジン/PL ファンクション分割
次の図に、デザインの概略ブロック図を示します。テスト ハーネスは、AI エンジンおよびデータ ムーバー HLS カーネル (dma_hls
) で構成されます。この設定では、データ ムーバー カーネルと AI エンジン間に、データ幅 128 ビットの AXI4-Stream インターフェイスがあります。データ ムーバー カーネルおよび AI エンジン アレイ インターフェイスは 312.5 MHz で実行しています。
データ ムーバーは PL ベースのデータ ジェネレーターおよびチェッカーで、入力として定数行列を生成し、その出力に対して gemm コアの出力をチェックします。