Vitis 应用开发流程 - 2022.1 简体中文

Vitis 统一软件平台文档 应用加速开发 (UG1393)

Document ID
UG1393
Release Date
2022-05-25
Version
2022.1 简体中文

在本节中,您将首先了解 Vitis 应用开发流程相关信息,然后回顾方法论,了解如何基于 FPGA 的加速进行 CPU 应用重构,以及如何对每个内核进行重新编码来满足整体性能目标。以下显示了 Vitis 应用开发流程的图例。

图 1. Vitis 开发流程
开发流程包括下列步骤:
使用 G++ 进行应用编译

以 C/C++ 编写并使用 XRT 本机 API 的主机程序是使用 g++ 编译器编译的,旨在创建可执行文件以供在 x86 处理器上运行。该主机程序会与 FPGA 器件上的 PL 区域中的内核进行交互。

使用 Vitis HLS 进行内核编译

Vitis HLS 是一种编译器,它采用 C/C++ 源代码作为输入,将其综合到专为 AMD FPGA 产品最优化的 RTL 设计内。每个 C++ 内核都必须使用 Vitis HLS 进行综合才能生成赛灵思对象 (.xo) 文件。可将一个或多个 .xo 文件配对以便使用 Vitis 连接器进行链接,用于生成 .xclbin 文件。

Vitis HLS 中的内核开发步骤包括。

  1. 为函数编写 C/C++ 代码
  2. 使用 C 语言仿真来验证代码
  3. 使用 C 语言综合来构建内核
  4. 验证随 C++ 输出生成的内核
  5. 复查 HLS 综合报告和协同仿真报告以分析性能
  6. 重复前述步骤直至满足性能目标为止。
使用 Vitis 工具进行 PL 内核链接

赛灵思对象 (.xo) 文件通过 Vitis 连接器与目标硬件平台相链接,以创建器件二进制文件 (.xclbin),此二进制文件将在 Alveo 加速器卡上加载并执行。

提示: 该步骤将调用 Vivado 布局布线来生成 .xclbin 文件。

为帮助定义器件二进制文件的架构,可创建配置文件指定各种选项,例如,应在器件二进制文件中构建的内核实例(或计算单元)数量、内核连接到全局存储器或其它内核的方式等。此配置文件将传递到 Vitis 连接器用于生成 .xclbin

Vitis 编译器用于定义生成的 .xclbin 文件的性质和内容,它有三个不同的构建目标。其中两个仿真目标用于确认和调试:软件仿真用于基于 C 语言的仿真,硬件仿真用于 RTL 协同仿真,一个硬件目标用于构建最终工程输出以供在 Alveo 卡上运行。可使用相同主机程序在任意 .xclbin 目标上运行。

提示: 仿真目标的编译比实际硬件的编译要快得多。仿真运行是在仿真环境中执行的,可增强调试可视性,且无需使用物理加速器卡。
运行应用
最终运行应用时,主机程序会加载 Vitis 编译器所生成的 .xclbin 文件。主机应用始终在 CPU 上运行,在 x86 上可在仿真模式下运行,或者也可以在实际物理加速器平台上运行。

开发 Vitis 加速应用

方法论包含 2 个主要阶段:

  1. 按定义的性能目标来完成应用架构并识别内核。开发者制定出有关应用架构的关键决策,包括决定应映射到器件内核的软件函数、所需的并行度及其交付方式。
  2. 开发 C/C++ 内核以满足确立的目标。开发者实现内核。此任务主要涉及构建源代码并应用所需的编译器编译指示来创建所需的内核架构并满足性能目标。请复查面向软件程序员的设计原则,该主题主要面向想要了解根据 C/C++ 编写的软件算法来完成加速硬件综合过程的软件开发者
图 2. 应用架构方法论
前图高亮了与应用架构相关的主要任务:
  • 使用 Valgrind、callgrind 和 gprof 对 C++ 应用进行剖析,创建分析基准。耗用执行时间最多的函数适合卸载到 FPGA 上并在其中进行加速。
  • 可达到的最大吞吐量受到 PCIe 总线的限制。PCIe 性能则会受到诸多不同方面的影响,例如,主板、驱动程序、目标平台和传输大小等。预先运行 DMA 测试可测量 PCIe 传输的有效吞吐量,从而确定加速潜力的上限,例如 xbutil dma 测试。
  • 复查算法并分析所有并行路径以识别性能瓶颈。加速某一条路径可能无法为整体应用提供期望的加速。在寻找加速对象时,请考虑整个应用程序的性能,而不仅仅考虑单个函数。
  • 识别整体加速潜力,设置应用性能目标。
  • 识别要加速的函数并明确总体加速目标之后,下一步是确定满足目标所需的并行化级别。
  • 在主机与器件数据传输之间启用并行度,并在 FPGA 上进行计算,尽可能缩短空闲时间。使器件内核保持处于活动状态,以便尽早并尽量频繁执行新计算。最优化往来器件的数据传输。

如需更详细了解本主题,请参阅 使用 Vitis 软件平台加速数据中心应用的方法论,或者请参阅《Vitis HLS 用户指南》(UG1399) 中的面向软件程序员的设计原则

C/C++ 内核的开发方法论

即使软件程序可自动转换(或综合)为硬件,但要实现可接受的结果质量 (QoR),仍需要额外工作(例如,重写软件)以帮助 Vitis HLS 工具实现期望的性能目标。为此,您需要了解正确编写软件的最佳实践,以确保在 FPGA 器件上正常执行软件。在接下来的几个章节内,将着重探讨如何首先识别部分宏观级别架构最优化以明确程序结构,然后聚焦更细化的微观级别架构最优化来实现性能目标。在架构定义阶段,应该已经确定了以下关于最佳应用程序性能的关键内核要求:

  • 吞吐量目标
  • 时延目标
  • 数据路径宽度
  • 加速内核的数量。
  • 接口带宽

这些要求推动了内核开发和最优化过程。因为整体应用程序性能取决于满足指定吞吐量的每个内核,所以主要目标是实现内核吞吐量目标。

因此,内核开发方法遵循吞吐量驱动的方法,并从外向内开展。这种方法有两个阶段,如下图所示:

  1. 定义和实现内核的宏架构
  2. 编码和最优化内核的微架构
图 3. 内核开发方法论

请参阅 C/C++ 内核的开发方法论 以便详细了解相关要求、注意事项及如何进行代码重构以提升性能。