在x86处理器上跑嵌入式应用程序的Software Emulation

作者:Garce Sun,AMD Xilinx开发工程师,来源:AMD Xilinx开发者社区

在Vitis流程中,编译的目标分为软件仿真(software emultion),硬件仿真(hardware emulation)以及硬件(hardware)。

软件仿真是通过用户创建的自定义主机代码测试系统的第一步,主要目标是确保主机程序和内核的功能正确性。其中,内核代码始终在本机编译和运行。应用程序代码根据平台的不同,编译方式为:
• 在 x86 处理器上本地编译和运行(数据中心平台)
• 交叉编译到 Arm 处理器并在仿真器中运行(嵌入式平台)

软件仿真通常用于改进算法、调试功能问题,并让开发人员快速迭代代码以进行改进。软件仿真是一个抽象模型,不使用任何 petalinux 驱动程序,如 Zynq OpenCL (ZOCL)、中断控制器或设备树二进制文件 (DTB)。 对于嵌入式平台来说,软件仿真创建 sd_card.img、在完整 QEMU 机器上启动 petalinux 的开销太重。

为了避免这部分开销,提高软件仿真运行效率,我们可以使用 x86 GCC(而不是 ARM-GCC)编译相同的嵌入式应用程序,从而实现在x86处理器上跑嵌入式应用程序的软件仿真。对于这种方法,用户不需要提供诸如 sysroot、rootfs 和 sd_card Image 等字段,从而能启用更快的软件仿真。

总的来说,与QEMU做软件仿真相比,编译过程中涉及到以下改动:

1. 用户需要在host安装XRT,不需要Petalinux/SYSROOT
关于XRT的安装指导,请参考UG1393的相关章节内容:https://docs.xilinx.com/r/en-US/ug1393-vitis-application-acceleration/In...

2. 用x86的GCC编译器而不是ARM GCC来编译host代码。
在2023.1 Vitis版本中,x86编译需要GCC 8.3或更高版本。

3. v++ -package以及启动仿真的流程不尽相同。

下表描述了在 QEMU 下和在 x86 上运行软件仿真时,构建 PS 应用程序和.xclbin 的差异。

对于包含AIE的设计,基于上表的选项有所调整,请参考以下表格:

以上对比适用于Vitis 2023.1,不同版本的命令行选项可能会有改动。

比如,2022.1里的v++ package选项--package.ps_on_x86在新版本替换成了—package.emu_ps x86/qemu。

对于嵌入式应用程序运行 x86 编译也有局限性,主要表现为主机代码不支持 ARM-only 的数据类型或库。

以下是使用 _fp16数据类型的主机代码示例,该数据类型仅在基于 ARM-GCC 的编译器中受支持,x86 编译器在编译相同的主机代码时会出错。 在这种情况下,建议使用 PS 的 QEMU 模型,并使用基于 ARM-GCC 的编译器来编译 PS 应用程序。

另外,目前并不支持从Vitis GUI启动PS on x86的仿真模式,需要从命令行完成。 GitHub 上有使用此功能运行软件仿真的示例供参考:
https://github.com/Xilinx/Vitis_Accel_Examples/tree/2023.1/emulation/aie...

最新文章

最新文章