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