高效能與平行計算

屋頂線模型(roofline model)

在你花一週最佳化一個核心之前,你會想要一張一眼看懂的圖,它告訴你「這段程式已快到這台機器不可能讓它再快」、或「還有 10 倍的空間沒拿,而卡住你的是這個」。屋頂線模型正是這張圖:單一張圖畫出一台機器的速度上限,讓你把任何核心丟上去,一眼看出是記憶體頻寬還是原始計算當牆,以及你目前離牆多遠。

圖的橫軸是算術強度(每搬動一位元組的浮點運算數),縱軸是可達效能(每秒浮點運算數),兩軸皆取對數刻度。它顯示兩道天花板。左側一條斜線是頻寬屋頂:效能 = 強度 * 尖峰頻寬,因為低強度核心跑不過記憶體餵資料的速度。右側一條水平線是計算屋頂:機器的尖峰浮點速率,任何核心無論多重用資料都無法超越。兩者相交於脊點,強度 = 尖峰浮點 / 尖峰頻寬。位於脊點左方的核心是記憶體受限、被釘在斜屋頂之下;右方則計算受限、被釘在平屋頂之下。你量到的核心相對其屋頂的位置,同時告訴你你的上限與你的餘裕。

此模型的價值在於把「我該怎麼讓它更快?」化為兩個具體問題。若你的核心在頻寬屋頂之下,提升它的算術強度(分塊、融合迴圈、更好的資料佈局)會把它向右滑向更高的天花板——買更快的 CPU 沒用。若它在計算屋頂之下卻遠低於它,解方是向量化、用融合乘加、或更好的平行化。而若一個核心已碰到它的屋頂,你就完工了——再多巧思也勝不過硬體,繼續追是白費力氣。屋頂線對上限很誠實:它不只告訴你如何更快,也告訴你何時該停。

在一台尖峰計算 1 Tflop/s、頻寬 100 GB/s 的機器上,脊點落在強度 10 flop/byte。強度 0.04 flop/byte 的向量加法遠在左方,被封在 0.04 * 100 = 4 Gflop/s——僅尖峰的 0.4%,再聰明的算術也沒用。良好分塊、強度 20 的矩陣乘法在脊點右方,可逼近完整的 1 Tflop/s。

斜的頻寬屋頂、平的計算屋頂,相交於脊點——你的核心坐在其中之一下方。

基本屋頂線給的是樂觀上界:它假設計算與記憶體完美重疊、快取充分利用。真實核心通常因它沒顯示的原因(延遲停頓、向量化不佳、負載不均)落在屋頂之下,所以「在屋頂之下」診斷出有餘裕,卻不指出確切原因。

又称
rooflineroofline performance model屋頂線效能屋頂線