最优化技巧与故障排除提示 - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

本章节概括的各项最优化技巧可供您用于指导 AMD Vitis™ HLS 生成可满足所期望的性能和面积目标的宏架构。使用 Vitis HLS 时可以将不同的最优化指令应用于设计,包括:

  • 任务流水打拍,允许在当前任务完成前即开始执行下一项任务。
  • 指定完成函数、循环和区域的目标时延。
  • 指定使用的资源数量限制。
  • 覆盖代码中的固有或隐含依赖关系,以允许执行特定操作。例如,如果可以放弃或忽略初始数据值(例如在视频流中),则允许对存储器先读取后写入,前提是这样可提高性能。
  • 指定 I/O 协议以确保函数实参可以连接到具有相同 I/O 协议的其他硬件块。
    注释: Vitis HLS 自动确定任何子函数使用的 I/O 协议。您不能控制这些端口,只能指定端口是否寄存。

这样有助于了解用于对来自 C/C++ 源代码的 RTL 硬件描述进行综合的进程。认识高层次综合的调度与绑定 描述了有关此进程的部分重要详细信息,这些信息有助于 您了解如何为其进行最优化。

您可使用各种 HLS 编译指示,将最优化指令作为编译器的编译指示直接添加到源代码中,或者也可以使用这些指令作为配置命令,如 添加编译指示和指令 中所述。下表列出了 HLS 编译器提供的最优化指令(作为编译指示或配置命令)。

表 1. Vitis HLS 最优化指令
指令 描述
AGGREGATE AGGREGATE 编译指示用于将任一结构体的所有元素都组合到一个单宽矢量中,以允许同时读取和写入该结构体的所有成员。
ALIAS ALIAS 编译指示支持在 Vitis HLS 中通过定义访问相同 DRAM 缓冲器的多个指针之间的距离来执行数据依赖关系分析。
ALLOCATION 用于指定所使用的运算、实现或函数的数量限制。这样会强制共享硬件资源并可能增大时延。
ARRAY PARTITION 把大型阵列分区为多个较小阵列或分区为单独的寄存器,以改善数据访问并消除块 RAM 瓶颈。
ARRAY_RESHAPE 把阵列从多元素阵列重塑为字宽更宽的阵列。用于在不增加使用的块 RAM 数量的前提下提升块 RAM 访问。
BIND_OP

用于为 RTL 中的运算定义特定的实现。

BIND_STORAGE

用于为 RTL 中的存储元素或存储器定义特定的实现。

DATAFLOW 支持任务层次的流水打拍,允许函数和循环并发执行。用于最优化吞吐量和/或时延。
DEPENDENCE 用于提供可克服循环进位依赖关系并允许循环流水打拍(或以更低的时间间隔进行流水打拍)的其他信息。
DISAGGREGATE 将结构体细分为各独立元素。
EXPRESSION_BALANCE 允许关闭自动表达式平衡。
INLINE 内联函数,移除该层次的函数层级。用于跨越函数边界实现逻辑最优化,通过减少函数调用开销来改善时延/时间间隔。
INTERFACE 指定如何根据函数描述创建 RTL 端口。
LATENCY 允许指定最小和最大时延约束。
LOOP_FLATTEN 允许把嵌套循环折叠为已改善时延的单一循环。
LOOP_MERGE 合并连续循环,以缩短总体时延、增加共享和提升逻辑最优化。
LOOP_TRIPCOUNT 用于含变量边界的循环。提供估算的循环迭代计数。这对综合没有影响,只对报告功能有影响。
OCCURRENCE 在对函数或循环进行流水打拍时使用,用于指定某个位置的代码执行速度低于外围函数或循环中的代码执行速度。
PERFORMANCE 指定期望的循环传输事务时间间隔,允许工具判定达成此结果的最佳方式。
PIPELINE 允许在单一循环或函数内重叠执行运算,从而缩短启动时间间隔。
PROTOCOL 此命令用于指定代码区域(协议区域),除非代码中明确指定,否则 Vitis HLS 不会在其中插入时钟操作。
RESET 本指令用于在特定状态变量(全局或静态)上添加或移除复位。
STABLE 用于指示在数据流区域的入口和出口处生成同步时,可忽略某个该数据流区域的变量输入或输出。
STREAM 指定在数据流最优化期间将特定阵列作为 FIFO 或 RAM 存储器通道来实现。使用 hls::stream 时,STREAM 最优化指令用于覆盖 hls::stream 的配置。
TOP 综合的顶层函数在工程设置中指定。该指令可用于将任意函数指定为综合的顶层函数。这样即可允许将相同工程内的不同解决方案指定为综合的顶层函数,而无需创建新工程。
UNROLL 展开 for 循环以创建循环主体的多个实例,随后即可独立调度其指令。

除了最优化指令外,Vitis HLS 还提供了多条配置命令,这些命令可能影响综合结果的性能。如需了解有关使用配置命令的详细信息,请参阅 HLS 配置文件命令。下表反映了其中部分命令。

表 2. Vitis HLS 配置
GUI 指令 描述
阵列分区配置 用于判断包括全局阵列在内的阵列分区方式,以及分区是否会影响阵列端口。
编译选项 控制综合专用最优化功能,例如自动循环流水打拍和浮点运算最优化。
数据流配置 用于指定数据流最优化中的默认存储器通道和 FIFO 深度。
接口配置 用于控制与顶层函数实参无关联的 I/O 端口,允许从最终 RTL 中去除未使用的端口。
运算符配置 配置指定运算的默认时延和实现。
RTL 配置 提供对输出 RTL 的控制权,包括文件和模块命名以及复位控制。
调度设置 判断综合调度阶段的工作量以及输出消息的详细程度
存储配置 配置指定存储类型的默认时延和实现。
展开设置 配置展开循环的默认循环次数阈值。