串流数据范例 - 2022.1 Chinese

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

Document ID
UG1399
Release Date
2022-06-07
Version
2022.1 简体中文

串流是一种重要的抽象:它表示无限制的连续更新数据集,其中“无限制”表示“大小未知或者大小无限”。串流可以是一连串数据(标量或缓冲器)在源(生产者)进程与目标(使用者)进程之间单向流动。串流范例会强制您根据数据访问模式(或序列)来思考。在软件中,随机存储器对数据的访问几乎是免费的(忽略高速缓存成本),但在硬件中,执行顺序访问实际上是很有利的,此类访问可转换为串流。将算法分解为生产者使用者关系并通过网络串流数据来进行通信具有如下所述几大优势。它允许程序员以顺序方式定义算法,并通过其它方式来提取并行度(例如,通过编译器)。诸如任务间同步等复杂性会被抽离。它允许生产者和使用者任务同时处理数据,这是提升吞吐量的关键。另一个优势是代码更清洁且更简单。

如前文所述,对于生产者和使用者范例,数据传输模式与 FIFO 或 PIPO 缓冲器实现之间存在强映射关系。FIFO 缓冲器只是预定义大小/深度的队列,其中插入队列的首个元素也会成为可从队列跳出的首个元素。使用 FIFO 缓冲器的主要优势在于,只要生产者将数据插入缓冲器,使用者进程就可以立即在 FIFO 缓冲器内部开始访问数据。使用 FIFO 缓冲器的唯一问题在于,由于生产者与使用者之间的生产/使用速率不同,可能导致 FIFO 缓冲器大小错误,从而导致死锁。在具有多个生产者和使用者的设计中,这种情况较为常见。乒乓缓冲器属于用于加速进程的双缓冲器,可将 I/O 操作与数据处理操作重叠。其中一个缓冲器用于保存数据块,以便使用者进程能够看到完整(旧)版本的数据,而另一个缓冲器中,生产者进程则正在创建新(部分)版本的数据。当新的数据块完成并有效时,使用者和生产者进程将交换对两个缓冲器的访问。由此导致,使用乒乓缓冲器会增加器件的整体吞吐量,并帮助防止出现最终瓶颈。PIPO 的主要优势在于,工具能够将生产速率与使用速率自动匹配,并创建高性能且无死锁的通信通道。此处值得注意的是,无论使用的是 FIFO 还是 PIPO,关键特性是相同的:生产者将数据块发送或者串流至使用者。数据块可以是单个值,也可以是一组 N 个值。块越大,所需存储器资源越多。

以下是简单的求和应用,用于展示经典的串流网络/数据流网络。在此例中,该应用的目标是成对添加随机数值串流,然后打印这些数值。前两个任务(任务 1 和 2)提供了随机数值串流以供添加。这些数值通过 FIFO 通道发送到求和任务(任务 3),任务 3 会从 FIFO 通道读取值。随后,求和任务将输出发送到打印任务(任务 4),以发布结果。FIFO 通道可在这些独立的执行线程之间提供异步缓冲。

图 1. 串流网络/数据流网络

连接每项“任务”的串流通常是作为 FIFO 队列来实现的。FIFO 能够抽离程序员的并行行为,使其专注于推理任务活动(调度)的“快照”时间。FIFO 能够使并行化更易于实现。这主要得益于它减少了程序员实现并行化框架或容错解决方案时,必须应付的可变空间。独立内核之间的 FIFO 展现出经典的排队行为。对于纯串流系统,可使用排队或网络流模型来对此行为进行建模。这种数据流类型网络和串流最优化的另一个主要优势在于它可按不同粒度级别来应用。程序员可以在每项任务内部设计此类网络,也可以为任务或内核系统设计此类网络。实际上,您可以通过串流网络来以分层方式例化并连接多个串流网络或任务。支持更细粒度的并行化的另一项最优化措施是流水打拍