步骤 1:将代码分区为加载 - 计算 - 存储模式 - 2023.2 简体中文

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

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 简体中文

内核本质上就是定制数据路径(专为期望的功能而优化)和关联的数据存储与移动网络。此数据存储与移动网络也称为内核的存储器架构存储器层级,负责以尽可能高效的方式将数据移入和移出内核,以及通过定制数据路径来进行移动。

了解内核访问全局存储器代价不菲且宽带有限后,审慎规划内核的这方面操作就显得尤为重要。

为此,内核开发方法论的第一步就是要求按“加载 - 计算 - 存储”模式来构造内核代码。

这意味着创建带有下列元素的顶层函数:

  • 与所需内核接口匹配的接口参数。
  • 三个子函数:load(加载)、compute(计算)和 store(存储)。
  • 本地阵列或 hls::stream 变量,用于在这些函数之间传递数据。
图 1. “加载 - 计算 - 存储”模式

以这种方式构造的内核代码可支持任务级流水打拍(也称为 HLS 数据流)。此编译器最优化可使设计中的每个函数同时运行,从而创建任务并发运行的流水线。这是我们工厂组装线的前提条件,这种结构是实现和维持所需吞吐量的关键。如需了解有关 HLS 数据流的更多信息,请参阅 Vitis 统一软件平台文档:应用加速开发(UG1393) 中的任务并行

加载函数负责将内核外部的数据(即,全局存储器)移动到内核内部的计算函数。此函数不执行任何数据处理,而是侧重于有效的数据传输,包括必要时的缓冲 (buffering) 和缓存 (caching)。

顾名思义,计算函数是完成所有处理的地方。在开发流程的这个阶段,计算函数的内部结构并不重要。

store 函数是 load 函数的镜像操作。它负责将数据移出内核,获取计算函数的结果并将它们传输到内核外的全局存储器。

创建满足性能目标的加载 - 计算 - 存储结构首先要在内核中设计数据流。需要考虑的因素包括:

  • 数据如何从内核外部流入内核?
  • 内核处理这些数据的速度有多快?
  • 如何将处理后的数据写入内核的输出?

理解和可视化数据移动模块框图将有助于分区和构建内核中的不同函数。

在 GitHub 仓库 Vitis 示例中可以找到有关加载 - 计算 - 存储模式的工作示例。