脈動陣列(systolic array)
/ sis-TOL-ik /
想像一隊救火的水桶接力:一排人,每個人把水桶傳給下一個,水沿著鏈穩定地流下去,而每個人都站在原地只做一件簡單的事——接過、傳出。沒有人跑回井邊。脈動陣列就是一格依同樣方式接線的微小處理單元:資料像心跳一樣有節奏地從一個單元流向相鄰單元(這正是「脈動/systolic」的意思——與心臟泵血有關),每個單元在資料經過時做一個小運算,從不回頭去碰遙遠的記憶體。
具體來說,對矩陣乘法而言,脈動陣列是一片二維的乘加單元網格。權重事先載入,每個單元一個。然後輸入值從左邊緣灌入,部分和從頂端往下流。每個時脈滴答,每個單元把流經它的值乘上自己存的權重、加上來自上方的部分和,再把輸入往右、把累計和往下傳給鄰居。當這波浪掃過整片網格後,完成的點積便從底部冒出。關鍵在於:每個數字只從記憶體讀一次,然後在它行進時被許多單元重複使用——陣列以極少的記憶體流量擠出龐大的算術量。
為何重要:脈動陣列是 TPU 與許多神經網路加速器內部的引擎,而它的大美德正是這種資料重用。現代晶片裡昂貴的不是算術,而是搬動資料;藉由把每個值在單元間傳遞,脈動陣列在相對很少碰主記憶體的情況下完成數千次乘加。誠實的限制:這份優美的規律性只適合規則、稠密、可預測的計算,例如稠密矩陣乘法。不規則或稀疏的工作無法整齊地流過網格,所以脈動陣列是專家,而非通用電腦。
要相乘兩個 3 乘 3 矩陣,一片 3 乘 3 的脈動陣列先載入其中一個矩陣的九個權重,再把另一個矩陣的各欄從左邊串流灌入。值橫向行進,部分和向下累積,當資料波動穿過後,九個輸出項從底部傾瀉而出——每個輸入數字只被讀一次,卻在它的整條路徑上被使用。
資料像心跳一樣在單元間流動;每個值只讀一次,沿途重複使用——記憶體流量極小。
脈動陣列的強項是稠密、規則、高度重用的資料流;它不適合無法整齊行進於網格的稀疏或不規則計算。它的峰值只有在你能讓波前保持滿載時才算數。