1

我经常读到关于管道模式作为利用并发的常见和有用的模式。但是我想知道是否存在与任务并行模式相比并行流水线模式的任何优势。与并行管道相比,并行管道的优势是什么?

假设我们在一个流水线中有三个阶段:A,B,C。当需要处理数据A时,处理它并将它交给B.当下一个数据块进入时,同样的情况发生A和B同时工作。因此,我们可以并行执行不同阶段的流水线,但当我们使用三条流水线并行工作(如任务并行模式)时,我们得到完全相同的图像。当两个数据块一个接一个进入时,第一个块由Pipeline 1占用,下一个块由Pipeline 2占用,两个块同时处理。

此外,我可以很容易地想象并行中的许多问题。流水线:各个阶段之间的缓冲区可能会阻塞(或溢出),一个阶段在处理速度方面占主导地位,所以在最慢阶段之前的所有阶段都必须等待。 ..

这些问题在任务并行模式中不存在。此外,这种模式在块快速到达时比管道的第一阶段可以处理它们更快(或者它们可以同时获取)。

那么我为什么要使用并行流水线模式呢?

在此先感谢您的任何想法!

+1

您不能总是将传入数据拆分为独立的块,例如当一个元素的处理取决于前一个的结果时。单线程的CPU指令以及CPU内核具有并行级流水线的原因就是这种情况。 – Holger

回答

0

管道任务并行肯定2个不同的概念。

  • 管道

    器具生产者 - 消费者模式进程A获取一些数据进程并传递到下一个进程(进程B)。在A处理之前B不能做任何事情。与B和C等相同。进程之间存在依赖关系。

例:参见this

  • 任务并行

只要没有依赖关系。

例:loop-parallels

因此,您不能使用任务并行的相关任务。

3

如果你有一个管道A => B => C并且没有进一步的限制,那确实没用。你可能刚刚使用了一个功能C(B(A(input)))

如果在流水线阶段允许不同程度的并行性,这个概念就会变得更加有用。也许步骤B访问SSD并且最多需要4个并发访问。信号量可以达到同样的效果。

如果A,B和C限于1的并行度,那么管道也有价值:在管道模型中,所有3个节点都可以同时执行。由于假定的并行性限制(或者您需要3个锁,这相当于管道解决方案),因此使用“三条管线”是不可能的。

有时候,你需要在节点之间进行缓冲。也许,A很少会发出B会随着时间的推移处理的高爆发。缓冲有助于保持A正常工作而不会停滞。

有时,它不是一个管道,而是一个分支进出的数据流网络(可能是连接)。

总而言之,我很少发现数据流网络的用例。通常,仅使用数据并行性并使用适当的锁和信号灯会更简单。但这可能是因为我通常工作的领域。YMMV。