Stable 阵列 - 2023.2 简体中文

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

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

stable 编译指示可用于标记数据流区域的输入变量或输出变量。其作用是移除其对应的任务级同步,假定用户保证此移除行为确实正确无误。

void dataflow_region(int A[...], ...
#pragma HLS stable variable=A
#pragma HLS dataflow
    proc1(...);
    proc2(A, ...);

如果不使用 stable 编译指示,并假定 Aproc2 读取,那么 proc2 会成为其所在位置的数据流区域内执行的初始同步的一部分。这意味着仅当 proc2 同样准备好重新启动后,proc1 才能重新启动,这会阻止数据流迭代重叠,从而可能导致性能下降。stable 编译指示表明无需此同步亦可保持操作正确性。

通过 stable 编译指示,编译器假定:

  • 如果 Aproc2 读取,那么执行 dataflow_region 时,读取的存储器位置仍可访问,任何其他进程或调用上下文都无法覆盖这些存储器位置。
  • 如果 Aproc2 写入,那么执行 dataflow_region 时,任何其他进程或调用上下文在定义写入的存储器位置前都无法读取这些位置。

典型场景是仅当数据流区域尚未开始执行或者已完成执行时,调用程序才会更新或读取这些变量。

总之,数据流最优化是一种强大的最优化,可以显著改善设计的吞吐量。由于需依靠 HLS 来对设计内可用并行度执行推断,因此需要设计师来辅助确保代码编写方式可便于 HLS 进行明确推断。最后,在某些情况下,设计师仍会发现需要在同一设计内同时部署“Dataflow”(数据流)模型和“Task-Channel”(任务通道)模型。下一章节描述了这种混用组合模型,这种模型能够产生一些有趣的设计。