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。