C/C++ 内核的开发方法论 - 2022.1 简体中文

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

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

Vitis 软件平台支持以 C/C++ 或 RTL(Verilog、VHDL 或 System Verilog)建模的内核。此方法指南适用于 C/C++ 内核。如需了解有关开发 RTL 内核的详细信息,请参阅 RTL 内核

在架构定义阶段,应该已经确定了以下关于最佳应用程序性能的关键内核要求:

  • 吞吐量目标
  • 时延目标
  • 数据路径宽度
  • 引擎数
  • 接口带宽

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

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

  1. 定义和实现内核的宏架构
  2. 编码和最优化内核的微架构

开始内核开发进程之前,必须了解功能、算法和架构间的差异及其与内核开发进程的关系。

  • 功能是输入参数与输出结果之间的数学关系。
  • 算法是执行特定功能的一系列步骤。任一给定功能可使用各种不同算法来执行。例如,排序功能可使用“quick sort”(快速排序)算法或“bubble sort”(冒泡排序)算法来实现。
  • 在此上下文中,架构表示算法底层硬件实现的特性。例如,特定排序算法实现时,并行执行的比较器可多可少、可包含 RAM 或基于寄存器的存储器等。

您必须理解,Vitis 编译器会根据以 C/C++ 语言编写的算法来生成最优化的硬件架构。但它并不会将特定算法变换为其它算法。即使软件程序可自动转换(或综合)为硬件,但要实现可接受的结果质量 (QoR),仍需要额外工作(例如,重写软件)以帮助 HLS 工具实现期望的性能目标。

因此,由于算法直接影响数据访问局部性以及计算并行性的可能性,您所选择的算法就会对可实现的性能产生重大影响,比编译器的功能或者用户指定的编译指示产生的影响更大。为此,您需要了解正确编写软件的最佳实践,以确保在 FPGA 器件上正常执行软件。在接下来的几个章节内,将探讨如何首先识别部分宏观级别架构最优化以明确程序结构,然后聚焦更细化的微观级别架构最优化来实现性能目标。

以下方法论假定您已明确了适用于要加速的功能的算法。

图 1. 内核开发方法论