【FPGA开发】什么是Streaming流式传输?流式传输的最主要的设计思想是什么?
什么是 Streaming?
在数字系统,尤其是在硬件加速(如 FPGA)和数据处理领域,Streaming (流式传输) 是一种数据传输和处理模式。它的核心思想是:数据被分解成小的单元或块,并按照一定的顺序连续地从一个处理单元传输到下一个处理单元,而不需要在中间存储完整的、整个数据集。
你可以想象它就像一条流水线:数据像水一样源源不断地流入一端,经过多个处理步骤,然后从另一端流出。每个处理步骤(或称为“阶段”)都在接收到数据的一部分后立即开始工作,而无需等待整个数据集都到达。
它的最主要特点是什么?
Streaming 的最主要特点是:
- 顺序性和连续性 (Sequential and Continuous Flow): 数据按照预定的顺序发送和接收,形成一个连续的数据流。
- 低延迟 (Low Latency): 由于数据无需在中间存储完整的块,第一个数据单元从源到达目的地的时间(即延迟)非常低。
- 高效的流水线处理 (Efficient Pipelining): 这是其核心优势之一。多个处理单元可以被组织成一个流水线。当第一个数据单元进入第一个处理单元时,第二个数据单元可以进入第二个处理单元,以此类推。这使得系统可以在同一时间内处理多个数据单元的不同阶段,从而极大地提高整体吞吐量 (Throughput)。
- 基于握手协议 (Handshake-based Protocol): 流式传输通常依赖于握手信号来控制数据的流动。发送方会发送数据,并等待接收方发出“接收准备好”的信号。如果接收方忙碌,无法接收数据,它会不发出信号或发出“忙碌”信号,发送方就会暂停发送 (Stall),直到接收方准备好为止。这确保了数据不会丢失。
- 减少中间缓冲需求 (Reduced Intermediate Buffering): 相比于需要存储整个数据集或大块数据的通信方式,流式传输可以在处理单元之间直接传递数据,或者只需要很小的 FIFO (First-In, First-Out) 缓冲区来平滑数据流,从而节省了片上存储资源。
“数据不间断吗?”
这个说法需要精确理解。Streaming 的目标是实现尽量“不间断”的高速数据流,从而实现高吞吐量和低延迟。 然而,正如上面提到的,由于采用了握手协议,数据流在硬件层面是可以被暂停 (Stalled) 的。如果下游的处理单元处理速度跟不上上游发送数据的速度,下游会发出一个信号(例如 AXI Stream 中的 TREADY
信号拉低),告诉上游暂停发送。这时,数据流就暂时中断了。一旦下游处理完毕并准备好接收更多数据,它会再次发出信号,上游才会恢复发送。
所以,不是说数据永远不会中断,而是说这种模式下,数据是连续地、按序地尝试流动的,并且通过硬件层面的握手机制来控制流量,以确保数据不丢失,同时尽可能地维持高效率的流动。
与一般通信的异同 (特别是与基于存储器的通信对比)
“像流水一样,后面能接到多少就接到多少水”这个类比非常形象地抓住了流式处理的核心思想:处理是实时的、按需进行的。
Streaming vs. 基于存储器的通信 (Buffered/Block Transfer):
-
一般通信 (很多情况下是基于存储器的块传输):
- 数据通常被组织成较大的块。
- 发送方将整个块数据写入一个共享存储区域(如内存)。
- 接收方需要等待整个块数据写入完成后,再从存储区域读取整个块数据进行处理。
- 特点: 延迟相对较高(需要存取存储器),可能面临存储器带宽瓶颈,不利于精细粒度的流水线处理。它更像是“把一桶水倒进水缸,等水缸满了,另一个人再从水缸里舀走”。这种方式下,“后面能接到多少就接到多少水”是不准确的,因为接收方是等整桶(块)数据都到了才开始舀水的。
-
Streaming (流式传输):
- 数据被分解成小的单元。
- 数据从发送方直接流向接收方,通常只经过很小的片上缓冲区(如 FIFO)。
- 发送方和接收方通过握手信号协调数据流动。
- 特点: 延迟低,非常适合构建高效的流水线,可以实现高吞吐量,减少对外部存储器带宽的依赖。它的工作方式更接近“把水通过水管连接起来,水龙头一开,水就源源不断地流向另一端,中间可能用个小水箱缓冲,但只要下游水龙头能流走,上游就可以一直开着”。
类比“像流水一样,后面能接到多少就接到多少水”在概念上很接近 Streaming 的实时处理思想。但硬件 Streaming 中的握手机制确保了不会有数据因为下游处理不及时而被丢弃。如果下游慢了,上游会被迫暂停,直到下游再次准备好。所以更准确地说,它是“像流水一样,只要后面的管道是通畅的,水就一直流;如果后面的管道堵塞了,前面的水流就会被暂时截断,直到管道畅通”。
总结:
Streaming 是一种高效的数据传输和处理模式,其最主要的特点是数据的顺序性、连续流式处理、低延迟以及通过握手实现的流量控制。它的关键优势在于能够构建高性能的数据处理流水线,显著提高吞吐量,并减少对昂贵的外部存储器访问的需求,这对于FPGA等硬件加速器来说至关重要。它与传统的基于存储器的块传输方式相比,在处理连续数据流时具有明显的性能优势。