循环流水打拍 - 2022.1 简体中文

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

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

循环流水打拍允许您将一段时间内的循环迭代重叠,如 循环流水打拍 中所述。允许循环迭代并发运行通常是个好办法,因为可在迭代之间共享资源(降低资源利用率),同时所需执行时间比未展开的循环所需时间更短。

在 C/C++ 中通过 pragma HLS pipeline 启用流水打拍:

#pragma HLS PIPELINE

OpenCL API 使用 xcl_pipeline_loop 属性时:

__attribute__((xcl_pipeline_loop))
注释: OpenCL API 还有其它方法来指定循环流水打拍。原因在于工作项循环并未被明确声明,对这些循环进行流水打拍需要以下属性:
__attribute__((xcl_pipeline_workitems))

在此示例中,“HLS Project”(HLS 工程)中的“Schedule Viewer”(调度查看器)可产生以下信息:

图 1. “Schedule Viewer”中的循环流水打拍

其中总体估算为:

图 2. 性能估算

由于循环的每次迭代仅耗用两个时延周期,因此只能有单个迭代重叠。这样使总时延相比原时延减半,最终总时间为 257 个周期。由此不仅降低了时延,而且所占用的资源相比循环展开时所占用的资源更少。

在多数情况下,循环流水打拍本身可提升总体性能。但是流水打拍的有效性取决于循环结构。部分常用迭代为:

  • 如果存储器端口或进程通道之类的资源可用性受限,则可能限制迭代的重叠(启动时间间隔)。
  • 例如,由任一迭代中计算所得的变量条件会影响下一个迭代,诸如此类的循环进位依赖关系可能会导致流水线的启动时间间隔 (II) 增加。

在高层次综合期间,该工具会报告这些影响,并且可在“Schedule Viewer”中对其进行观测和检验。为了尽可能提升性能,可能需要修改代码以移除这些限制因素,或者可能需要指示工具通过重构阵列的存储器实现来消除部分依赖关系或者切断全部依赖关系。