簡談CPU峰值性能怎么計算
簡談CPU峰值性能怎么計算
文/Sobereva @北京科音 2015-Feb-13
CPU峰值性能就是CPU運算能力滿打滿算最最理想情況下的性能,這只有理論意義,實際性能要以軟件實測為準。有人問寡人峰值性能怎么算,這里就很簡單地說兩句。搞計算化學的一般只關注浮點性能,所以這里只提峰值浮點性能。
峰值浮點性能=CPU核數*CPU頻率*每周期執行的浮點操作數
時下普通的CPU的單精度(SP)浮點性能是雙精度(DP)浮點性能的兩倍。目前常見的幾類CPU內核的每周期浮點操作數以及細節如下(引自網絡,見http://stackoverflow.com/questions/15655835/flops-per-cycle-for-sandy-bridge-and-haswell-sse2-avx-avx2)
Intel Core 2 and Nehalem:
4 DP FLOPs/cycle: 2-wide SSE2 addition + 2-wide SSE2 multiplication
8 SP FLOPs/cycle: 4-wide SSE addition + 4-wide SSE multiplication
Intel Sandy Bridge/Ivy Bridge:
8 DP FLOPs/cycle: 4-wide AVX addition + 4-wide AVX multiplication
16 SP FLOPs/cycle: 8-wide AVX addition + 8-wide AVX multiplication
Intel Haswell:
16 DP FLOPs/cycle: two 4-wide FMA (fused multiply-add) instructions
32 SP FLOPs/cycle: two 8-wide FMA (fused multiply-add) instructions
AMD K10:
4 DP FLOPs/cycle: 2-wide SSE2 addition + 2-wide SSE2 multiplication
8 SP FLOPs/cycle: 4-wide SSE addition + 4-wide SSE multiplication
AMD Bulldozer/Piledriver/Steamroller, per module (two cores):
8 DP FLOPs/cycle: 4-wide FMA
16 SP FLOPs/cycle: 8-wide FMA
時下搞計算化學的人最常用的XEON E3/E5中,v3對應Haswell,v2對應Ivy Bridge,不帶后綴的對應Sandy Bridge。更老的,比如XEON 5500系列對應Nehalem。如果不清楚,建議查閱筆者編纂的《硬件資料庫》(http://www.shanxitv.org/datasheet.rar)
根據這些資料,可以容易地計算峰值浮點性能,比如E5-2690 v2,基本頻率為3.0GHz(這里不考慮Turbo boost動態升頻),有10個核,每個核每周期可以做8次雙精度浮點運算或16次單精度浮點運算,因此:
單精度峰值浮點性能=3.0*10*16=480 GFLOPs
雙精度峰值浮點性能=3.0*10*8=240 GFLOPs
這里FLOPs (FLoating-point Operations Per Second)是衡量浮點性能的常用單位,即每秒做的浮點運算次數。1GFLOPs代表每秒十億次浮點運算。目前世界頂尖的高性能計算機(HPC)的浮點性能都以PFLOPs來計,1P=1000T=1000000G。
從上面列的數據中看似XEON v3 (Haswell)比v2的浮點性能高一倍,這被一些商家用來忽悠消費者。實際上,同頻同核下,v3比v2性能提升很小。如果v3價格只比v2貴一點,那么可以買v3,但如果貴得很多,切勿被表面上看多一倍的峰值性能所沖昏了頭腦。適當了解下不同內核以及指令集的特點對理解這個問題是有益的。為了方便,這里我們只考慮雙精度浮點。
第一代奔騰支持的MMX、奔3開始支持的SSE(最后發展到SSE4/4A),以及從Sandy Bridge開始支持的AVX等等都是SIMD(單指令多數據)指令集,它允許一個指令同時對多個數據進行處理以達到很大的吞吐量。Sandy Bridge/Ivy Bridge支持的AVX指令集可以一次處理256bit浮點指令,雙精度浮點數長度為64bit,即通過AVX指令一次可以做四個雙精度浮點運算。如前面給出的信息所示,Sandy Bridge/Ivy Bridge一個周期可以執行一次AVX浮點乘和一次AVX浮點加,也就是說一個周期可以做四個雙精度浮點加和四個雙精度浮點乘,故曰每周期可以做8個雙精度浮點運算。這只是理論最大值,實際上水分很大,因為前提是必須所處理的完全是AVX 256bit指令,但實際中是做不到的,能利用上AVX指令集的只是實際計算程序中的某些部分而已(這需要編譯器和操作系統的支持。如果寫的時候專為AVX來調整代碼編寫方式可以更好地利用AVX來達到更好的性能)。另外,不可能總是恰好要算的是一條加法指令和一條乘法指令,比如傳來的只有一串浮點加指令,那么乘法運算單元就空閑了,浮點性能也就浪費了一半。所以,雖然我們從前面列的數據中看到Sandy Bridge/Ivy Bridge得益于AVX而比Nehalem每周期能做的浮點運算次數高一倍,但這只是最理想的狀況而已,而且這和實際表現出來的性能不是那么的密切。一般應用中前者比后者在同頻同核數情況下性能高近一半,這主要還是因為CPU架構做了多方面改進帶來的,具體說起來就比較復雜了,這里就不提了。可以說,如果所運行的程序對AVX優化較好,Sandy Bridge/Ivy Bridge表現的性能比Nehalem提升得會更多。
再來看XEON v3和v2的關系。Haswell相比Sandy Bridge/Ivy Bridge的一個主要改進是支持了AVX 2.0指令集,相比AVX有了一些改進,其中很關鍵的是支持了FMA3指令,這里FMA是Fused Multiply-Add(融合乘加)的縮寫,FMA3是一種具體實現。原本,做result=a+(b*c)需要先做一次乘法再做一次加法,而利用FMA指令可以在一個周期內做完這個運算,所以可以認為做一次FMA運算等于做兩次常規浮點運算。如前面列出的信息所示,Haswell的每個內核一個周期可以處理兩個FMA指令,每條指令包含4個雙精度浮點,一次FMA浮點運算又能當兩次普通浮點運算來計,因此每個核每周期內滿打滿算可以做2*4*2=16次雙精度浮點操作。由于支持了FMA,表面上看XEON v3比v2浮點性能高了一倍,但這種說法實際上水分巨大:哪可能要做的總是乘加運算?比如傳來的就是一條AVX浮點乘指令,此時v3雖然支持FMA卻也派不上用場,v3和v2都需要一個周期來完成,即表現出的性能相等。所以說,如果有人說v3比v2性能提升一倍那純粹是天方夜譚,除非跑的是專門炫耀Haswell的程序,里面的運算全都是乘加。根據實際測試來看,Haswell跑現有的程序也就比Ivy Bridge性能高不到10%,但這很難說是支持FMA的功勞。以后的程序可能會有一些針對FMA專門進行優化,或在編譯時使用相應的優化選項(如ifort里用-fma)而使v3有更好的性能,但不要抱太高期待。所以前面提到,買服務器時如果v3比v2貴一點可接受,但貴得太多就算了。
再來說說為什么如今AMD CPU的浮點性能為什么如此之爛。從推土機架構開始,即前面列的Bulldozer/Piledriver/Steamroller這一類,AMD就用了很糟糕的設計,兩個核心作為一個模塊,共用一個浮點單元,一個周期只能處理一次256bit FMA指令,而Haswell一個核就能同時處理兩條256bit FMA指令,也就是說,論峰值浮點性能,現今AMD的U四個核才頂Haswell一個核。不過實際沒這么夸張,拋開那些很虛的峰值性能數據,要達到如今XEON v2或v3的N個核的實際性能,同頻情況下,如今的Opteron必須要用>2N個核。如果程序的并行效率很低,那么Opteron實際效能簡直慘不忍睹,不管怎么算都遠不如XEON劃得來。所以說,如今做計算化學買AMD的U只有后悔的份。AMD的U的核數比較坑人,N個核才有N/2個浮點單元(想來,當年AMD還無恥地說Intel的Pentium D是膠水粘的,有點自己打臉的意味),但是整數性能還說得過去,整數單元和核數是相同的,但搞計算化學的人才不稀罕整數性能呢。
最后再說一下GPU。從峰值性能上看,GPU比起CPU弱點在于頻率低,不支持SIMD,但它的浮點性能之所以勝于CPU在于流處理器數目多。以nVidia的高端的GTX Titan black為例,基礎頻率是0.889GHz,有2880個單精度浮點單元和960個雙精度浮點單元,每個浮點單元每周期能做一次FMA指令,因此
單精度峰值浮點性能:0.889*2880*2=5120GFLOPs
雙精度峰值浮點性能:0.889*960*2=1707GFLOPs
可見GTX Titan black峰值性能比前面舉的E5-2690 v2的例子高了約一個數量級,但這水分太大,顯然不能因為FMA就當成實際中有兩倍處理能力,所以公平來說雙精度浮點性能前者是后者4、5倍的樣子。GPU的單精度浮點性能的確很好,性價比遠勝于CPU,但一定要注意大多數消費級GPU的雙精度性能其實不咋地。GTX Titan black價格比起同樣流處理數目的GTX 780Ti貴出一倍,在我來看貴的主要道理不是因為它是燒包級,而是雙精度性能能達到單精度的1/3,而這個比例對于GTX 780Ti僅為1/24!GTX 780Ti的基準頻率為0.876GHz,單精度性能和GTX Titan black基本無異,但雙精度峰值性能才區區210GFLOPs而已,要不把FMA滿打滿算記入峰值性能計算公式,那么還明顯不如E5-2690 v2呢。
PS:這篇文章觀點有點意思,大家不妨看看《GPU運算即將退潮 CPU浮點性能革命》(http://www.cgan.net/cganself/founder/?p=2681)