在多核異構的時代,軟件人員普遍面臨的一個困惑是,面對如此復雜的系統,應該如何部署我們的算法,是應該讓它運行在CPU,GPU還是甚至類似TPU的專門ASIC上才是最佳方案?另外給定特定的計算平臺,我們的算法實現是不是已經榨干硬件平臺的最大能力,還有沒有進一步改善的空間?這些問題尋尋覓覓答案,真像霧里看花,我們渴望有一雙慧眼,幫我們穿透迷津。
在衡量計算效能的正確姿勢我們提到了內存帶寬(memory bandiwidth)和以FLOPS為代表的算力是可以很好的刻畫計算平臺的兩個指標。同時既然是要衡量算法的性能自然我們也要考慮算法的特性。基于此,論文《Roofline: An Insightful Visual Performance Model for Floating-Point Programs and Multicore Architectures》提出了Roofline模型,試圖對硬件和軟件通盤考慮,從而提出改善性能的洞見。
這里我們試著解釋如下,首先我們要介紹運算強度(arithmetic intensity,簡寫成AI)的概念,指的是針對單位內存讀寫數據進行的運算次數,以FLOP/Byte為單位。比如衡量計算效能的正確姿勢(2)介紹過的SAXPY,每次迭代,有三次內存訪問(x讀一次,y讀寫各一次),而有兩次浮點運算(乘加各一次),所以其AI為(2 * N) / (3 * N * 4) = 1/6。
int N = 1 《《 22;
void saxpy(float a, float *x, float *y){
for (int i = 0; i 《 N; ++i)
y[i] = a*x[i] + y[i];
}
引進AI后,算力FLOPS就可以用以下公式來計算。
兩邊取對數,
以logFLOPS為Y,logAI為X,我們可以得到斜截式 Y = X + logBW,另對特定平臺,算力FLOPS存在極限值,據此我們可以作如下圖。
圖中紫色的線條是不是很類似屋脊線,這正是該模型命名的由來。以脊點為界,左邊區域構成內存帶寬瓶頸區域,右邊區域對應算力瓶頸區域。已知某算法的AI,其最大可獲取FLOPS很容易計算得到,見如下公式,為AI所在豎直線與Roofline的交點。如算法Algo1的AI處于內存帶寬受限區域,而算法Algo2的AI則位于算力受限區域,如果Algo1和Algo2為同一問題兩種算法方案,顯然Alg2更有機會獲取滿意的FLOPS。
上面公式代表了理想化的情形,實際操作中,存在各種各樣的天花板(Ceiling)障礙,算法優化的過程就是反復突破這些障礙而盡量接近roofline,最后得到理想的性能。如下圖過程展示,介紹如何通過改善算法的數據局部性以充分利用Cache,并通過向量化而調用SIMD硬件資源來達到這一目的。
除了上面介紹的Roofline模型能夠讓我們在特定平臺“紙上談兵”改善算法性能,Roofline也可以可視化同一算法部署在不同平臺時候性能的比較,結果讓人一目了然。在Google的有關TPU(TPU是Google開發的專門用于神經網絡算法加速的芯片)的論文《In-Datacenter Performance Analysis of a Tensor Processing Unit》里,作者利用Roofline圖表來比較各種神經網絡算法分別部署在同時代CPU、GPU和TPU的性能差異,令人印象深刻。五角星、三角形、圓形分別代表對應算法在TPU、GPU和CPU上運行狀況。
需要指出的是,Roofline模型在實踐中并不像想象般容易,運用的時候有很多細微的地方需要仔細推敲。但它仍不失為非常insightful的尋寶圖,如果你能學會正確解讀,它完全有機會幫我們找到算法性能優化的巨大寶藏。以后我們會有很多場合涉及它的理念和具體用法,敬請期待。
編輯:lyn
-
asic
+關注
關注
34文章
1205瀏覽量
120600 -
cpu
+關注
關注
68文章
10889瀏覽量
212377 -
算法
+關注
關注
23文章
4623瀏覽量
93103
原文標題:Roofline模型初步
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論