当前位置: 首页 > 工具软件 > pipeline > 使用案例 >

pipeline是什么?

胡彭亮
2023-12-01

pipeline,中文意为管线,意义等同于流水线(多条流水线提高效率)

最典型的就是Gpu渲染管线,它指明渲染一个画面需要经过多少道工序。还有就是应用于爬虫框架里面。它就是指某个项目或者框架里面需要用到流水线的设计来简化设计,降低复杂度并提高性能。是一种设计方法,是我们将现实中的社会分工借鉴并运用到计算机编程的例子。

类似的还有分层思想,设计模式。这些东西本身是没有专门的学科和书籍去讲解的,多数得靠个人理解与运用。还有些设计模式比较通用,能达成共识,因此就诞生了设计模式(这里是特指)

比如pipeline,比如分层思想,比如设计模式,这是编程中最具魅力的地方,能让你有一种居高临下,指点江山的感觉。一个框架如果使用了好的设计模式,好的分层会使得学习与使用的成本都会降低。许多编程新手都忘记或者忽视这方面的经验积累,这就可能导致写不出代码,写不出好代码。

以下翻译自维基百科

在计算中,管道(也称为数据管道)是一组串联连接的数据处理元素,其中一个元素的输出是下一个元素的输入。流水线的元素通常以并行按时间分割的方式执行。通常在元素之间插入一定数量的缓冲区存储。

与计算机有关的管道包括:

指令流水线,例如经典的RISC流水线,用在中央处理器(CPU)和其他微处理器中,以允许在同一电路中重叠执行多个指令电路通常分为几个阶段,每个阶段一次处理一条指令的特定部分,将部分结果传递给下一级。阶段的示例是指令解码,算术/逻辑和寄存器提取。它们与超标量执行,操作数转发,推测执行和无序执行的技术有关。

在大多数图形处理单元(GPU)中都存在的图形管线,由多个算术单元或完整的CPU组成,这些管线执行常见渲染操作的各个阶段(透视投影,窗口裁剪,颜色和光照计算,渲染等)。 。

软件管道由概念上并行执行一系列计算过程(命令,程序运行,任务,线程,过程等)组成,一个过程的输出流自动作为下一个过程的输入流。 Unix系统调用管道是此概念的经典示例。

HTTP管道传输,一种通过同一TCP连接发出多个HTTP请求的技术,而无需等待上一个请求完成才发出新的请求。

某些操作系统(需要示例)可能提供类似于UNIX的语法,以字符串形式在管道中运行多个程序,但将后者作为简单的串行执行而非真正的流水线实现-即,通过在启动下一个程序之前等待每个程序完成。[需要引用]

概念和动机

流水线是日常生活中常用的概念。例如,在汽车制造厂的装配线中,每项特定任务(例如安装发动机,安装引擎盖和安装车轮)通常都是由单独的工作站完成的。这些站并行执行任务,每个任务都在不同的汽车上。汽车执行完一项任务后,便移至下一个站点。可以通过“缓冲”(在站点之间的空间中保持一辆或多辆汽车)和/或通过“陈旧”(暂时停止上游站点)来适应完成任务所需时间的变化,直到下一个站点可用为止。

假设组装一辆汽车需要三项任务,分别花费20、10和15分钟。然后,如果所有三个任务都由一个工作站执行,则工厂将每45分钟输出一辆汽车。通过使用三个站点的管道,工厂将在45分钟内输出第一辆汽车,然后每20分钟输出一辆新汽车。

如该示例所示,流水线操作不会减少等待时间,也就是减少一项通过整个系统的总时间。但是,它的确提高了系统的吞吐量,即在第一个项目之后处理新项目的速度。

设计注意事项

平衡阶段

由于管线的吞吐量不能比最慢的管线更好,因此设计人员应尝试在阶段之间分配工作和资源,以便它们全部花费相同的时间来完成任务。在上面的汽车装配示例中,如果三个任务分别花费15分钟而不是20、10和15分钟,则延迟仍将是45分钟,但是新汽车将每15分钟而不是20分钟完成一次。

正在缓冲

在理想情况下,如果所有处理元素都已同步并且花费相同的时间进行处理,则每个元素可以在单个时钟周期内接收到每个元素,就像前一个元素释放它一样。这样,物品将以恒定的速度流过管道,就像水道中的波浪一样。在这样的“波浪流水线” 中,除了数据项所需的存储之外,各阶段之间不需要同步或缓冲。

更一般地,当处理时间不规则,或者沿着管道创建或破坏项目时,在管道阶段之间需要缓冲。例如,在处理要在屏幕上渲染的三角形的图形流水线中,检查每个三角形可见性的元素可以在不可见的情况下丢弃该三角形,或者在部分三角形的情况下可以输出两个或更多三角形的元素隐。还需要缓冲以适应应用程序将项目馈送到第一阶段并消耗最后一个阶段的输出的速率的不规则性。

两级之间的缓冲区可以只是硬件寄存器,在两级之间具有合适的同步和信令逻辑。当阶段A将数据项存储在寄存器中时,它将“数据可用”信号发送到下一个阶段B。一旦B使用了该数据,它将以“已接收数据”信号响应给A。阶段A暂停,等待对于该信号,在将下一个数据项存储到寄存器之前。如果准备处理下一个项目,但阶段A尚未提供,则阶段B暂停,等待“可用数据”信号。

如果一个元素的处理时间是可变的,则整个管道通常可能不得不停止,等待该元素和所有先前的元素消耗其输入缓冲区中的项目。通过为该阶段的输入缓冲区中的多个项提供空间,可以减少此类管线停顿的频率。这种多项目缓冲区通常实现为先进先出队列。当队列已满时,仍可能必须停止上游阶段,但是随着提供更多的缓冲区,这些事件的频率将降低。排队理论可以根据处理时间的变化和所需的性能来判断所需的缓冲区数量。

非线性管道

如果某个阶段花费的时间(或可能花费的时间)比其他阶段长得多,并且无法加快速度,则设计人员可以提供两个或多个处理元素,以一个输入缓冲区和一个输出缓冲区并行执行该任务。每个元素完成对当前数据项的处理后,将其传送到公共输出缓冲区,并从公共输入缓冲区中获取下一个数据项。这种“非线性”或“动态”流水线的概念以具有两个或多个收银员为单个等待队列中的客户服务的商店或银行为例。

项目之间的依赖关系

在某些应用中,阶段A对项目Y的处理可能取决于流水线的某些后期B对先前项目X进行处理的结果或效果。在这种情况下,阶段A无法正确处理项目Y,直到项目X已清除阶段B。

这种情况经常在指令流水线中发生。例如,假设Y是一个算术指令,它读取应该由较早的指令X修改过的寄存器的内容。令A为获取指令操作数的阶段,而B为写入结果的阶段。到指定的寄存器。如果阶段A试图在指令X到达阶段B之前处理指令Y,则寄存器可能仍包含旧值,并且Y的作用将不正确。

为了正确处理此类冲突,必须为管道提供额外的电路或逻辑,以检测它们并采取适当的措施。这样做的策略包括:

拖延:暂停所有受影响的阶段,例如A,直到解决依赖关系为止,即直到获得所需的信息和/或达到所需的状态为止。

重新排序项目:阶段A可以将项目Y放在一边,而不是停滞不前,并在其输入流中查找与任何较早项目无关的任何后续项目Z在指令流水线中,此技术称为乱序执行(打破原有顺序)

猜测和回溯:项到项相关性的一个重要示例是指令流水线对条件分支指令X的处理。流水线的第一级A提取下一条要执行的指令Y,直到X提取其操作数并确定是否要转移分支后,才能执行其任务。这可能需要很多时钟周期,因为X的操作数可能又取决于先前从主存储器中获取数据的指令。

阶段A可以猜测分支是否将被采用,而不是在等待X完成之前停止,并根据该猜测来获取下一条指令Y。如果后来发现猜测不正确(希望很少),则系统将不得不回溯并以正确的选择继续。即,必须撤消阶段A和基于该猜测的后续阶段对机器状态所做的所有更改,必须清除流水线中已经存在的X之后的指令,并且阶段A必须重新启动正确的指令指针。这种分支预测策略是推测执行的一种特殊情况。

成本与弊端

与每次执行一批处理的系统相比,流水线系统通常需要更多的资源(电路元件,处理单元,计算机内存等),这是因为流水线系统的各个阶段无法共享这些资源,并且在流水线系统之间可能需要缓冲和其他同步逻辑。元素。

此外,项目在单独的处理元件之间的转移可能会增加等待时间,尤其是对于长管道而言。

如果不同项目的处理之间存在依存关系,尤其是如果使用猜测和回溯策略来处理它们,则流水化处理的额外复杂性成本可能会相当可观。确实,为复杂指令集实施该策略的成本促使了一些激进的提议来简化计算机体系结构,例如RISC和VLIW。编译器还承担了重新安排机器指令的任务,以提高指令流水线的性能

参考:https://www.zhihu.com/question/267436664/answer/324336021

 类似资料: