優(yōu)化高性能計算(HPC)的性能
如何能優(yōu)化高性能計算(HPC)的性能?這個問題問的很好。從定性的層面上來說這個問題很容易回答,答案就是更快的處理器,更多容量的內(nèi)存,表現(xiàn)更佳的網(wǎng)絡(luò)和磁盤輸入/輸出子系統(tǒng)。但當(dāng)你要在決定是否購買Linu集群時這樣的回答就不夠準(zhǔn)確了。2007年6月網(wǎng)上技術(shù)交流會上(Webinar)所做的這個議題對于如何提高計算機(jī)性能做了詳盡的論述。在此次議題中我們會使用更多的量化指標(biāo)來做講解。首先要論述的是對術(shù)語的定義來縮小此次議題的范圍。
什么是高性能計算?
高性能計算簡單來說就是在16臺甚至更多的服務(wù)器上完成某些類型的技術(shù)工作負(fù)載。到底這個數(shù)量是需要8臺,12臺還是16臺服務(wù)器這并不重要。在我們的定義下我們假設(shè)每一臺服務(wù)器都在運(yùn)行自己獨(dú)立的操作系統(tǒng),與其關(guān)聯(lián)的輸入/輸出基礎(chǔ)構(gòu)造都是建立在COTS系統(tǒng)之上。簡而言之,我們正在討論的就是Linux高性能計算集群。
一個擁有20000臺服務(wù)器的信息中心要進(jìn)行分子動力學(xué)模擬無疑是毫無問題的,就好比一個小型工程公司在它的機(jī)房里運(yùn)行計算流體動力學(xué)(CFD)模擬。解決工作負(fù)載的唯一限制來自于技術(shù)層面。接下來我們要討論的問題是什么能直接加以應(yīng)用。
量度(Metrics)
時至今日已經(jīng)很少有人再討論有關(guān)Linux高性能計算集群的純性能問題。目前我們碰到的更多是這樣的字眼:性能(Performance), 每瓦特性能(Performance/Watt), 每平方英尺性能(Performance/Square foot)和 性能價格比(Performance/dollar)等,對于上文提及的20000臺服務(wù)器的動力分子簇來說,原因是顯而易見的。運(yùn)行這樣的系統(tǒng)經(jīng)常被服務(wù)器的能量消耗(瓦特)和體積(平方英尺)所局限。這兩個要素都被計入總體擁有成本(TCO)之列。在總體擁有成本(TCO)方面取得更大的經(jīng)濟(jì)效益是大家非常關(guān)注的。
接著上面的論述,此次議題的范圍我們限定在性能方面來幫助大家理解性能能耗,性能密度和總體擁有成本(TCO)在實(shí)踐中的重要性。
性能的定義
在這里我們把性能定義為一種計算率。例如每天完成的工作負(fù)載,每秒鐘浮點(diǎn)運(yùn)算的速度(FLOPs)等等。接下來的討論中我們要思考的是既定工作量的完成時間。這兩者是直接關(guān)聯(lián)的,速度=1/(時間/工作量)。因此性能是根據(jù)運(yùn)行的工作量來進(jìn)行測算的,通過計算其完成時間來轉(zhuǎn)化成所需要的速度。
定量與定性
在上個章節(jié)中我們提到,此次議題是如何對Linux高性能計算集群的性能進(jìn)行量化分析。為此我們接下來要介紹部分量化模型和方法技巧,它們能非常精確的對大家的業(yè)務(wù)決策進(jìn)行指導(dǎo),同時又非常簡單實(shí)用。舉例來說,這些業(yè)務(wù)決策涉及的方面包括:
購買---系統(tǒng)元件選購指南來獲取最佳性能或者最經(jīng)濟(jì)的性能
配置---鑒別系統(tǒng)及應(yīng)用軟件中的瓶頸
計劃---突出性能的關(guān)聯(lián)性和局限性來制定中期商業(yè)計劃
原型Linux集群(Prototypical Linux Cluster)
我們文中的Linux高性能計算集群模型包括四類主要的硬件組成部分。(1)執(zhí)行技術(shù)工作負(fù)載的計算節(jié)點(diǎn)或者服務(wù)器 (2)一個用于集群管理,工作控制等方面的主節(jié)點(diǎn) (3)互相連接的電纜和現(xiàn)在高度普及的千兆以太網(wǎng)(GBE) (4)一些全球存儲系統(tǒng),像由主節(jié)點(diǎn)輸出的NFS文件一樣簡單易用。下面我們通過圖示1來向大家進(jìn)行詳解。
一個簡單量化的運(yùn)用模型
這樣一個量化的運(yùn)用模型非常直觀。在一個集群上對既定的工作完成的時間大約等同于在獨(dú)立的子系統(tǒng)上花費(fèi)的時間:
e
(1)時間(Time)=節(jié)點(diǎn)時間(Tnode)+電纜時間(Tfabric)+存儲時間(Tstorage)
Time = Tnode + Tfabric + Tstorag
這里所說的時間(Time)指的是執(zhí)行工作量的完成時間,節(jié)點(diǎn)時間(Tnode)是指在計算節(jié)點(diǎn)上花費(fèi)的完成時間,電纜時間(Tfabric)是指在互聯(lián)網(wǎng)上各個節(jié)點(diǎn)進(jìn)行互聯(lián)的完成時間,而存儲時間(Tstorage)則是指訪問局域網(wǎng)或全球存儲系統(tǒng)的完成時間。As in the webinar,有關(guān)電纜時間(Tfabric)和存儲時間(Tstorage)的議題我們稍后會為大家陳述。我們先來關(guān)注節(jié)點(diǎn)時間(Tnode)這個關(guān)鍵詞。計算節(jié)點(diǎn)的完成時間大約等同于在獨(dú)立的子系統(tǒng)上花費(fèi)的時間: #p#page_title#e#
(2)節(jié)點(diǎn)時間(Tnode)=內(nèi)核時間(Tcore) +內(nèi)存時間(Tmemory)
這里所說的內(nèi)核時間(Tcore)指的是在微處理器計算節(jié)點(diǎn)上的完成時間。而內(nèi)存時間(Tmemory)就是指訪問主存儲器的完成時間。這個模型對于單個的CPU計算節(jié)點(diǎn)來說是非常實(shí)用的,而且能很容易的擴(kuò)展到通用雙插槽(SMP對稱多處理)計算節(jié)點(diǎn)。為了使第二套模型更加實(shí)用,子系統(tǒng)的完成時間也必須和計算節(jié)點(diǎn)的物理配置參數(shù)相關(guān)聯(lián),例如處理器的速度,內(nèi)存的速度等等。
計算節(jié)點(diǎn)
下面讓我們來一起關(guān)注圖示2中的計算節(jié)點(diǎn)原型來認(rèn)識相關(guān)的配置參數(shù)。圖示上端的是2個處理器插槽,通過前端總線(FSB-front side bus)與內(nèi)存控制中心(MCH)相連。這個內(nèi)存控制中心(MCH)有四個存儲信道。同時還有一個Infiniband HCA通過信道點(diǎn)對點(diǎn)串行(PCIe)連接在一起。
象千兆以太網(wǎng)和串行接口(SATA)硬盤之類的低速的輸入輸出系統(tǒng)都是通過芯片組中的南橋通道(South Bridge)相連接的。在圖示2中,大家可以看到每個主要部件旁邊都用紅色標(biāo)注了一個性能相關(guān)參數(shù)。這些參數(shù)詳細(xì)的說明了影響性能(并非全部)的硬件的特性。它們通常也和硬件的成本直接相關(guān)。舉例來說,,處理器時鐘頻率(fcore)在多數(shù)工作負(fù)荷狀態(tài)下對性能影響巨大。根據(jù)供求交叉半導(dǎo)體產(chǎn)額曲線原理,處理器速度越快,相應(yīng)成本也會更高。高速緩存存儲器的體積也會對性能產(chǎn)生影響,它能減少主頻所承載的工作負(fù)荷以提高其運(yùn)算速度。處理器內(nèi)核的數(shù)量(Ncores)同樣會影響性能和成本。內(nèi)存子系統(tǒng)的速度可以根據(jù)雙列直插內(nèi)存模塊頻率(fDIMM)和總線頻率(fBus)進(jìn)行參數(shù)化,它在工作負(fù)荷狀態(tài)下也對性能產(chǎn)生影響。同樣,電纜相互連接(interconnect fabric)的速度取決于信道點(diǎn)對點(diǎn)串行的頻率。而其他一些因素,比如雙列直插內(nèi)存模塊內(nèi)存延遲(DIMM CAS Latency),存儲信道的數(shù)量等都做為次要因素暫時忽略不計。
我們能使用的性能參數(shù)
在圖示2中標(biāo)明的6個性能參數(shù)中,我們保留四個和模型相關(guān)的參數(shù)。首先讓我們先忽略信道點(diǎn)對點(diǎn)串行的頻率(fPCIe),因?yàn)樗饕绊懙氖请娎|相互連接(interconnect fabric)速度的性能,這不在我們此次議題討論范圍之列。接下來讓我們注意一下雙列直插內(nèi)存模塊頻率(fDIMM)和總線頻率(fBus)會由于內(nèi)存控制中心(MCH)而限于固定比率。在目前使用的雙核系統(tǒng)中,這些比率最具代表性的是4:5, 1:1, 5:4。我們一般情況下只會用到其中的一個。高速緩存存儲器的體積非常重要。在這個模型中我們保留這個參數(shù)。內(nèi)核的數(shù)量(Ncores)和內(nèi)核頻率(fcore)也非常重要,保留這兩個參數(shù)。
高性能計算(HPC)模型
接下來的章節(jié)我們講解的是數(shù)學(xué)運(yùn)用模型。這但對于數(shù)學(xué)運(yùn)算是個挑戰(zhàn),讓我們一起來關(guān)注這個模型。
這第二個模型的基本形式在計算機(jī)體系研究領(lǐng)域已經(jīng)存在了很多年。A普通模式是:
(3) CPI = CPI0 + MPI * PPM
這里的CPI指的是處理器在工作負(fù)荷狀態(tài)下每執(zhí)行一個指令的周期。CPI0是指內(nèi)核CPI,MPI I則是指在工作負(fù)荷狀態(tài)下高速緩存存儲器每個指令失誤的次數(shù)(注釋:在高性能計算領(lǐng)域,MPI主要用于信息傳遞界面,在此處主要是指處理器構(gòu)造慣例),PPM是指以處理器時鐘滴答聲為單位對高速緩存存儲器每個指令失誤的次數(shù)的記錄。第二和第三個方程式相互吻合。這第一個術(shù)語代表的是處理器,第二個術(shù)語代表的是內(nèi)存。
通過圖示我們可以直觀的看到,假設(shè)每項(xiàng)工作下執(zhí)行的P指令的工作負(fù)荷與代表處理器的頻率的內(nèi)核頻率(每秒鐘處理器運(yùn)行周期的單位)再與方程式(3)相乘,就得到了方程式(4):
Tnode = (CPIo * P) * (1 / fcore) + (MPI * P) * PPM * (1 / fcore)
在這里我們要注意(CPIo * P)是以每項(xiàng)工作分配下處理器的運(yùn)行周期為單位,對微處理器架構(gòu)上運(yùn)行的既定工作負(fù)荷通常是個恒量。因此我們把它命名為α。(處理器周期本身無法對時間進(jìn)行測算,如果乘以內(nèi)核的頻率就可以得到時間的測算標(biāo)準(zhǔn)。因此Tnode在方程式(4)的右邊)。 #p#page_title#e#
(MPI * P)也是同理。對于既定工作負(fù)荷和體系結(jié)構(gòu)來說它也是個恒量,但它主要依賴于高速緩存存儲器的體積。我們把它命名為M(MBcache)。而PPM是指訪問主存的成本。對于既定的工作負(fù)荷來說,通常是個固定的數(shù)字C。PPM乘以內(nèi)存頻率和總線頻率的比值(fcore / fBus)就從總線周期(bus cycles)轉(zhuǎn)化成了處理器周期。因此PM = C * fcore / fBus。套入M(MBcache)就可以得到:
(5) Tnode = α * (1 / fcore) + M(MBcache) * (1 / fbus)
這個例子說明總線頻率(bus frequency)也是個恒量,方程式(5)可以簡化為方程式(6):
(6) Tnode = α * (1 / fcore) + β
在這里Tcore = α * (1 / fcore),而Tmemory = β(也就是公式2里的術(shù)語。我們把這些關(guān)鍵點(diǎn)關(guān)聯(lián)在一起)。首先在模型2里,公式5和公式6都有堅(jiān)實(shí)的理論基礎(chǔ),因?yàn)槲覀円呀?jīng)分析過它是如何從公式3推理而來(它主要應(yīng)用于計算機(jī)體系理論)。其次,目前的這個模型4個硬件性能參數(shù)的3個已經(jīng)包括其中。還差一個參數(shù)就是內(nèi)核數(shù)量(Ncores)。
我們用直觀的方式來說明內(nèi)核的數(shù)量,就是假設(shè)把N個內(nèi)核看做是一個網(wǎng)絡(luò)頻率上運(yùn)行的一個內(nèi)核,我們稱之為N*fcore。那么根據(jù)公式(6)我們大致可以推算出:
(7) Tcore ~ α / (N*fcore)
Tcore~ ( α / N) * (1 / fcore )
我們也可以把它寫成:
(8) αN = ( α / N)
多核處理器的第一個字母Alpha可能是單核處理器的1/N次。
通過數(shù)學(xué)推算這幾乎是完全可能的。
通常情況下我們是根據(jù)系統(tǒng)內(nèi)核和總線頻率(bus frequencies)來衡量計算機(jī)系統(tǒng)性能,如公式(5)所闡述的。但是公式(5)的左邊是時間單位--這個時間單位指的是一項(xiàng)工作量的完成時間。這樣就能更清楚的以時間為單位說明右側(cè)的主系統(tǒng)參數(shù)。同時請注意內(nèi)核的時鐘周期τcore(是指每次內(nèi)核運(yùn)行周期所需的時間)也等同于(1 / fcore)??偩€時鐘(bus clock)周期也是同理。
(9) Tnode = αN * τcore + M(MBcache) * τBus
這個公式的轉(zhuǎn)化也給了我們一個完成時間的模型,那就是2個基本的自變量τcore和τBus呈現(xiàn)出直線性變化。這對我們稍后使用一個簡單的棋盤式對照表對真實(shí)系統(tǒng)數(shù)據(jù)進(jìn)行分析是有幫助的。
這個模型是如何工作的?
公式(9)中的這個模型好處何在呢?為了回答這個問題,首先讓我們一起來分析兩項(xiàng)常用的基準(zhǔn)測試指標(biāo),Linpack(注釋:指標(biāo)為實(shí)數(shù),指HPC采用高斯消元法求解一元N次稠密線性代數(shù)方程組的每秒處理次數(shù))和Stream(注釋:對單環(huán)境和多重負(fù)荷時的內(nèi)存性能進(jìn)行測評的基準(zhǔn))。我們通常會對他們進(jìn)行綜合的考量,這兩者主要適用于商業(yè)領(lǐng)域。舉例來說,Linpack基準(zhǔn)測試運(yùn)用的是邊界元素方法,主要適用于模擬飛機(jī)雷達(dá)橫截面或者模擬潛艇聲學(xué)回音。Stream基準(zhǔn)測試的核心則運(yùn)用于高性能計算應(yīng)用編碼的方方面面。他們代表了矢量或者Level 1 BLAS。這兩項(xiàng)基準(zhǔn)測試指標(biāo)都非常的有用因?yàn)樗麄儚牟煌嵌却砹烁咝阅苡嬎愎ぷ髁款l譜的兩個極端。Linpack測試的是內(nèi)核的計算范圍,而Stream主要針對的是內(nèi)存訪問。這兩項(xiàng)工作是對完成時間模型(1)一個很好的初始測試。
Linpack測試:內(nèi)核范圍的工作負(fù)載
圖示3向我們展示的是使用了三個不同的多核CPU(以英特爾S3000PT服務(wù)器為基礎(chǔ))的Linpack完成時間以及使用一個單獨(dú)的CPU系統(tǒng)τcore的結(jié)構(gòu)圖。第一臺CPU是英特爾公司的PentiumD(Netburst microarchitecture)雙核運(yùn)行多種頻率可達(dá)到3.2 GHz。對于這項(xiàng)工作負(fù)載Linpack完成時間數(shù)據(jù)點(diǎn)用黃色三角標(biāo)注。數(shù)據(jù)點(diǎn)連成的直線用黃色虛線表示。
第二臺CPU是英特爾公司的酷睿雙核處理器Core 2 Duo (Conroe)運(yùn)行四組頻率達(dá)到2.66 GHz。這個CPU的數(shù)據(jù)點(diǎn)和連成的直線用藍(lán)色標(biāo)注。第三臺CPU是英特爾公司的酷睿四核處理器Core 2 Quad(Kentsfield)運(yùn)行兩組頻率達(dá)到2.4 GHz。它的數(shù)據(jù)點(diǎn)和連成的直線用紅色標(biāo)注??偩€頻率(bus frequency)在266 MHz頻率下保持恒量。結(jié)合方程式(1)和線性圖可以清楚的看到β或者M(jìn)(MBcache) * (1/ fBus )都為零。 #p#page_title#e#
假設(shè)Linpack能完全脫離高速緩存存儲器運(yùn)行而且?guī)缀醪辉傩枰L問主存儲器,那就能符合用戶的需求。我們希望Tmemory或者β也能為零,這一點(diǎn)通過線性圖已經(jīng)可以確認(rèn)。在這個方面模型看起來是不錯的。接下來我們來分析每個數(shù)據(jù)點(diǎn)的變化情況。舉例來說,酷睿雙核處理器Core2 Duo的四個數(shù)據(jù)點(diǎn)連接成一條幾乎完全精確的直線。在這些數(shù)據(jù)點(diǎn)的范圍內(nèi),我們可以推斷系統(tǒng)真實(shí)的物理性能運(yùn)算與τcore成線性關(guān)系。由此我們也可以斷定這個模型一個重要的方面--那就是τcore內(nèi)的物理性能運(yùn)算成直線型。
Stream測試:總線范圍的工作負(fù)載
現(xiàn)在我們來關(guān)注一下這個線程的傾斜度。從方程式(9)我們知道了傾斜度與αN的值相吻合。由此我們可以推斷αN = α / N 。那就是說多核并行的工作負(fù)載完成時間傾斜度與單核相比是在同等工作負(fù)載下完成時間傾斜度的1/N次。從酷睿雙核處理器Core 2 Duo的直線分析,我們會發(fā)現(xiàn)斜面值為0.154,而C酷睿四核處理器ore 2 Quad的直線斜面值為0.0806。這是個1.91x和期望的2x的標(biāo)準(zhǔn)比。誤差率大概在5%,這對于實(shí)際應(yīng)用來說已經(jīng)足夠好了。
把Pentium D和酷睿雙核處理器 Core 2 Duo的傾斜度進(jìn)行對比,我們可以看到alpha (α)的另外一面。這兩個處理器都是雙核的,但是酷睿四核處理器Core 2 Duo每個時鐘周期能執(zhí)行4個SSE2指令而Pentium D只能執(zhí)行兩個。Linpack的工作負(fù)載能夠利用SSE2指令集的完成時間單位。因此我們希望Pentium D的斜面值應(yīng)該是2x酷睿雙核處理器Core 2 Duo的斜面值。
圖示4展示的是在酷睿雙核處理器Core 2 Duo平臺系統(tǒng)上執(zhí)行工作負(fù)載的Linpack和Stream結(jié)構(gòu)圖。象圖示3一樣,Linpack線性圖有一個接近于零的測試值傾斜度比較大。Stream的線性圖則正好相反。它的值相對較大,傾斜度卻非常小。這種計算行為適用于總線范圍內(nèi)的工作負(fù)載。處理器的速度對于Stream工作負(fù)載的完成時間影響非常小。
總線(bus)的頻率(類似于MCH的速度和DIMM的速度)對Stream性能測試會有什么影響呢?從圖示5我們可以看到前端總線頻率(fBus)變化情況的影響。這些數(shù)據(jù)來自于使用酷睿雙核處理器Core 2 Duo的ASUS P5B系統(tǒng)??偩€頻率(fBus)和內(nèi)核頻率(fcore)的比值固定在7上就簡單了許多??偩€頻率(fBus)和雙列直插內(nèi)存模塊頻率(fDIMM)兩項(xiàng)不同的比值分別為1:1和4:5。
圖示5中的線性圖說明了內(nèi)存時間(Tmemory)的變化情況是和總線(bus)時鐘周期τBus成正比的。我們能看到這張圖示上有兩處截然不同的數(shù)據(jù)點(diǎn)。這些點(diǎn)和1:1 的總線頻率(fBus)比值相吻合而雙列直插內(nèi)存模塊頻率(fDIMM)比值是4:5。
更為復(fù)雜的工作負(fù)載:SPEC_CPU2000
讓我們來關(guān)注一下更為復(fù)雜的工作負(fù)載,完成時間的性能計算在初始參數(shù)上仍然是直線。由此可以看出內(nèi)存時間(Tmemory)還需要較大的高速緩存存儲器進(jìn)行緩沖存儲。這個分析讓我們意識到M(MBcache)的重要性。SPEC CPU2000 benchmark suite無疑是個不錯的選擇。這一點(diǎn)已經(jīng)為大家所熟知。在這張圖示上我們將基線編譯器標(biāo)記(-O2)與每一項(xiàng)工作負(fù)載相結(jié)合。復(fù)合工作負(fù)載的完成時間剛好是單個組件工作負(fù)載的完成時間(約等于25)。
為了測試高速緩存存儲器體積對性能的影響程度,我們用"Gallatin"處理器系統(tǒng)來作為測試平臺。這個處理器是單核Netburst體系機(jī)構(gòu)的CPU,512KB L2和2MB L3高速緩存存儲器。圖示6向我們展示的是在處理器時鐘周期變化時復(fù)合工作負(fù)載的完成時間。
深藍(lán)色的數(shù)據(jù)點(diǎn)和線性圖符合了激活的2MB L3高速緩存存儲器的結(jié)構(gòu)。淡藍(lán)色的數(shù)據(jù)點(diǎn)和線性圖則反映了不起作用的L3高速緩存存儲器的結(jié)構(gòu)情況,非常有效的把高速緩存存儲器的體積精簡到了512KB。這兩個線性圖都是平行線。斜面值是一樣的,幾乎沒什么差別。更有趣的是我們能看到,當(dāng)高速緩存存儲器的體積從512KB變成2MB時,測試值的變化。內(nèi)存訪問和Tmemory完成的時間總計減少了1.75x。這個結(jié)論等同于增大了總線(bus)和內(nèi)存頻率1.75x。對于復(fù)合工作負(fù)載來說,高速緩存存儲器的體積非常重要。 #p#page_title#e#
綜述
現(xiàn)在對我們的分析做一個綜述。在定性的基礎(chǔ)上我們可以輕易的對影響高性能計算性能的因素進(jìn)行羅列,比如更快的處理器,更大容量的內(nèi)存,磁盤,網(wǎng)絡(luò)等等。如果是在量化的基礎(chǔ)上來回答這個問題,答案則有較大的不同。尤其是對于那些預(yù)算有限的用戶而言,這一點(diǎn)是比較重要的。一臺速度更快的處理器會花費(fèi)更多的費(fèi)用嗎?在我的集群上需要PCIExpress Gen2時鐘緩沖器嗎?我應(yīng)該購買更快的內(nèi)存來獲取每個計算節(jié)點(diǎn)上更多的內(nèi)存容量嗎?我如何能為用戶提供更大的計算機(jī)功率(在相同的年度預(yù)算前提下)?
我們試圖向大家闡明使用一個相對簡單的計算節(jié)點(diǎn)運(yùn)用模型就能很好的解釋這些疑問。對于既定的工作量和計算節(jié)點(diǎn),這個模型只需要簡單的工具(那就是電子數(shù)據(jù)表)就能輕易的進(jìn)行驗(yàn)證。使用這個模型還能夠幫助我們解決如何選購,容量規(guī)劃方面的疑問。那么回到我們最初的問題上來"如何優(yōu)化高性能計算的性能?",答案是一切都取決于工作負(fù)載。