劉闖,何峰,肖兮,董小社,張興軍
(西安交通大學(xué)計算機科學(xué)與技術(shù)系,710049,西安)
通過計算流體力學(xué)程序模擬真實情景是提高流體機械的制造精度和節(jié)約成本的重要手段,計算流體力學(xué)程序具有計算密集、處理數(shù)據(jù)量大的特性,因此常需要大量的計算資源。盡管計算機的計算能力有了飛速的發(fā)展,計算流體力學(xué)程序?qū)τ嬎阈阅艿睦寐嗜匀淮嬖诓怀浞值默F(xiàn)象,導(dǎo)致計算資源的浪費。
目前對于流體計算程序性能提升的研究主要體現(xiàn)在并行化或異構(gòu)加速上[1-3],例如采用多核系統(tǒng)并行處理或采用協(xié)處理器加速計算。超級計算機上部署的大型計算流體力學(xué)程序大多都采用了上面兩種計算方式,但是作為一個重要的影響因素,程序的單核執(zhí)行效率并沒有得到足夠的重視,很多程序的單核性能只能達(dá)到系統(tǒng)理論峰值的5%~10%[4],導(dǎo)致大量的計算資源被浪費,因此對程序單核性能的優(yōu)化應(yīng)引起重視。
針對流體計算程序的優(yōu)化,一些文獻(xiàn)提出了綜述性的優(yōu)化方案和思路[5-7],或針對具體程序進(jìn)行了優(yōu)化[8],但是這種優(yōu)化主要集中于對云計算、網(wǎng)格計算等并行化計算的優(yōu)化,對單核級優(yōu)化的工作不夠深入;針對單核級的程序優(yōu)化的研究中,主要優(yōu)化方案是流水優(yōu)化或訪存優(yōu)化,優(yōu)化步驟一般是首先分析程序特性或測試程序熱點以找到瓶頸,然后通過調(diào)整代碼結(jié)構(gòu)流水性能[9]或調(diào)整數(shù)據(jù)的組織方式優(yōu)化訪存性能[4,10-12];從處理器的角度,賀愛香、Oyarzun等根據(jù)ARM處理器的計算特性對問題提出優(yōu)化方案[13-14],這些研究具有一定的通用價值,但是對于大型計算程序常用的Intel處理器并沒有深入研究;申小偉等通過對編譯器等運行環(huán)境的優(yōu)化來提升程序性能[15],但是這種方法對于跨專業(yè)的程序優(yōu)化人員具有一定的門檻,且在公用的計算環(huán)境中難以部署。根據(jù)上述背景,本文針對軸流壓氣機模擬的流體計算程序,提出一種針對計算流體力學(xué)程序單核的優(yōu)化方法。總體優(yōu)化思路有3個方面:①優(yōu)化指令結(jié)構(gòu),減少由相關(guān)引起的指令流水?dāng)嗔?使程序充分發(fā)揮CPU的計算能力;②調(diào)整存儲結(jié)構(gòu)和訪存結(jié)構(gòu)并進(jìn)行容器優(yōu)化,從而增強存儲和訪存的性能;③減少冗余指令,優(yōu)化底層代碼數(shù)量和結(jié)構(gòu)從而減少程序執(zhí)行所需的時間空間。本文在軸流壓氣機模擬程序上實現(xiàn)優(yōu)化方法,在TIANHE-1A超級計算機和商用服務(wù)器上進(jìn)行測試實驗,實驗結(jié)果表明,本文提出的優(yōu)化方法可以有效地提高程序的緩存命中率、優(yōu)化流水連續(xù)性、減少目標(biāo)代碼數(shù),從而大幅提升程序單核執(zhí)行效率。
本文采用軸流壓氣機模擬程序[16-17]對軸流壓氣機轉(zhuǎn)子進(jìn)行模擬,程序采用有限體積法進(jìn)行空間離散,3步Runge-Kutta法進(jìn)行時間推進(jìn),控制方程組采用笛卡爾坐標(biāo)系下的相對流動控制方程組,形式如下
(1)
湍流模型采用SA湍流模型,為加速收斂程序采用三層網(wǎng)格,通過在不同網(wǎng)格層上輪流迭代從而使不同頻率的誤差分量得到有效地衰減。
程序模擬36葉片壓縮機工作時的流體狀態(tài),采用36個進(jìn)程,每個進(jìn)程對一個葉片進(jìn)行模擬,單葉片網(wǎng)格數(shù)約為42萬,總計約1 535萬。在邊界處理時需進(jìn)行通信,通信采用MPI完成。程序主要開銷是在單個進(jìn)程的計算上,通信等待時間相對整個程序時間占比較少,且優(yōu)化不涉及通信時間的優(yōu)化,因此并行開銷可忽略不計。
考慮程序的緩存命中率對程序的存儲和計算特性進(jìn)行分析。存儲方面,程序中網(wǎng)格的存儲采用STL庫中的Vector容器進(jìn)行存儲,采用該容器的主要原因是Vector容器是順序存儲容器,有較好的隨機存取性能,以及可以利用STL中提供的豐富的操作,功能強大。根據(jù)物理網(wǎng)格模型,容器的維度為四維,存儲維度順序為x、y、z、n,其中x、y、z為空間維度,n為多層網(wǎng)格的層號。
計算方面,程序計算主體的運行時間約占整個運行時間的95%以上,剩余時間做程序流程控制、數(shù)據(jù)的通信與保存等操作,因此程序優(yōu)化的主體在計算部分。在計算部分中,程序?qū)φ麄€網(wǎng)格層采用for循環(huán)進(jìn)行更新,大多數(shù)循環(huán)深度為3層,由于邊界上存在虛擬網(wǎng)格,循環(huán)次數(shù)約為43.5萬次,略多于網(wǎng)格數(shù),每次迭代中更新一個或多個變量。此外,為實現(xiàn)復(fù)雜計算,程序還調(diào)用了math庫中的部分計算函數(shù),考慮到計算函數(shù)計算開銷較大,在某些調(diào)用中可采用等價短指令替換。
為進(jìn)一步分析程序計算性能,本文采用性能分析軟件對程序進(jìn)行分析。結(jié)果顯示,程序的流水線性能未充分發(fā)揮,雙向中斷率均超過50%,暫停周期數(shù)較高,導(dǎo)致執(zhí)行某個程序的指令平均時鐘周期(CPI)與理論值有差距。因此,在優(yōu)化時應(yīng)考慮流水優(yōu)化;緩存命中率約為50%,訪存上也有優(yōu)化空間;此外程序執(zhí)行指令數(shù)為38 534×109條,在優(yōu)化中需尋找潛在的指令優(yōu)化來減少冗余代碼。
本文所述方法應(yīng)用在TIANHE-1A超級計算機系統(tǒng)中Intel Xeon X5670 CPU上,采用Intel CPU作為示例是考慮到大多數(shù)的高性能計算環(huán)境都采用Intel處理器,且Intel CPU中采用的加速部件在其他處理器中有類似部件設(shè)計,因此以Intel CPU為基礎(chǔ)設(shè)計的優(yōu)化方案具有較好的普適性。
圖1 Intel CPU架構(gòu)示意圖
圖1給出了Intel CPU的架構(gòu)示意圖,該示意圖基于Intel Xeon X5670 CPU所采用的Nehalem架構(gòu),主要體現(xiàn)CPU針對單核程序的加速方式,對其余部件做了省略和簡化。圖1中CPU包含兩個核,每個核內(nèi)設(shè)置獨立的計算部件,從邏輯上分為取值部件、解碼部件、順序回退部件、計算單元,圖1中的箭頭代表了部件間的數(shù)據(jù)通路?;谏鲜黾軜?gòu),Nehalem CPU架構(gòu)部署了取指(IF)、譯碼(ID)、執(zhí)行(EXE)、寫回(WB)四階段流水機制。此外,Nehalem架構(gòu)還采用了超標(biāo)量技術(shù),在CPU中建立了4條流水線,因此理論上可以同時執(zhí)行4條流水指令。每個核設(shè)置獨立的L1和L2緩存,多個核間共享L3緩存,方便進(jìn)行數(shù)據(jù)緩存,提升訪存性能。其中一級緩存分為數(shù)據(jù)緩存和指令緩存,每個緩存容量為32 KB,采用8×64組相連的映射方式,訪存速度為4個時鐘周期;L2緩存容量為256 KB,采用8×512組相連映射方式,訪存速度為10個時鐘周期;L3緩存容量為8 MB,采用16×8 192組相連映射方式,訪存速度為40~75個時鐘周期。
基于對Nehalem架構(gòu)的分析,程序優(yōu)化的思路主要集中在使程序充分發(fā)揮流水性能和訪存性能上。
除針對CPU架構(gòu)的優(yōu)化外,還需考慮程序本身的簡潔性。對于不同形式的程序,通過編譯器編譯得到的目標(biāo)代碼有很大差距,若有冗余和過多同義代碼會導(dǎo)致性能下降。為保證程序性能,在編碼時需考慮高級語言被編譯后得到的目標(biāo)代碼是否簡潔高效。
結(jié)合上述分析,本文提出的流體計算程序單核優(yōu)化方案主要考慮3個方面:①優(yōu)化存儲結(jié)構(gòu)和訪存結(jié)構(gòu),發(fā)揮高速緩存效率;②調(diào)整程序的指令結(jié)構(gòu),發(fā)揮流水性能;③優(yōu)化程序指令,使程序底層指令數(shù)得到削減和優(yōu)化。前兩個方面面向CPU對單核指令執(zhí)行的高速訪存和流水優(yōu)化部件展開,目的是充分發(fā)揮CPU加速部件的加速效果。第3個方面針對程序代碼本身優(yōu)化,考慮到不同指令在底層執(zhí)行時采用不同的匯編指令翻譯,程序的目標(biāo)代碼應(yīng)足夠精簡高效。
訪存優(yōu)化的目的是使程序在數(shù)據(jù)訪問時緩存的利用率更高,主要優(yōu)化手段是調(diào)整數(shù)據(jù)的存儲結(jié)構(gòu)和訪存結(jié)構(gòu),首先考慮存儲結(jié)構(gòu)。
(a)訪存在內(nèi)存上連續(xù)
(b)訪存在內(nèi)存上離散
程序的訪存方式是通過循環(huán)遍歷的方式對網(wǎng)格進(jìn)行訪問,優(yōu)先訪問網(wǎng)格層號n,其次為x、y、z軸,這種存儲結(jié)構(gòu)和訪存方式的不匹配造成了緩存效率較低。圖2給出了不同存儲方式下訪存情況的對比,對于M×N矩陣,規(guī)定訪存順序為從(0,1)到(0,N),若矩陣采取aM,N的形式存儲,則矩陣在內(nèi)存中的物理分布如圖2a所示,在訪存時數(shù)據(jù)分布在連續(xù)的內(nèi)存中,緩存會將連續(xù)內(nèi)存存入,在下次訪存時可直接取用緩存,減少內(nèi)存訪問。若矩陣采取aN,M的形式存儲,則矩陣在內(nèi)存中分布如圖2b所示,在訪存時會產(chǎn)生跳躍,因此緩存無法命中,需要進(jìn)行內(nèi)存訪問,影響程序運行效率。
為解決訪存問題,將數(shù)據(jù)的存儲結(jié)構(gòu)調(diào)整為an,z,y,x,這樣調(diào)整的好處有:①存儲結(jié)構(gòu)更改后x網(wǎng)格內(nèi)相鄰各點在內(nèi)存中存儲的更近,更有利于程序的連續(xù)訪問;②對于多維容器來說,由于x>y>z>n,更改后的存儲形式減少了容器在較低維度所創(chuàng)建的數(shù)量,減少了目標(biāo)代碼的指令數(shù)。例如,對于容器a20,10,需先創(chuàng)建一個容量為20的容器,每個容器中再創(chuàng)建一個容量為10的容器,總共創(chuàng)建21個,若改為a10,20,則僅需創(chuàng)建11個容器。
下面根據(jù)存儲結(jié)構(gòu)調(diào)整訪存結(jié)構(gòu),訪存順序的控制由for循環(huán)語句進(jìn)行。為使訪存順序更適合存儲結(jié)構(gòu),將循環(huán)結(jié)構(gòu)和存儲維度調(diào)整為一一對應(yīng)的關(guān)系。即對于an,z,y,x形式的數(shù)據(jù),處理循環(huán)為最外層循環(huán)處理n、次外層處理z、內(nèi)層處理y、最內(nèi)層處理x。對不滿足這種處理方式的操作,考察操作的相關(guān)性,若無相關(guān)性可通過拆分循環(huán)來優(yōu)化訪存順序。
訪存方式的優(yōu)化和存儲結(jié)構(gòu)的優(yōu)化有類似的優(yōu)點:調(diào)整訪存結(jié)構(gòu)有利于高速緩存;調(diào)整后循環(huán)的控制變量初始化次數(shù)減少,消減底層指令數(shù)。
考慮影響流水線性能的問題,在程序一級影響因素主要有:由分支轉(zhuǎn)移引起的控制相關(guān)會導(dǎo)致流水失效;由寫后讀引起的數(shù)據(jù)相關(guān),這些相關(guān)會導(dǎo)致流水暫停,使流水性能下降。Nehalem CPU架構(gòu)部署了四階段流水機制,雖然該架構(gòu)加入了分支預(yù)測和數(shù)據(jù)旁路的方式減少流水線中斷,但是仍不足以完全消除相關(guān)性引起的性能損失,因此在優(yōu)化時仍可消除相關(guān)性。
考慮計算中的循環(huán)部分,由于循環(huán)在每次迭代時需進(jìn)行一次判斷,若循環(huán)內(nèi)指令較少會導(dǎo)致計算和分支的比例過低,產(chǎn)生控制相關(guān)導(dǎo)致性能下降,同時循環(huán)中對同一變量的反復(fù)讀寫可能引起數(shù)據(jù)相關(guān)。針對控制相關(guān)和數(shù)據(jù)相關(guān)問題,一般采用循環(huán)展開并引入多中間變量的方法進(jìn)行優(yōu)化,循環(huán)展開可以在以下方面得到優(yōu)化:①減少分支數(shù);②減少循環(huán)控制的指令開銷;③減少循環(huán)內(nèi)計算的數(shù)據(jù)相關(guān)。循環(huán)展開示例如下
for(i=0;i s+=a[i]; 改為: for(i=0;i s1+=a[i]; s2+=a[i+1]; } s=s1+s2; 展開因子k=2,即每次循環(huán)計算次數(shù)為兩次。兩種代碼的流水情況如圖3所示,流水性能得到了提升。 (a)循環(huán)拆分前 (b)循環(huán)拆分后 理論上,在展開足夠多循環(huán)的情況下可以完全消除流水中斷,展開因子應(yīng)大于硬件標(biāo)量數(shù)與執(zhí)行周期的乘積,如對于具有3個浮點乘器件,每個浮點乘需5個時鐘周期的指令集,展開因子應(yīng)大于15;但是實際操作中需考慮寄存器溢出,即中間變量過多導(dǎo)致寄存器不夠,觸發(fā)訪存。為此還需保證最優(yōu)循環(huán)因子k滿足 max{k};F(k)≤r,k∈Z (3) 式中F(k)為k次展開需要的寄存器數(shù)。 此外,解除數(shù)據(jù)相關(guān)還可以采用長計算拆分為短計算、創(chuàng)建臨時變量的方式解除相關(guān)、多個連續(xù)的寫后讀相關(guān)語句交叉等方法。 對if語句引起的控制相關(guān),分支預(yù)測部件往往不能正確預(yù)測走向,預(yù)測錯誤的懲罰往往達(dá)到十幾個到幾十個時鐘周期,帶來流水性能損失。在X86指令集中,條件數(shù)據(jù)傳輸指令可以被編譯為普通指令流水線的一部分,在判斷失敗時沒有懲罰,因此采用條件數(shù)據(jù)傳送代替條件控制轉(zhuǎn)移能提升程序性能。常用的條件數(shù)據(jù)傳輸指令是三目運算符,條件傳輸形式如s=a x=a x′=b boolT=(a if (!T)x=x′ 可以看出,這種編譯方式將分支轉(zhuǎn)移操作放在偽代碼最后一行的if語句中,在目標(biāo)代碼中這個if語句通過條件拷貝指令cmov實現(xiàn),分支的結(jié)果只在這一條指令中體現(xiàn),與上下文無關(guān),從而消除了分支開銷。通過這種轉(zhuǎn)換可以提升分支在流水線中的穩(wěn)定性,減少預(yù)測錯誤的懲罰。 指令優(yōu)化的目的是從指令一級減少冗余代碼。冗余代碼主要指程序編譯后的目標(biāo)代碼中產(chǎn)生的冗余,一般主要產(chǎn)生于如下兩種情況。 (1)完成相同功能的不同語句在經(jīng)過編譯器編譯后會產(chǎn)生不同的目標(biāo)代碼,若選擇不合適的語句會引起冗余的目標(biāo)代碼。這種冗余包括兩種,一種是目標(biāo)代碼量的增加,指對于同樣功能的代碼由于實現(xiàn)方法不同導(dǎo)致編譯后代碼條數(shù)不同;另一種是代碼復(fù)雜度的增加,CISC指令集中的指令執(zhí)行時間不同,因此同樣的指令條數(shù)下指令執(zhí)行時間有所不同。 (2)為實現(xiàn)方法調(diào)用,操作系統(tǒng)需保存當(dāng)前運行時信息,并在運行時棧開辟新的空間,在調(diào)用結(jié)束時恢復(fù)信息并釋放空間。這種調(diào)度工作會體現(xiàn)在目標(biāo)代碼中,雖然一般認(rèn)為正常的調(diào)用過程對程序性能影響不大,但當(dāng)調(diào)用在程序中占比過大時會影響程序性能。調(diào)用引起代碼冗余的一種示例如下。 非調(diào)用版指令如下 s=a+b; 目標(biāo)代碼為 1 mov %rdi,%rbp 2 mov %rax,rbp 3 add %rbx,%rax 調(diào)用版指令如下 Sum (inta,intb) {returna+b;} 目標(biāo)代碼為 1 push %rbp 2 push %rbx 3 sub %8,%rsp 4 mov %rdi,%rbp 5 mov %rax,rbp 6 add %rbx,%rax 7 add %8,%rsp 8 pop %rbx 9 pop %rbp 10 ret 調(diào)用版的第1、2行用來實現(xiàn)現(xiàn)場保存,第3行為新調(diào)用棧分配空間,然后執(zhí)行加法功能,第7行釋放調(diào)用棧,第8、9行恢復(fù)現(xiàn)場,最后返回??梢钥闯?當(dāng)實現(xiàn)同樣加法功能的s=a+b被替換為方法調(diào)用Sum(a,b)后,運行時棧調(diào)度的開銷超過了方法本身。雖然編譯器中有對高級語言的自動優(yōu)化功能或調(diào)用產(chǎn)生冗余代碼的問題,如自動將短調(diào)用進(jìn)行內(nèi)聯(lián)處理,但是編譯器優(yōu)化的前提是保證程序的安全,因此面對具有內(nèi)存別名使用或變量類型未知等問題的代碼不能進(jìn)行自動優(yōu)化,需手動對高級語言進(jìn)行優(yōu)化。 分析本程序得出,導(dǎo)致性能下降的主要問題是:①部分庫函數(shù)調(diào)用時產(chǎn)生的隱藏代碼增加了代碼量,增加包括調(diào)用棧引起的代碼開銷和庫函數(shù)本身復(fù)雜性引起的代碼開銷;②代碼及代碼結(jié)構(gòu)本身的計算復(fù)雜度較高,因為有較多耗時的除法計算需求。為解決上述問題,考慮使用簡單指令代替復(fù)雜指令,并結(jié)合訪存優(yōu)化及流水優(yōu)化考慮匯編指令在系統(tǒng)中的運行狀態(tài)進(jìn)行優(yōu)化。 下面討論指令優(yōu)化的具體實現(xiàn)。針對庫函數(shù)調(diào)用的問題,結(jié)合程序分析發(fā)現(xiàn),程序主要調(diào)用的庫函數(shù)為數(shù)學(xué)庫和容器類庫。數(shù)學(xué)庫的乘方、開方等操作一般不可替代,但是對于低階乘方,可以直接使用數(shù)乘代替。如pow(a,2)可以改寫為a*=a,這種替換可以減少調(diào)用開銷,同時簡化方法本身的復(fù)雜度。 對容器類庫函數(shù)的修改可考慮對C++語言自帶容器數(shù)組進(jìn)行二次封裝代替庫容器,在本文的程序中為采用數(shù)組代替Vector容器。從可行性分析,Vector和數(shù)組有較為類似的存儲結(jié)構(gòu),因此在存取功能上具有可替代性。Vector相對數(shù)組的優(yōu)勢在于靈活的操作方式和內(nèi)存分配方式,程序中對容器的主要操作方式為隨機訪問,此外有少量的動態(tài)內(nèi)存分配操作,因此在二次封裝數(shù)組時需要為數(shù)組增加隨機訪存函數(shù),從而實現(xiàn)對Vector的替代,所以用數(shù)組代替Vector具有可行性。從必要性分析,Vector是STL封裝的容器庫,在使用時涉及庫調(diào)用會增加底層代碼量,容器的存儲結(jié)構(gòu)上,Vector為實現(xiàn)動態(tài)增長,在分配空間時會分配額外的內(nèi)存,在多維空間上,這種存儲空間的浪費變得更加明顯,在訪存時也會增加額外開銷,高速緩存的命中率也會下降。 針對代碼結(jié)構(gòu)結(jié)合訪存特性考慮編譯器對語句的處理方式,由于對變量的訪問常被編譯為寄存器訪問操作,對引用的訪問被編譯為內(nèi)存訪問操作,因此為優(yōu)化訪存性能,需將循環(huán)中頻繁引用訪問修改為變量訪問。針對代碼本身,考慮科學(xué)計算中常出現(xiàn)的乘除法指令,在Intel提供的參考機中部分算數(shù)指令性能見表1,其中延遲表明實際運算周期數(shù),發(fā)射表明兩次運算最小間隔周期數(shù),容量表明該功能的運算單元數(shù)。 表1 Intel參考機算數(shù)指令性能 由表1可以看出,乘除法運算執(zhí)行時間較長,除法尤為明顯,因此對乘除法的優(yōu)化也應(yīng)加以考慮。針對非浮點數(shù)的乘除法指令,采用移位運算代替乘除法的方法進(jìn)行處理。該方法在乘除法數(shù)量較多且乘數(shù)或除數(shù)較為規(guī)律時可產(chǎn)生較好的優(yōu)化效果。對于浮點數(shù)除法,可采用公共除法移出的方法將除法轉(zhuǎn)換為乘法,減少執(zhí)行時間。 對第一節(jié)中的流體計算程序采用上述優(yōu)化方案進(jìn)行優(yōu)化,并在商用服務(wù)器對各版本程序采用perf性能檢測工具對程序進(jìn)行小規(guī)模性能分析。商用服務(wù)器采用Intel Xeon CPU E7-8850 @ 2.00 GHz(8×10核)CPU,內(nèi)存125 GB,編譯器采用gcc 4.8.5。在三層網(wǎng)格上迭代輪次為5、5、10。程序優(yōu)化前后的主要指標(biāo)的分析結(jié)果和執(zhí)行時間見表2。由于對容器以及對指令的優(yōu)化,程序所使用的運行時空間的大小也有所下降,內(nèi)存占用實驗結(jié)果見表3。 表2 程序主要指標(biāo)優(yōu)化前后的比較 表3 優(yōu)化前后占用內(nèi)存情況 由表2、3可以看出,程序性能的主要提升在于優(yōu)化后導(dǎo)致指令數(shù)的減少,在系統(tǒng)級優(yōu)化后緩存性能和流水性能也有所提升。在規(guī)模為5、5、10的程序中,經(jīng)過優(yōu)化的程序每周期指令數(shù)提升24.24%,指令暫停周期下降25.86%,流水中斷率下降6%,緩存命中率提升14%,執(zhí)行時間下降70.56%,空間消耗下降49.97%。 將程序部署在TIANHE-1A超級計算機系統(tǒng)中測試性能,采用4節(jié)點運行36進(jìn)程。采用的CPU為Intel Xeon X5670(2×6核),內(nèi)存24 GB,編譯器為icc_xe_2013.0.07。三層網(wǎng)格迭代輪次采用50、50、10 000作為程序完整規(guī)模運行的實驗,測試結(jié)果見表4。 由表4結(jié)果可以看出,在TIANHE-1A系統(tǒng)上,三層網(wǎng)格迭代輪次分別為50、50、10 000計算規(guī)模時,程序耗時下降68.34%,空間消耗減少55.43%,與商用服務(wù)器上測試結(jié)果類似。根據(jù)測試結(jié)果可以看出,本文的優(yōu)化方法能有效提升程序?qū)PU計算能力的發(fā)揮,大幅減少程序的底層代碼,在測試程序中取得較好的優(yōu)化效果。 表4 程序完整規(guī)模運行的實驗測試結(jié)果 根據(jù)計算機系統(tǒng)單核級指令執(zhí)行的加速特性和編譯特性,提出一種針對計算流體力學(xué)程序的單核優(yōu)化方案,主要優(yōu)化方面包括:①優(yōu)化指令結(jié)構(gòu),減少指令流水的斷流,使程序充分發(fā)揮CPU的計算能力;②調(diào)整存儲結(jié)構(gòu)和訪存結(jié)構(gòu),增強存儲和訪存的性能;③減少冗余指令,優(yōu)化指令結(jié)構(gòu),從而減少程序執(zhí)行所需的時間開銷和空間消耗。 將本文方法應(yīng)用在壓氣機轉(zhuǎn)子模擬程序中,測試結(jié)果顯示優(yōu)化方案能有效減少程序指令數(shù)、增加緩存命中率,減少指令流水?dāng)嗔?在TIANHE-1A計算機系統(tǒng)中進(jìn)行測試,結(jié)果顯示優(yōu)化后時間性能提升約68.34%,空間性能提升約55.43%,加速比提升3倍以上,具有較好的優(yōu)化效果。2.3 指令優(yōu)化
3 實驗結(jié)果
4 結(jié) 論