使用代码分析器 - 2023.2 简体中文

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

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

要在高层次综合 (HLS) 中达成最佳结果,通常需要更改代码以改善设计的宏架构。为助您实现此目标,Vitis HLS Code Analyzer(代码分析器)提供了各种功能特性,可支持您直观查看任务级并行度的可行性,了解性能最优化所需的架构更改。

您可在 C 语言仿真步骤中运行代码分析器,具体方法是在 HLS 配置文件中启用 csim.code_analyzer 命令,如 C 语言仿真配置 中所述。运行代码分析器后,会在Flow Navigator的 C 语言仿真步骤中的“Reports”(报告)下或者在 Vitis Unified IDE 的“Analysis”(分析)视图中显示“Code Analyzer”报告。代码分析器的功能特性包括:

数据流计算图抽取
代码分析器报告会抽取数据流计算图 (DFG),其中顶层语句会变为数据流进程(DFG 节点),这些进程的数据依赖关系会变为数据流通道(DFG 边沿)。计算图可从函数或循环主体(即使这两者并非数据流)生成,以帮助您更准确判断如何以数据流形式重写代码,如 HLS 抽象并行编程模型 中所述。
性能指标
数据量、传输事务时间间隔 (TI) 和吞吐量等性能指标由代码分析器来确定。数据量和访问模式可通过 C 语言测试激励文件根据剖析信息来确定。例如,该工具可确定变量 A 推断端口位宽为 32 位,进程 1 先写入 8 Kb 的数据,然后进程 2 读取这些数据。代码分析器会在综合之前对设计进行分析,估算传输事务时间间隔或数据传输完成所需的时间,以及通道的吞吐量。不过,由于估算发生在综合之前,因此其准确性不及根据已综合的 RTL 的性能计算得出的结果。
性能指南
识别 HLS 组件源代码可能存在的阻碍性能的主要因素。这些阻碍因素包括循环依赖关系和存储器端口争用。性能指南可帮助您了解可能限制设计性能的代码结构,或者识别哪些指标能助您了解设计可达成的性能级别。
计算图变换
根据数据流计算图分解以及测量和估算指标,您可能会判断计算图并非所见般理想。您可修改计算图,包括合并进程以执行假设类型的设计探索。计算图修改后,将根据新的架构判断新的性能指标。这种设计进程的迭代可以产生一个理想架构的解决方案蓝图,供您作为重构源代码的基础。
重要: 在代码分析器报告中可以合并和拆分代码,但您要沿用的任何更改都需要在原始设计源码中手动重新实现。

使用代码分析器报告

启用代码分析器并运行 C 语言仿真命令后,就会生成代码分析器报告,此报告在 Vitis Unified IDE 的“Analysis”视图或Flow Navigator的“Reports”报头下查看。代码分析器报告最初会显示组件顶层函数定义的进程和通道计算图,如下例所示。您可使用工具栏菜单中的Function(函数)选择器或者单击计算图中已展开的进程中的向右箭头来更改报告范围。

图 1. 代码分析器报告

代码分析器报告的功能特性如下:

计算图
报告中的“计算图”视图以数据流计算图的形式显示设计的进程和通道。这样即可推断是否存在 DATAFLOW 编译指示或指令,即使源代码中不存在该编译指示或指令也是如此。每个进程都会显示该元素的传输事务时间间隔和性能指南,并包含该元素的源代码,可通过展开代码视图查看。以下示例显示了综合前分析期间估算的性能。数据流进程(计算图节点)的 TI 显示在右上角的黄色/红色框中。
形成数据流进程的代码中的函数调用和循环也会在调用或循环报头后紧接着显示一些性能指标,其中可包含详情链接,并提供可识别阻碍该循环或函数调用性能的因素的额外指导信息。


此外,您可单击进程报头,并选中Goto Source(转至源码)命令以打开源文件并高亮其中的源码。
在计算图下方,“Code Analyzer”报告会显示一个表格,其中有两个选项卡:“Processes”(进程)和“Channels”(通道)。它提供了不同要素的快速汇总,以便您在一张表中查看分析结果。
  • “Processes”会显示计算图的进程,还包括估算的综合前传输事务时间间隔 (TI),并提供分析可能生成的任何设计指导信息。
  • “Channels”会在单独一行中显示进出每个进程的数据流通道。通道以定义通道的变量命名,其中包含变量声明的详细信息,例如,位宽、预计通过该通道交付的数据量、预计的吞吐量、访问模式以及生产者和使用者任务或进程。
工具栏
“Code Analyzer”报告的工具栏菜单提供了多项命令用于帮助配置和查看报告。

上图从左到右显示了以下命令:
  • Zoom In/Zoom Out/Zoom Fit(放大/缩小/缩放适应):按需放大计算图。
  • Toggle Table(切换表格):显示或隐藏进程和通道表。这样即可按需为计算图腾出空间。
  • Collapse All(全部折叠):关闭计算图中所有已展开的进程。
  • Group All/Ungroup All(全部组合/全部取消组合):将含有相同源和目标的通道加以组合或取消组合。
  • Function(函数):为当前计算图提供上下文。可通过以下方法更改上下文:从列表中选择一个新函数,或者单击进程代码中循环和函数调用旁边的箭头。
  • Heat Map(热图):将计算图的报告数据指定为循环或进程的传输事务时间间隔 (TI) 或性能指导消息。就 TI 而言,最大的结果以红色高亮显示,表明这些进程最慢,会限制整个数据流区域的性能。
  • Properties(属性):显示或隐藏显示性能瓶颈的面板。面板内容通过单击进程代码中的Details链接来设置。
  • Info(信息):提供与工具使用、返回的指标或设计常见附加说明相关的信息。这些信息值得不时查阅。
  • Settings(设置):指定计算图中的吞吐量单位和边沿标签。可用单位是每个(周期或秒)的(位数或字节数)。您还可通过设置Channel Volume Filter(通道量筛选器)将低位数据信号(例如,控制信号)灰显来指定数据量下限,以便您专注于高位数据通道。
概述
“Overview”(概述)是整个计算图的缩影,为放大计算图时显示的其中相应部分提供参考。您可以使用“Overview”通过操作边界来管理计算图视图。您也可以按需克隆“Overview”以便腾出计算图上的空间。

处理计算图

开始设计时,您需要深入了解 HLS 组件源代码,识别主要进程以及这些进程之间的依赖关系。“Code Analyzer”对此予以支持,具体方式是以数据流计算图的形式显示代码,作为 C 语言仿真的输出。

“Code Analyzer”报告会显示每个进程的传输事务时间间隔 (TI),并在热图中使用红色背景显示值最高的 TI。红色表示设计的问题区域。然而,计算图中使用的综合前估算并不能提供与综合后或实现后指标相同的保真度。“Code Analyzer”支持您快速判定性能潜力、识别问题并加以解决。如需更精确的信息,应使用综合与实现。

您可以合并源代码中的连续进程,探索设计的不同数据流结构,然后按需将代码重新拆分成独立的进程。只需将一个进程拖放到另一个进程上,即可将其合并。请谨记,在原始源代码中,进程必须按序执行。下图显示了两个进程先合并,然后使用代码中的SPLIT行重新拆分的过程。

如果您识别出当前设计中存在较大的瓶颈,并希望将其转化为数据流区域,您可以将计算图重新聚焦到函数体或循环主体,然后继续对设计进行分析。努力有条不紊解决问题,并充分利用代码分析器。

最终必须以数据流的形式重写代码,以反映代码分析器的结果。通常,您需要按进程自有函数的顺序来理清这些进程的顺序,并在函数、循环或区域内添加数据流编译指示。要加速此进程,请单击计算图中的每个进程上的Goto Source、右键单击所选源代码,然后选中Refactor(重构)。

用例

合规性

代码分析器支持先识别数据流设计中的合规性问题(如 规范形式规范主体 中所述),然后再尝试综合。可以识别的关键问题有:

  • 读取和写入接口可通过对始于“开始节点”或止于“结束节点”的通道进行“R+W”(读取和写入)访问来找到。
  • 可从该表中识别多个生产者/使用者违例,按通道名称排序并识别具有相同变量的多个通道。对开始节点和结束节点的访问一般都可以取消。
  • 可以在表中找到反馈回路,其通道访问模式可能是“R → W”(先读取后写入)模式或可能是“R+W → W”(先读写后写入)模式。此分析可通过通道类型来加以补充,以区分合规与违规的反馈通道。
  • 未理清顺序的进程可从进程代码中识别:用户应把目标定为每个进程的顶层数据流区域内都仅含单次函数调用,并且尽可能在此次调用中使用变量或常量作为实参。

这些问题可以直接在代码中修复,然后新一轮 C++ 仿真就能用更新的指标和结构刷新计算图。

改善性能

数据流区域性能的关键组成部分之一就是构成该区域的进程的 TI。代码分析器可用于有效提高数据流进程的性能,而无需 HLS 综合。

选中工具栏菜单的Heat Map选择器中的Performance Guidance(性能指南)即可使用计算图节点上存在的问题标记来识别存在性能问题的进程。展开进程代码可呈现在进程中识别出的特定问题的详情。您可以调查这些问题,并根据可行性、这些问题的位置和最终性能目标来决定是否解决这些问题。例如,如果您希望在某些特定进程的内层循环中 II=1,那么您就需要重写代码,以解决该特定循环嵌套上呈现的所有问题。

在相关用例中,您可能出于教育培训目的或验证目的,希望了解特定进程的 TI 是如何计算的。函数调用和循环旁的 TI 和 II 注解可与进程源代码内联,以便达成您的目的。

吞吐量分析

代码分析器会呈现通道的吞吐量估算结果。为了辅助分析和更好地了解设计性能,您还可以访问通道宽度及其容量(区域每次执行的访问总数)。不过,您应尽可能通过综合设计来确认吞吐量估算结果。代码分析器依赖于综合前的估算,其保真度低于其他综合后和实现后的指标。