手把手建立Roofline模型(CPU)

PcDack發表於2022-03-19

Roofline模型原理

Roofline模型是由加州理工大學伯利克提出的用來建立當前計算平臺在不同的計算強度(Operational Intensity)下能夠達到的理論計算上限 。論文和基礎理論和應用 Roofline Model與深度學習模型的效能分析 。本文旨在教授如何根據當前開發環境機器建立該模型,並簡單的介紹如何根據演算法計算OI(計算強度)。

需要準備的硬體引數

對於CPU而言,我們需要一下引數:

頻率 記憶體頻寬(double) Avx512 Unit Fma
Intel® Xeon® Gold 6148 2.7GHz 39.74GB/s 2 2

其中Avx512、Fma並非是必備引數。

查詢CPU相關指標方法或網站:

計算相關引數:
當前CPU的理論峰值:

\[理論效能峰值 ={頻率*512*AVX數量*FMA \over 32/64} \]

AVX和FMA並不是必要引數,32/64取決於當前處理問題是單精度(32)或者雙精度(64)

由上述公式,我們可以計算出Xeon Gold 6148的計算雙精度理論效能峰值為2.7GHz*2(avx)*2(FMA)/64=86.4Gfplos。

計算當前記憶體頻寬:

通常情況下我們可以通過 wikichip 搜尋到,當然也可以通過 StreamBenchmark 程式獲取。

建立Roofline模型

image

Roofline模型中的相關引數公式如下,並計算Xeon Gold 6148 的引數:

  • \(\pi=理論效能峰值\) ,根據上文內容,我們已經計算出當前CPU的理論效能峰值就是86.4Gflops。
  • \(\beta=理論記憶體頻寬\) ,上一章節有關於理論記憶體頻寬獲取方式,當前CPU的值為39.74Gflops。
  • \(I_{max} = {\pi \over \beta}\) ,顯然易得當前值為2.17。

根據當前演算法計算OI

訪存密集型演算法

void saxpy(double *a,double * b,double* c,int n,int s)
{
    for(int i=0;i<n;++i){
        a[i]=b[i]*s+c[i];
    }
}

分析程式的AI

該程式迴圈內做了一次乘法和一次加法,讀取了三個資料,已知操作的資料都為64位浮點數,那麼 \(OI={2*N \over 8*3*N}={1 \over 12}\)。根據公式 \(FLOPS=OI \times BW(bound witdh)\) 可得當前的演算法的理論峰值為~3.3Gflops。實際測試結果為2.4Gflops,存在可能優化的空間。

運算密集型演算法

最簡單的運算密集型程式為矩陣乘法 。這裡就不具體演算法實現展示。直接分析程式的OI,假設矩陣的的大小為 \(M\) ,矩陣乘需要載入兩次矩陣,並寫入一次矩陣,那麼總的資料載入讀取量為 \(3 \times M \times M\) ,矩陣乘的每個元素需要需要進行 \(M\) 次乘操作和 \(M-1\) 次加操作,因此,計算總量為 \(2*(M-1) \times M^2\) ,當不考慮資料是64位浮點時,可得 \(OI={2*(M-1) \over 3*8}\) 。當矩陣大小大於40時,對於當前CPU輸入計算密集型程式,可達到的理論峰值為86.4Gflops。

優化方式

論文 給出了一些可以優化的方式:

  • 針對訪存密集型程式,可以通過soft perfetch等技術優化。
  • 針對計算密集型程式,可以通過SIMD等技術優化。

image

相關文章