FIFO 深度 - 2022.1 简体中文

Versal ACAP AI 引擎编程环境 用户指南 (UG1076)

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

AI 引擎架构将串流数据广泛用于基于 DMA 的 I/O、用于两个 AI 引擎之间的通信以及用于 AI 引擎与可编程逻辑 (PL) 之间的通信。如果数据流 graph 具有再收敛的数据路径,那么这样可能引发资源死锁。如果某一条路径的流水线深度比另一条路径更长,那么生产者内核可能停滞,并由于反压而导致无法将数据推送至较短的路径。与此同时,由于缺乏数据,使用者内核正在等待接收较长的路径上的数据。如果两条数据路径之间的数据生成和使用顺序不同,那么即使两个内核直接连接到两条数据路径,仍可能发生死锁。下图显示了这些路径。

图 1. 含再收敛串流的生产者内核与使用者内核


如果生产者内核正在串流 S1 上尝试推送数据,并遇到反压,而与此同时,使用者内核仍在尝试从串流 S2 读取数据,就会发生死锁。解决此状况的常见方法之一是在源代码中具有反压的路径中创建更多缓冲,方法是在连接上使用 fifo_depth 约束。

p = kernel::create(producer);
c = kernel::create(consumer);
connect<stream> s1(p.out[0], c.in[0]);
connect<stream> s2(p.out[1], c.in[1]);
fifo_depth(s1) = 20;
fifo_depth(s2) = 10;
注释: fifo_depth() 约束仅对串流和窗口类型的内核连接有效。它在级联串流类型的连接上不可用,因为在输入和输出级联串流上各有个深度为 2 且位宽为 384 位的 FIFO,能够在 AI 引擎之间存储最多 4 个值。