執行緒與並行模型

任務平行(task parallelism)

想像晚餐尖峰時的一間小餐廳廚房。一位廚師顧烤檯,另一位顧炸檯,第三位負責擺盤與點綴,第四位洗碗。他們不是全都對不同食材做同一件事,而是各做不同的工作,餐點在他們之間流動。任務平行就是把這種分工放進程式裡:你把工作切成各自不同的任務,讓這些不同的任務在不同的執行緒或核心上同時進行。

具體來說,任務平行(任務分解的觀點)是按「功能」而非按「資料」來切分工作。想像一個程式,對每一個進來的視訊畫格,都必須解碼、做臉部偵測、並更新螢幕上的統計數字。你可以把解碼放在執行緒 0、臉部偵測放在執行緒 1、統計放在執行緒 2;它們執行的是真正不同的操作,而且常常沿著一條管線往下傳遞部分結果。資料平行是把一個操作複製到很多資料切片上,任務平行則是把好幾個不同的操作分散到各個核心上。任務之間往往需要協調,因為一個任務的輸出常常就是另一個任務的輸入。

它的極限和資料平行的味道不同。任務平行受限於問題裡到底有多少個真正獨立的任務,如果只有三個不同的階段,三個核心就是上限,第四個核心只能閒置。它也容易出現負載不平衡:如果臉部偵測這個任務比其他的慢很多,整條管線就會以它的步調運轉,較快的執行緒只能等待。實務上大型程式會混用兩種風格,用任務平行把各階段分開,再在某個沉重的階段裡用資料平行把剩下的核心用起來。

一個音樂應用程式可能同時跑三個不同的任務:一個執行緒從磁碟讀取音訊檔,第二個把壓縮資料解碼成聲音取樣,第三個把那些取樣送到喇叭。三個執行緒、三件各不相同的工作,串成一條管線,這就是任務平行。

不同的操作分在不同核心上,切的是工作,不是資料。

任務平行最多只能用到問題裡真正獨立階段那麼多的核心,所以當不同任務很少時擴展性很差。它也會卡在最慢那個階段的速度上。

又称
task decompositionfunctional parallelism任務分解功能平行