指南宏 - 2023.2 简体中文

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

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

VSC 支持的指南宏允许加速器类中的函数实参(包括 PE 和 compute)使用各种类型的硬件接口。以下提供了不同类型的指南宏的定义:

SYS_CLOCK_ID(<PE-name>, <clock-ID>);
  • <PE-name> 用于指定在 compute() 函数主体中例化的处理元素函数。
  • <clock-ID> 是整数值,表示此平台支持的任意时钟,可用于用户逻辑分区内的连接。指定该宏时,内核实现将使用内核对应的时钟信号线。platforminfo 命令用于查找平台的可用时钟 ID。
提示: 当 2 个 PE 通过 AXI-Stream 连接时,如果这些 PE 标记为自由运行,那么时钟 ID 可能有所不同。在此情况下,VSC 将自动插入时钟域交汇 (CDC) 连接用于这些 PE 之间的数据传输。当自由运行的 PE 连接到非自由运行的 PE 时,这 2 个 PE 需要相同的时钟 ID。
SYS_PORT(<port>, <global_memory>);

指定用于 compute() 函数的给定实参的平台接口。全局存储器通常是存储体,用于往来 FPGA 的数据传输。

  • <port> 表示特定 compute() 实参的名称。
  • <global_memory> 可使用以下任一形式来指定。
    • <bank-ID>:适用于所有 CU 实例的单个 bank ID。例如,DDR、DDR[1] 或 HBM[5]。platforminfo 命令可用于查找平台的 bank 名称。
      重要: 请注意以下限制:
      • 仅限 X3 混合平台 (xilinx_x3522p*) 才支持主机存储器 (HOST[0])
      • 不支持指定存储体范围(例如,HBM[0:3])
      • 不支持指定 PLRAM
    • (<CU1-bank-ID>:<CU2-bank-ID>:...:<NCU-bank-ID>):每个 CU 的 bank ID 列表,ID 间以冒号分隔,列表以括号括起。对于每个 CU,bank-ID 是按数字顺序指定的,但不包含 CU 名称:(HBM[0]:HBM[4]:HBM[8]:HBM[12])。条目数必须与 (/*NCU=*/4) 类中指定的 CU 数量相匹配。

SYS_PORT_PFM(<substr>, <port>, <global_memory>);

可用于为特定平台配置加速器端口连接,但通过单一类报头来定义。例如,在以下给定代码中,port-A 对于 u50 平台将连接到 HBM[0],对于所有其他平台则连接到 DDR[0]。

SYS_PORT(A, DDR[0]);
SYS_PORT_PFM(u50, A, HBM[0]);
  • <substr> 表示平台名称的子字符串。例如,仅当平台名称包含指定字符串时,使用 u50 才会采用 SYS_PORT_PFM 连接。
  • 对于 SYS_PORT 宏,<port><global_memory> 实参的使用方式如上所述。
重要: 针对同一个 <port> 提供多个 SYS_PORTSYS_PORT_PFM 宏时,VSC 将应用所读取的最后一个适合的 SYS_PORTSYS_PORT_PFM 指南宏。
ACCESS_PATTERN(<port>, <pattern>);

启用 VSC 以推断器件内的硬件加速器接口与全局存储器之间的数据移动器。

  • <port> 表示特定 compute() 实参的名称。
  • <pattern> 用于定义任一存储器访问模式,有如下两种模式:
    • SEQUENTIAL:数据通过 AXI4‑Stream 连接传输到加速接口。CU(或内核)代码必须严格遵循对应实参上的顺序访问模式,否则将导致硬件行为错误。例如,指针索引应按编码样式 pointer[i++]*pointer++ 按顺序递增。
    • RANDOM:数据传输到片上存储器内,该存储器充当加速器的高速缓存。因此,CU 代码无需遵循顺序访问模式。
      重要: 片上存储器资源有限(例如,通常每个 BRAM 有 32 Kbit,可作为 1024 个 32 位码字来访问)。如果单个 compute 作业的有效载荷较大,使用过多片上 RAM,则可能在 Vivado 工具中导致时序收敛问题。那么可能使用 ZERO_COPY 指南宏将加速器直接连接到全局存储器效果更好,如下所述。
DATA_COPY(<port>, <port>[<Num>]);

用于推断全局存储器与加速器接口之间的数据移动器 IP。在每次 compute() 调用的运行时,此数据移动器 IP 都将在特定 compute() 实参与 SYS_PORTSYS_PORT_PFM 指南宏所指定的源存储器之间,或者在该特定实参与本地片上存储器之间进行往来数据复制。

  • <port> 表示特定 compute() 实参的名称。
  • <port>[<Num>] 用于指定阵列或指针实参引用的阵列元素数量。Num 可指定为 compute() 的 C 语言常量和/或标量实参的表达式。这样即可允许加速器包含动态有效载荷大小(在运行时确定),并为用户定义的实参数据类型启用 AXI4 连接上的自动突发、数据宽度转换和填充。
重要:DATA_COPYRANDOM 访问模式搭配使用时,compute API 的原型中的对应实参必须声明为大小固定的阵列。例如:compute(int A[10], ...)
ZERO_COPY(<port>);

指令 VSC 不推断数据移动器 IP。改为允许加速器为 compute() 函数的指定实参使用直接连接到指定全局存储器的 AXI4 接口。

  • <port> 表示特定 compute() 实参的名称。
ASSIGN_SLR(<PE>, <SLR-IDS>);

VSC 将请求 Vivado 把指定 PE 的相关逻辑布局到一个或多个指定 SLR 内。但这只是一个请求,最终在布局期间做决定。

  • <PE>:指定处理元素的名称。
    提示: 如果指定 compute() 函数,那么 SLR 分配适用于 compute() 函数内的所有 PE。
  • <SLR-IDS>:指定用于布局 PE 的 SLR。可使用以下任一形式来指定。
    • <SLR-ID>:将指定 SLR-ID 应用于此 PE 的所有 CU 实例。
    • (<CU1-SLR-ID> : ... : <NCU-SLR-ID>):SLR-ID 列表,ID 间以冒号分隔,列表以括号括起。这些 SLR-ID 分配给 CU 实例。条目数必须与 (/*NCU=*/4) 类中指定的 CU 数量相匹配。

FREE_RUNNING(<PE>);

支持将指定 PE 函数标记为在硬件中自由运行或者始终执行的内核。如需了解更多信息,请参阅 加速器系统组合