x86 での PS 用エンベデッド アプリケーションのコンパイル - 2023.2 日本語

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

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

PS on x86 を使用したエンベデッド プロセッサ エミュレーション で説明されるように、エンベデッド アプリケーションを x86 プロセッサで実行できるようにコンパイルするには、x86 バージョンの gcc または g++ コンパイラのバージョン 8.3 以降を使用する必要があります。

ヒント: x86 コンパイルは、ソフトウェア エミュレーション フローでのみサポートされており、ザイリンクス ランタイムおよびプラットフォームのインストール で説明されるように、XRT の x86 インストールが必要です。これにより、LD_LIBRARY_PATH 変数が XRT ライブラリを指定するように設定されます。

必要な XRT API に対してコンパイルおよびリンクし、実行ファイルを生成

g++ -Wall -c -std=c++17 -Wno-int-to-pointer-cast -I${XILINX_XRT}/include \
-I./src/aie -I./ -I${XILINX_VITIS}/aietools/include \
-o aie_control_xrt.o ./Work/ps/c_rts/aie_control_xrt.cpp $(HOST_SRCS) -o main.o
g++ *.o -lxrt_coreutil -ladf_api_xrt -L${XILINX_VITIS}/aietools/lib/lnx64.o \
-L${XILINX_XRT}/lib -o $(EXECUTABLE)
注記: ps_on_x86 コンパイルの場合は、Vitis インストールで GCC パスを設定する必要があります。
setenv PATH $XILINX_VITIS/aietools/tps/lnx64/gcc/bin:$PATH

同じセットアップ (ターミナル) でエンベデッド (ARM-GCC) フローと x86 コンパイル フローを切り替える場合、ARM-GCC ベース フローではアプリケーションのコンパイルとリンクに ARM-GCC および SYSROOT パスを明示的に指定する必要があります。このシナリオは、ホスト アプリケーションのクロス コンパイルによるエミュレーションを実行すると同時に、同じシェル (ターミナル) でホスト アプリケーションのネイティブ x86 コンパイルによるソフトウェア エミュレーションを実行する場合に適用されます。

注記: ネイティブ x86 コンパイルを実行した後、同じターミナルで ARM-GCC コンパイラを使用してホスト アプリケーションをコンパイルする場合、環境セットアップ スクリプト xilinx-versal-common-v2023.1/environment-setup-cortexa72-cortexa53-xilinx-linux を実行します。LD_LIBRARY_PATH 変数が設定されていると警告メッセージが表示されるため、この変数が設定されていないことを確認する必要があります。その後、LD_LIBRARY_PATH の設定を解除し、環境セットアップ スクリプトを再実行する必要があります。

AI エンジン カーネルに対して x86 で PS を実行する方法は、GitHub にある AIE 加算器の例を参照してください。

制限

x86 コンパイルを実行中、ホスト コードでは Arm 専用のデータ型やライブラリはサポートされません。

次に示すのは、ARM-GCC ベース コンパイラでのみサポートされる _fp16 (浮動小数点 16) データ型を使用したホスト コードの例です。x86 コンパイラが同じホス トコードをコンパイルするとエラーが発生します。この場合、PS の QEMU モデルを使用し、ARM-GCC ベース コンパイラで PS アプリケーションをコンパイルすることを推奨します。

#define LENGTH (1024)
#define HALF __fp16
int main(int argc, char* argv[])
{
unsigned fileBufSize;
std::string binaryFile = argv[1];
size_t vector_size_bytes = sizeof(HALF) * LENGTH;
//Source Memories
std::vector<HALF> source_a(LENGTH);
std::vector<HALF> source_b(LENGTH);
std::vector<HALF> result_sim (LENGTH);
std::vector<HALF> result_krnl(LENGTH);
/* Create the test data and golden data locally */
for(int i=0; i < LENGTH; i++){
source_a[i] = i;
source_b[i] = i*2;
result_sim[i] = source_a[i] + source_b[i];
} 
ヒント: Cortex-A72 プロセッサ用のエンベデッド アプリケーションのコンパイル で説明したように、ARM-GCC コンパイラを使用してソフトウェア エミュレーション フローでエンベデッド アプリケーションをコンパイルすることにより、PS の QEMU モデルをターゲットにすることもできます。