前言Vitis 应用加速开发平台1. 组成模块软件(Host) 与 硬件(Kernel)软硬件交互2. 执行过程3. 示例:数据中心应用加速的开发4. 示例:嵌入式应用加速的开发5. 建立目标文件 Target
前言
上篇文章主要介绍了 HLS 是什么,这篇文章将从宏观上了解 Vitis 应用加速开发平台的组成和运行过程。
Vitis 应用加速开发平台
1. 组成模块
软件(Host) 与 硬件(Kernel)
Vitis 应用加速开发(The Vitis application acceleration development flow)提供了一个用于使用软硬件的标准编程语言开发 FPGA 加速应用的框架。 主要分为软硬件两部分,或者主机(host)和内核(kernel)两部分:
软件部分(host program):使用 C/C++ 开发,可在 x86 或嵌入式处理器上运行,并调用 OpenCL™ API 来与加速器交互硬件部分(kernel):可以使用 C/C++、OpenCL C 或 RTL 进行开发。
软硬件交互
主机(Host processor) 与硬件加速器(Hardware accelertor)之间的交互通过 XRT(Xilinx Runtime Library) 管理的 API 调用完成。 主机和内核之间的通信,包括控制和数据传输,位于 PCIe 总线或嵌入式平台的 AXI 总线上。 虽然控制信息仅在硬件中的特定内存位置之间传输,但用于在主机和内核之间的数据传输使用的是全局内存(global memory)。 主机和硬件加速器都可以访问全局内存,而主机内存(host memory)只能由主机应用程序访问。
例如,在应用中,主机首先将内核要操作的数据从主机内存传输到全局内存中。 内核随后对数据进行操作,将结果存储回全局内存。 内核完成后,主机将结果传输回主机内存。
上述数据传输过程显然会引入延迟(latency),这对整个应用程序来说可能是代价高昂的。 因此,为了在真实系统中实现加速,硬件加速所获得的好处必须足够多。
2. 执行过程
开发平台由 FPGA 加速内核(kernel)、全局内存(global memory)和用于内存传输 DMA 组成。 内核可以有一个或多个可编程的全局内存接口。 Vitis 核心执行过程可以分解为以下步骤:
Host 通过 PCIe 接口或 AXI 总线将 Kernel 所需的数据写入所连接设备的 global memory 中。Host 使用其输入参数设置 Kernel。Host 触发 FPGA 上的内核函数(Kernel function)的执行。Kernel 执行所需的计算,并在必要时从 global memory 读取数据。Kernel 将数据写回 global memory 并通知 Host 任务完成。Host 将数据从 global memory 读回 host memory,并根据需要继续处理
FPGA 可以在加速器上运行多个 Kernel 实例,包括不同类型的 Kernel ,以及同一 Kernel 的多个实例。 XRT 负责协调这一交互过程。
3. 示例:数据中心应用加速的开发
4. 示例:嵌入式应用加速的开发
5. 建立目标文件 Target
Vitis 编译器提供三种不同的构建目标(build target),其中前两个是用于调试和验证目的的仿真目标(emulation target),最后一个是用于生成实际 FPGA 二进制文件的默认硬件目标(hardware target)
软件仿真 Software Emulation (sw_emu)
Host 和 Kernel 的代码都被编译在 Host 上运行。这可以通过快速构建和运行循环,完成迭代算法的细调(refinement)。通常用于识别语法错误、对与应用程序一起运行的 kenel 代码进行源代码(source code)级调试,以及系统行为验证。
硬件仿真 Hardware Emulation (hw_emu)
Kernel 代码被编译成硬件模型 (RTL),该模型在专用模拟器中运行。这个构建和运行循环需要更长的时间,但提供了 Kernel 详细的、周期准确的行为仿真。用于测试将写入 FPGA 的逻辑功能,并获得初始性能估计。
硬件 Hardware
Kernel 被编译成一个硬件模型 (RTL),然后在 FPGA 上实现,产生一个将在实际 FPGA 上运行的二进制文件。
Reference: Vitis Unified Software Development Platform .2 Documentation