資料層級平行(data-level parallelism, DLP)
假設一位老師發給三十個學生同一句一行的指令——「把你的數字加 5」——而他們在同一瞬間全部照做,各自對自己的數字動手。指令對每個人都一樣,只有資料不同。這幅畫面就是資料層級平行(data-level parallelism):把一個運算一次套用到一整堆資料元素上,而不是一個一個迴圈處理。這跟並排跑三十個不同的程式是不同口味的平行。
在電腦裡,只要程式對一大片規律的數字陣列做相同的算術,資料層級平行就會出現。把影像調亮,就是對數百萬個像素加上同一個值。混合兩條音軌,就是把兩個長陣列裡對應的取樣相加。矩陣相乘、在格點上模擬物理、訓練神經網路,全都歸結為對巨大整齊的陣列做乘加。一般的 CPU 會寫一個迴圈,每次迭代處理一個元素;資料平行的機器則用一條指令處理許多元素,因為對元素 i 的工作從不依賴對元素 j 的工作。
資料層級平行是一個著名分類的一個分支。Flynn 分類把「對許多資料項跑單一指令流」的機器稱為 SIMD(單指令多資料)。另一大分支「執行緒層級平行」則跑許多獨立的指令流(每個核心一條),那是多核心晶片所利用的。兩者都真實存在,現代系統兩者都用——但它們要的程式不同。DLP 在規律、可預測、彼此獨立的逐元素工作上發光,是 SIMD 指令、向量處理器與 GPU 底下的基礎;可是一旦工作變得不規則,或每個元素的結果依賴鄰居的結果,它就會慘跌。
把照片調亮:對一百萬個像素,每個加 20。純量迴圈把加法跑一百萬次。一個每個暫存器裝 8 個像素的資料平行單元,把同一個加法跑 12.5 萬次,每次處理 8 個像素——同樣的結果卻少了大約 8 倍的指令,因為沒有任何像素的亮度依賴另一個像素。
逐元素且彼此獨立的工作正是資料層級平行的甜蜜點:一條指令,許多元素。
資料層級平行不是免費升級。若元素 i 的結果餵給元素 i+1(一種相依),或各元素需要不同運算,平行性就崩潰——硬把它套到不規則工作上,往往比樸素迴圈還慢。