簡(jiǎn)談CPU峰值性能怎么計(jì)算[轉(zhuǎn)載]
CPU峰值性能就是CPU運(yùn)算能力滿打滿算最最理想情況下的性能,這只有理論意義,實(shí)際性能要以軟件實(shí)測(cè)為準(zhǔn)。有人問(wèn)寡人峰值性能怎么算,這里就很簡(jiǎn)單地說(shuō)兩句。搞計(jì)算化學(xué)的一般只關(guān)注浮點(diǎn)性能,所以這里只提峰值浮點(diǎn)性能。
峰值浮點(diǎn)性能=CPU核數(shù)CPU頻率每周期執(zhí)行的浮點(diǎn)操作數(shù)
時(shí)下普通的CPU的單精度(SP)浮點(diǎn)性能是雙精度(DP)浮點(diǎn)性能的兩倍。目前常見的幾類CPU內(nèi)核的每周期浮點(diǎn)操作數(shù)以及細(xì)節(jié)如下(引自網(wǎng)絡(luò),見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
時(shí)下搞計(jì)算化學(xué)的人最常用的XEON E3/E5中,v3對(duì)應(yīng)Haswell,v2對(duì)應(yīng)Ivy Bridge,不帶后綴的對(duì)應(yīng)Sandy Bridge。更老的,比如XEON 5500系列對(duì)應(yīng)Nehalem。如果不清楚,建議查閱筆者編纂的《硬件資料庫(kù)》(http://pan.baidu.com/s/1hq7PLeG)
根據(jù)這些資料,可以容易地計(jì)算峰值浮點(diǎn)性能,比如E5-2690 v2,基本頻率為3.0GHz(這里不考慮Turbo boost動(dòng)態(tài)升頻),有10個(gè)核,每個(gè)核每周期可以做8次雙精度浮點(diǎn)運(yùn)算或16次單精度浮點(diǎn)運(yùn)算,因此:
單精度峰值浮點(diǎn)性能=3.01016=480 GFLOPs
雙精度峰值浮點(diǎn)性能=3.0108=240 GFLOPs
這里FLOPs (FLoating-point Operations Per Second)是衡量浮點(diǎn)性能的常用單位,即每秒做的浮點(diǎn)運(yùn)算次數(shù)。1GFLOPs代表每秒十億次浮點(diǎn)運(yùn)算。目前世界頂尖的高性能計(jì)算機(jī)(HPC)的浮點(diǎn)性能都以PFLOPs來(lái)計(jì),1P=1000T=1000000G。
從上面列的數(shù)據(jù)中看似XEON v3 (Haswell)比v2的浮點(diǎn)性能高一倍,這被一些商家用來(lái)忽悠消費(fèi)者。實(shí)際上,同頻同核下,v3比v2性能提升很小。如果v3價(jià)格只比v2貴一點(diǎn),那么可以買v3,但如果貴得很多,切勿被表面上看多一倍的峰值性能所沖昏了頭腦。適當(dāng)了解下不同內(nèi)核以及指令集的特點(diǎn)對(duì)理解這個(gè)問(wèn)題是有益的。為了方便,這里我們只考慮雙精度浮點(diǎn)。
第一代奔騰支持的MMX、奔3開始支持的SSE(最后發(fā)展到SSE4/4A),以及從Sandy Bridge開始支持的AVX等等都是SIMD(單指令多數(shù)據(jù))指令集,它允許一個(gè)指令同時(shí)對(duì)多個(gè)數(shù)據(jù)進(jìn)行處理以達(dá)到很大的吞吐量。Sandy Bridge/Ivy Bridge支持的AVX指令集可以一次處理256bit浮點(diǎn)指令,雙精度浮點(diǎn)數(shù)長(zhǎng)度為64bit,即通過(guò)AVX指令一次可以做四個(gè)雙精度浮點(diǎn)運(yùn)算。如前面給出的信息所示,Sandy Bridge/Ivy Bridge一個(gè)周期可以執(zhí)行一次AVX浮點(diǎn)乘和一次AVX浮點(diǎn)加,也就是說(shuō)一個(gè)周期可以做四個(gè)雙精度浮點(diǎn)加和四個(gè)雙精度浮點(diǎn)乘,故曰每周期可以做8個(gè)雙精度浮點(diǎn)運(yùn)算。這只是理論最大值,實(shí)際上水分很大,因?yàn)榍疤崾潜仨毸幚淼耐耆茿VX 256bit指令,但實(shí)際中是做不到的,能利用上AVX指令集的只是實(shí)際計(jì)算程序中的某些部分而已(這需要編譯器和操作系統(tǒng)的支持。如果寫的時(shí)候?qū)锳VX來(lái)調(diào)整代碼編寫方式可以更好地利用AVX來(lái)達(dá)到更好的性能)。另外,不可能總是恰好要算的是一條加法指令和一條乘法指令,比如傳來(lái)的只有一串浮點(diǎn)加指令,那么乘法運(yùn)算單元就空閑了,浮點(diǎn)性能也就浪費(fèi)了一半。所以,雖然我們從前面列的數(shù)據(jù)中看到Sandy Bridge/Ivy Bridge得益于AVX而比Nehalem每周期能做的浮點(diǎn)運(yùn)算次數(shù)高一倍,但這只是最理想的狀況而已,而且這和實(shí)際表現(xiàn)出來(lái)的性能不是那么的密切。一般應(yīng)用中前者比后者在同頻同核數(shù)情況下性能高近一半,這主要還是因?yàn)镃PU架構(gòu)做了多方面改進(jìn)帶來(lái)的,具體說(shuō)起來(lái)就比較復(fù)雜了,這里就不提了。可以說(shuō),如果所運(yùn)行的程序?qū)VX優(yōu)化較好,Sandy Bridge/Ivy Bridge表現(xiàn)的性能比Nehalem提升得會(huì)更多。
再來(lái)看XEON v3和v2的關(guān)系。Haswell相比Sandy Bridge/Ivy Bridge的一個(gè)主要改進(jìn)是支持了AVX 2.0指令集,相比AVX有了一些改進(jìn),其中很關(guān)鍵的是支持了FMA3指令,這里FMA是Fused Multiply-Add(融合乘加)的縮寫,F(xiàn)MA3是一種具體實(shí)現(xiàn)。原本,做result=a+(bc)需要先做一次乘法再做一次加法,而利用FMA指令可以在一個(gè)周期內(nèi)做完這個(gè)運(yùn)算,所以可以認(rèn)為做一次FMA運(yùn)算等于做兩次常規(guī)浮點(diǎn)運(yùn)算。如前面列出的信息所示,Haswell的每個(gè)內(nèi)核一個(gè)周期可以處理兩個(gè)FMA指令,每條指令包含4個(gè)雙精度浮點(diǎn),一次FMA浮點(diǎn)運(yùn)算又能當(dāng)兩次普通浮點(diǎn)運(yùn)算來(lái)計(jì),因此每個(gè)核每周期內(nèi)滿打滿算可以做24*2=16次雙精度浮點(diǎn)操作。由于支持了FMA,表面上看XEON v3比v2浮點(diǎn)性能高了一倍,但這種說(shuō)法實(shí)際上水分巨大:哪可能要做的總是乘加運(yùn)算?比如傳來(lái)的就是一條AVX浮點(diǎn)乘指令,此時(shí)v3雖然支持FMA卻也派不上用場(chǎng),v3和v2都需要一個(gè)周期來(lái)完成,即表現(xiàn)出的性能相等。所以說(shuō),如果有人說(shuō)v3比v2性能提升一倍那純粹是天方夜譚,除非跑的是專門炫耀Haswell的程序,里面的運(yùn)算全都是乘加。根據(jù)實(shí)際測(cè)試來(lái)看,Haswell跑現(xiàn)有的程序也就比Ivy Bridge性能高不到10%,但這很難說(shuō)是支持FMA的功勞。以后的程序可能會(huì)有一些針對(duì)FMA專門進(jìn)行優(yōu)化,或在編譯時(shí)使用相應(yīng)的優(yōu)化選項(xiàng)(如ifort里用-fma)而使v3有更好的性能,但不要抱太高期待。所以前面提到,買服務(wù)器時(shí)如果v3比v2貴一點(diǎn)可接受,但貴得太多就算了。
再來(lái)說(shuō)說(shuō)為什么如今AMD CPU的浮點(diǎn)性能為什么如此之爛。從推土機(jī)架構(gòu)開始,即前面列的Bulldozer/Piledriver/Steamroller這一類,AMD就用了很糟糕的設(shè)計(jì),兩個(gè)核心作為一個(gè)模塊,共用一個(gè)浮點(diǎn)單元,一個(gè)周期只能處理一次256bit FMA指令,而Haswell一個(gè)核就能同時(shí)處理兩條256bit FMA指令,也就是說(shuō),論峰值浮點(diǎn)性能,現(xiàn)今AMD的U四個(gè)核才頂Haswell一個(gè)核。不過(guò)實(shí)際沒這么夸張,拋開那些很虛的峰值性能數(shù)據(jù),要達(dá)到如今XEON v2或v3的N個(gè)核的實(shí)際性能,同頻情況下,如今的Opteron必須要用>2N個(gè)核。如果程序的并行效率很低,那么Opteron實(shí)際效能簡(jiǎn)直慘不忍睹,不管怎么算都遠(yuǎn)不如XEON劃得來(lái)。所以說(shuō),如今做計(jì)算化學(xué)買AMD的U只有后悔的份。AMD的U的核數(shù)比較坑人,N個(gè)核才有N/2個(gè)浮點(diǎn)單元(想來(lái),當(dāng)年AMD還無(wú)恥地說(shuō)Intel的Pentium D是膠水粘的,有點(diǎn)自己打臉的意味),但是整數(shù)性能還說(shuō)得過(guò)去,整數(shù)單元和核數(shù)是相同的,但搞計(jì)算化學(xué)的人才不稀罕整數(shù)性能呢。
最后再說(shuō)一下GPU。從峰值性能上看,GPU比起CPU弱點(diǎn)在于頻率低,不支持SIMD,但它的浮點(diǎn)性能之所以勝于CPU在于流處理器數(shù)目多。以nVidia的高端的GTX Titan black為例,基礎(chǔ)頻率是0.889GHz,有2880個(gè)單精度浮點(diǎn)單元和960個(gè)雙精度浮點(diǎn)單元,每個(gè)浮點(diǎn)單元每周期能做一次FMA指令,因此
單精度峰值浮點(diǎn)性能:0.88928802=5120GFLOPs
雙精度峰值浮點(diǎn)性能:0.8899602=1707GFLOPs
可見GTX Titan black峰值性能比前面舉的E5-2690 v2的例子高了約一個(gè)數(shù)量級(jí),但這水分太大,顯然不能因?yàn)镕MA就當(dāng)成實(shí)際中有兩倍處理能力,所以公平來(lái)說(shuō)雙精度浮點(diǎn)性能前者是后者4、5倍的樣子。GPU的單精度浮點(diǎn)性能的確很好,性價(jià)比遠(yuǎn)勝于CPU,但一定要注意大多數(shù)消費(fèi)級(jí)GPU的雙精度性能其實(shí)不咋地。GTX Titan black價(jià)格比起同樣流處理數(shù)目的GTX 780Ti貴出一倍,在我來(lái)看貴的主要道理不是因?yàn)樗菬?jí),而是雙精度性能能達(dá)到單精度的1/3,而這個(gè)比例對(duì)于GTX 780Ti僅為1/24!GTX 780Ti的基準(zhǔn)頻率為0.876GHz,單精度性能和GTX Titan black基本無(wú)異,但雙精度峰值性能才區(qū)區(qū)210GFLOPs而已,要不把FMA滿打滿算記入峰值性能計(jì)算公式,那么還明顯不如E5-2690 v2呢。
PS:這篇文章觀點(diǎn)有點(diǎn)意思,大家不妨看看《GPU運(yùn)算即將退潮 CPU浮點(diǎn)性能革命》(http://www.cgan.net/cganself/founder/?p=2681)
轉(zhuǎn)自:http://bbs.keinsci.com/thread-786-1-1.html

浙公網(wǎng)安備 33010602011771號(hào)