PS on x86 を使用したエンベデッド プロセッサ エミュレーション - 2023.2 日本語

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 日本語

エンベデッド プロセッサ用の QEMU 環境でエミュレーションを実行すると、計算負荷が高くなり、追加の設定やコンフィギュレーションが必要になります。エンベデッド アプリケーションは、arm-gcc を使用してクロスコンパイルし、SD カード イメージを作成し、QEMU 環境下で Linux を起動してから、実行する必要があります。PS on x86 機能を使用すると、エンベデッド システム デザインを x86 プロセッサ上でより少ないエフォートでシミュレーションできます。この機能を使用するには、x86 バージョンの gcc または g++ コンパイラを使用して PS アプリケーションをコンパイルし、.xclbin ファイルを emconfigutil で作成したソフトウェア エミュレーション用のエミュレーション プラットフォームで動作するように構築する必要があります。

重要: PS on x86 コンパイルは、ソフトウェア エミュレーションにのみ有効で、GCC 8.3 以降が必要です。この機能を使用するには、ザイリンクス ランタイムおよびプラットフォームのインストール で説明するように、XRT をインストールする必要もあります。また、AI エンジン デザインでは、次のコンフィギュレーション ファイル例に示すように、--package.defer_aie_run オプションをイネーブルにする必要があります。

PS on x86 を使用したソフトウェア エミュレーションの構築と実行方法は、次のとおりです。

  1. PS アプリケーションは、Arm クロスコンパイラではなく、標準の gcc コンパイラを使用してコンパイルしてください。これについては、x86 用のコンパイルおよびリンク を参照してください。
  2. デバイス バイナリ (.xclbin) のコンパイルとリンクには、デバイス バイナリのビルド で説明されるように、標準的な v++ コマンドを使用します。
  3. PS on x86 フローの場合、v++ --package コマンドでエミュレーションに使用するプロセッサをツールに伝えます (--package.emu_ps)。

    AMD Versal™ プラットフォームの場合、v++ --link コマンドで生成された .xsa.xclbin ファイルに変換することも必要です。AMD Zynq™ UltraScale+™ MPSoC ベースのプラットフォームには、この手順は必要ありません。

  4. emconfigutil ユーティリティ を使用して、ソフトウェア エミュレーション用の emconfig.json ファイルを作成します。
    emconfigutil --platform xilinx_zcu102_base_202220_1
  5. ソフトウェア エミュレーション モードでは、XCL_EMULATION_MODE 環境変数を sw_emu に設定します。
    重要: XCL_EMULATION_MODE 環境変数が正しく設定されていないと、エミュレーション ターゲットが実行されません。
  6. アプリケーションを実行します。次に例を示します。
    ./host.exe kernel.xclbin

次は、emconfigutil および v++ --package コマンドの例を示しています。エミュレーションに必要な仮想プラットフォームを作成するには emconfigutil、エミュレーション用のシステムを作成するには v++ --package を使用します。

emconfigutil --platform $PLATFORM_REPO_PATHS/xilinx_vck190_base_202310_1/xilinx_vck190_base_202310_1.xpfm --nd 1

そして次の操作が続きます。

v++ -p -t sw_emu \
    --package.defer_aie_run \
    --platform $PLATFORM_REPO_PATHS/xilinx_vck190_base_202310_1/xilinx_vck190_base_202310_1.xpfm \
    --package.sd_dir $PLATFORM_REPO_PATHS/sw/versal/xrt \
    --package.out_dir ./package.sw_emu \
    --package.ps_on_x86 \
    --package.sd_file ./emconfig.json \
    ../tutorial.xsa ../libadf.a

次のコマンドを使用してソフトウェア エミュレーションを実行します。

setenv XCL_EMULATION_MODE sw_emu
./host_ps_on_x86 a.xclbin

次の表は、QEMU でソフトウェア エミュレーションを実行する場合と、PS on x86 を実行する場合の PS アプリケーションおよびデバイス バイナリ (.xclbin) のビルドの違いについて説明したものです。

表 1. PS on X86 の SW エミュレーションの実行
プロセス QEMU での SW_EMU の実行 PS on X86 を使用した SW_EMU
ホストのコンパイル

arm-gcc を使用したクロスコンパイルが必要で、SYSROOT の定義、エンベデッド インクルード ファイルとライブラリ ファイルが必要です。

aarch64-linux-gnu-g++ -o hello_world \
host.cpp -lxrt_coreutil -pthread \
--sysroot=<path-to-sysroot>​​ \
-I<path-to-sysroot>/usr/include/xrt \
-L<path-to-sysroot>/usr/lib

x86 gcc および XRT の x86 インストールが必要です。

g++ -o hello_world host.cpp \
-lxrt_coreutil -pthread \
-I$(XILINX_XRT)/include \
-L$(XILINX_XRT)/lib​​
パッケージ

QEMU で実行する SD カード イメージを作成し、エミュレーション プロセッサを QEMU に指定する必要があります。

v++ -p -t sw_emu $(LINK_XCLBIN) $(LIBADF) \
--platform $(PLATFORM_PATH) \
--package.out_dir ./package.sw_emu \
--package.emu_ps qemu \
--package.rootfs $(EDGE_COMMON_SW)/rootfs.ext4 \
--package.kernel_image $(EDGE_COMMON_SW)/Image \
--package.sd_file xrt.ini \
--package.sd_file ./run_app.sh \
-o vadd.xclbin --package.sd_file ./hello_world

PS on x86 シミュレーションの場合、エミュレーション用の PS を特定してから、.xclbin ファイルを生成するために、--package コマンドが必要です。

v++ -p $(LINK_OUTPUT) $(VPP_FLAGS)​ \
--package.emu_ps x86 \
--package.defer_aie_run \
--package.out_dir $(PACKAGE_OUT) \
-o $(BUILD_DIR)/kernel.xclbin​
シミュレーションの実行

QEMU の設定とシミュレーションの実行には、launch_emulation シェル スクリプトを使用する必要があります。

./launch_sw_emu.sh -run-app \
 $(RUN_APP_SCRIPT) | tee run_app.log;​​

エミュレーション モード環境変数を設定し、アプリケーションを直接起動します。

XCL_EMULATION_MODE=sw_emu 
./$(EXECUTABLE) $(CMD_ARGS)

同じ PS コードを arm-gcc を使って x86 gcc でコンパイルすることもできます。ただし、PS コード内でリンクされている Arm 専用のデータ型やライブラリは、x86 用にコンパイルすると動作しなくなります。この機能を使用するソフトウェア エミュレーションの実行例については、GitHub の ps_on_x86 を参照してください。

ヒント: PS on x86 用の AI エンジン アプリケーションをコンパイルして実行する場合は、 『AI エンジン ツールおよびフロー ユーザー ガイド』 (UG1076) も参照してください。