孫新華 ,張 程 ,楊廣文
1.清華大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)系,北京 100084
2.清華大學(xué) 地球系統(tǒng)科學(xué)研究中心 地球系統(tǒng)數(shù)值模擬教育部重點(diǎn)實(shí)驗(yàn)室,北京 100084
近年來,全球氣候正在經(jīng)歷一場(chǎng)顯著的變化,其以全球變暖為主要特征,伴隨著冰川融化退縮、海平面上升、土地沙漠化不斷加劇,對(duì)地球的生態(tài)和環(huán)境產(chǎn)生了嚴(yán)重的影響。隨之而來的各種極端天氣與氣候事件諸如暴雨、干旱、高溫天氣的頻發(fā)也社會(huì)各界的廣泛關(guān)注。如何有效地對(duì)氣候進(jìn)行預(yù)測(cè)分析成為擺在地球系統(tǒng)科學(xué)研究人員的難題,而地球系統(tǒng)模式作為地球系統(tǒng)科學(xué)走向定量化的標(biāo)志得到了越來越多研究人員的青睞,成為研究氣候變化的重要科學(xué)工具之一[1]。由于在低分辨率下地球系統(tǒng)模式無法模擬中小尺度下的過程,比如海洋模式中尺度漩渦過程,大氣模式中的云演變過程,并且在面對(duì)復(fù)雜地形時(shí)難以達(dá)到精度要求,研究者越來越傾向于使用高分辨率格點(diǎn)網(wǎng)絡(luò)進(jìn)行數(shù)值模擬,高分辨率成為了地球系統(tǒng)模式發(fā)展的一個(gè)顯著趨勢(shì)。
隨著分辨率的提高,模式程序需要對(duì)更多格點(diǎn)網(wǎng)格進(jìn)行計(jì)算,在需要更多計(jì)算資源的同時(shí)也對(duì)運(yùn)行平臺(tái)的I/O能力提出了更高的要求。有數(shù)據(jù)顯示,因?yàn)槟J椒直媛实奶岣撸J匠绦蜉敵鰯?shù)據(jù)的規(guī)模呈現(xiàn)出幾何級(jí)的增長(zhǎng)速度[2]。然而高性能計(jì)算機(jī)的I/O能力與計(jì)算能力的差距卻在逐漸拉大,這一方面是由于單機(jī)計(jì)算能力的增長(zhǎng)速度遵循摩爾定律,遠(yuǎn)遠(yuǎn)高于磁盤帶寬的增長(zhǎng)速度;另一方面是由于并行計(jì)算技術(shù)的發(fā)展和異構(gòu)加速器的引入,例如在科學(xué)應(yīng)用程序中廣泛使用的MPI和OpenMP技術(shù),可以讓科學(xué)計(jì)算程序運(yùn)行在成千乃至上萬個(gè)計(jì)算節(jié)點(diǎn)上,充分釋放了高性能計(jì)算集群的計(jì)算能力;同時(shí)GPGPU和FPGA的引入為科學(xué)計(jì)算提供了更廣闊的平臺(tái)。I/O能力的相對(duì)不足嚴(yán)重影響了地球系統(tǒng)模式在高性能計(jì)算平臺(tái)上的運(yùn)行效率,地球系統(tǒng)模式的運(yùn)行過程可以分為兩個(gè)階段,即計(jì)算階段和I/O階段,在傳統(tǒng)的I/O方法下等待數(shù)據(jù)輸出的過程中,模式無法繼續(xù)進(jìn)行計(jì)算只能等待I/O過程完成,因此模式的總體運(yùn)行時(shí)間為I/O時(shí)間與計(jì)算時(shí)間之和。隨著高分辨率地球系統(tǒng)模式輸出數(shù)據(jù)規(guī)模的增大,I/O過程的時(shí)間越來越長(zhǎng),I/O問題愈發(fā)成為模式運(yùn)行中的性能瓶頸。
為了解決這一問題,研究人員結(jié)合地球系統(tǒng)模式的I/O特征并基于I/O轉(zhuǎn)發(fā)技術(shù)開發(fā)了一個(gè)面向地球系統(tǒng)模式的應(yīng)用層并行I/O庫(kù)CFIO(Climate Fast I/O Library)[3],利用I/O過程和計(jì)算過程的重疊來減少I/O過程對(duì)于模式整體運(yùn)行性能的影響。CFIO將運(yùn)行模式的進(jìn)程劃分為計(jì)算進(jìn)程和I/O進(jìn)程兩類,計(jì)算進(jìn)程只負(fù)責(zé)模式的計(jì)算過程,它將程序的I/O請(qǐng)求轉(zhuǎn)發(fā)到I/O進(jìn)程并緩存在I/O進(jìn)程的緩沖區(qū)中,而由I/O過程負(fù)責(zé)完成模式數(shù)據(jù)的實(shí)際輸出,這樣就將I/O進(jìn)程與計(jì)算進(jìn)程自動(dòng)重疊從而實(shí)現(xiàn)對(duì)程序整體的加速。在實(shí)際的使用過程中發(fā)現(xiàn),在給定進(jìn)程數(shù)的情況下,如何劃分計(jì)算進(jìn)程與I/O進(jìn)程的比例以及I/O進(jìn)程中內(nèi)存緩沖區(qū)的大小會(huì)對(duì)模式程序整體運(yùn)行產(chǎn)生極大的影響:若I/O進(jìn)程過少,由于I/O能力不足會(huì)造成I/O進(jìn)程緩沖區(qū)堵塞,計(jì)算進(jìn)程被迫停下等待緩沖區(qū)的部分I/O請(qǐng)求完成才能繼續(xù),這樣就會(huì)拉長(zhǎng)模式程序整體運(yùn)行時(shí)間;若I/O進(jìn)程過多,將會(huì)造成I/O能力過剩,會(huì)浪費(fèi)有限的計(jì)算資源。地學(xué)研究人員作為CFIO庫(kù)的使用者,并不一定具備底層系統(tǒng)層面的知識(shí)幫助他們完成CFIO庫(kù)相關(guān)參數(shù)的設(shè)置,所以現(xiàn)有的經(jīng)驗(yàn)式的參數(shù)指定方式使得CFIO庫(kù)在面對(duì)不同平臺(tái)不同地球系統(tǒng)模式時(shí)并不能發(fā)揮最好的效能。
現(xiàn)有的與CFIO庫(kù)設(shè)計(jì)思路類似的并行I/O庫(kù)PIO[4]和DART[5]均沒有解決這一問題。PIO是CESM(Community Earth System Model)[6]的開發(fā)者結(jié)合地球系統(tǒng)模式中I/O特征專門為CESM開發(fā)的應(yīng)用層并行I/O庫(kù),其并行I/O功能由更底層的并行I/O庫(kù)支持。目前PIO底層使用的 I/O 庫(kù)有 MPI-IO[7]、netCDF[8]和 PnetCDF[9],用戶可以根據(jù)自己的需要靈活選擇底層的I/O庫(kù)。PIO定義了兩種數(shù)據(jù)在進(jìn)程間的劃分方式即計(jì)算劃分和I/O劃分并提供了一個(gè)數(shù)據(jù)重劃分的功能接口。所謂計(jì)算劃分是指針對(duì)計(jì)算網(wǎng)格進(jìn)行的劃分,數(shù)據(jù)的產(chǎn)生是隨著計(jì)算任務(wù)按照計(jì)算劃分分布在進(jìn)程間的,但是這樣的分布方式并不一定適合底層I/O庫(kù)的I/O任務(wù)。用戶可以使用PIO提供的接口重新定義數(shù)據(jù)在進(jìn)程間的劃分方式即I/O劃分,經(jīng)過通信數(shù)據(jù)會(huì)在進(jìn)程間按I/O劃分重新分布以獲得更好的性能。與CFIO不同,PIO并沒有采取計(jì)算階段和通信階段重疊的方法,而是按照傳統(tǒng)的方式將計(jì)算與通信串聯(lián)進(jìn)行,數(shù)據(jù)按照計(jì)算劃分產(chǎn)生后先緩存,然后再按照I/O劃分的方式進(jìn)行通信、寫入。在重劃分過程中,用戶可以指定參與I/O劃分的進(jìn)程數(shù)以適應(yīng)不同的I/O需求,其進(jìn)程數(shù)指定方式主要依靠用戶的經(jīng)驗(yàn)式指定。DART是由美國(guó)橡樹嶺國(guó)家實(shí)驗(yàn)室開發(fā)的利用RDMA[10]作為通信方式的并行I/O轉(zhuǎn)發(fā)架構(gòu),與CFIO類似,DART系統(tǒng)中也存在DARTClient與DARTServer數(shù)目比例確定的問題。Ciprian Docan等[5]提到了自適應(yīng)地根據(jù)運(yùn)行平臺(tái)和程序的不同調(diào)整比例的重要性,但是并沒有付諸實(shí)踐。
針對(duì)并行I/O庫(kù)經(jīng)驗(yàn)式的進(jìn)程管理和緩沖區(qū)管理方法所帶來的性能損失,基于CFIO結(jié)合地球系統(tǒng)模式中的I/O特征設(shè)計(jì)并實(shí)現(xiàn)了一套參數(shù)自動(dòng)選擇的解決方案。通過目標(biāo)模式程序的預(yù)執(zhí)行收集I/O痕跡(I/O Trace)并統(tǒng)計(jì)其I/O特征信息,使用這套程序可以讓CFIO在不同平臺(tái)不同地球分量模式上既發(fā)揮CFIO最好的性能又不浪費(fèi)資源。
本文首先介紹了CFIO的軟件結(jié)構(gòu),之后分析了不同地球系統(tǒng)分量模式中的I/O請(qǐng)求到達(dá)規(guī)律和參數(shù)自動(dòng)選擇程序設(shè)計(jì)實(shí)現(xiàn)思路;最后,列出了具體實(shí)驗(yàn)結(jié)果。
CFIO是一個(gè)適用于高分辨率地球系統(tǒng)模式的應(yīng)用層并行I/O庫(kù)。模式的運(yùn)行過程是由計(jì)算過程和I/O過程兩部分交替進(jìn)行,在使用同步I/O接口時(shí)模式需要阻塞等待I/O過程的完成,即計(jì)算過程和I/O過程串行執(zhí)行,模式運(yùn)行時(shí)間也就是計(jì)算時(shí)間和I/O時(shí)間之和。由于高分辨率地球系統(tǒng)模式輸出數(shù)據(jù)規(guī)模的急劇增加,越來越長(zhǎng)的I/O時(shí)間對(duì)模式的整體運(yùn)行性能造成了極大的影響。而通過分析地球系統(tǒng)模式I/O特征可以發(fā)現(xiàn),模式的I/O過程總是跟隨在計(jì)算過程之后且頻率固定,同時(shí)模式的運(yùn)行過程中只涉及簡(jiǎn)單的追加寫輸出,不會(huì)再次讀入寫出的數(shù)據(jù)。因此CFIO利用這種規(guī)律通過I/O轉(zhuǎn)發(fā)技術(shù)實(shí)現(xiàn)了計(jì)算過程與I/O過程的重疊。在原來的應(yīng)用場(chǎng)景中當(dāng)一個(gè)模式啟動(dòng)時(shí),所有的進(jìn)程既負(fù)責(zé)計(jì)算過程又負(fù)責(zé)I/O過程,在CFIO中,在原有進(jìn)程的基礎(chǔ)上,額外地啟動(dòng)部分進(jìn)程專門負(fù)責(zé)I/O過程,即I/O轉(zhuǎn)發(fā)。如圖1所示,所有進(jìn)程被劃分為兩類進(jìn)程:一是計(jì)算進(jìn)程,負(fù)責(zé)地球系統(tǒng)模式中的計(jì)算任務(wù),計(jì)算進(jìn)程在執(zhí)行I/O過程時(shí)并不直接在本地調(diào)用底層I/O接口執(zhí)行I/O請(qǐng)求,而是通過網(wǎng)絡(luò)將I/O請(qǐng)求轉(zhuǎn)發(fā)到I/O進(jìn)程中;二是I/O進(jìn)程,負(fù)責(zé)地球系統(tǒng)模式中的I/O任務(wù),I/O進(jìn)程從計(jì)算進(jìn)程接收I/O請(qǐng)求并調(diào)用PnetCDF為計(jì)算進(jìn)程實(shí)際執(zhí)行I/O請(qǐng)求。這樣計(jì)算進(jìn)程在完成I/O轉(zhuǎn)發(fā)之后,并不需要等待計(jì)算過程的實(shí)際完成,而是繼續(xù)進(jìn)行下一個(gè)時(shí)間步的計(jì)算,而與此同時(shí)I/O過程也在I/O進(jìn)程上并發(fā)地執(zhí)行,從而實(shí)現(xiàn)了I/O過程與計(jì)算過程的重疊,隱藏了I/O時(shí)間,縮短了模式整體運(yùn)行的時(shí)間。

圖1 CFIO中I/O轉(zhuǎn)發(fā)結(jié)構(gòu)圖
具體分析CFIO的軟件結(jié)構(gòu),如圖2所示。運(yùn)行在I/O進(jìn)程上的CFIO服務(wù)器從運(yùn)行在計(jì)算進(jìn)程上的CFIO客戶端接收I/O請(qǐng)求并緩存在緩沖區(qū)中,之后通過調(diào)用PnetCDF庫(kù)按照先到先服務(wù)的原則處理I/O請(qǐng)求,將數(shù)據(jù)輸出到文件系統(tǒng)中。CFIO服務(wù)器處理I/O請(qǐng)求的流程:當(dāng)有新的I/O請(qǐng)求到達(dá)時(shí),程序會(huì)檢查現(xiàn)有緩沖區(qū)容量是否可以容納最新到達(dá)的I/O請(qǐng)求,如果可以,服務(wù)器會(huì)正常接收轉(zhuǎn)發(fā)而來的I/O請(qǐng)求;若由于到達(dá)的I/O請(qǐng)求過多導(dǎo)致I/O請(qǐng)求的大小超過了緩沖區(qū)大小,CFIO服務(wù)器則不會(huì)再接收I/O請(qǐng)求進(jìn)入阻塞狀態(tài),需要處理并執(zhí)行部分的I/O請(qǐng)求釋放出部分的緩沖區(qū)空間,直到緩沖區(qū)有足夠的空間來緩存下一條I/O請(qǐng)求,服務(wù)器才會(huì)由阻塞狀態(tài)轉(zhuǎn)變回接收者狀態(tài),繼續(xù)接收數(shù)據(jù)。

圖2 CFIO結(jié)構(gòu)細(xì)節(jié)圖
一旦進(jìn)入CFIO服務(wù)器進(jìn)入阻塞狀態(tài),CFIO客戶端的計(jì)算過程也必須停止等待I/O過程,這樣計(jì)算過程與I/O過程隱藏效果就會(huì)變差,如圖3(b)所示,阻塞會(huì)讓CFIO客戶端的轉(zhuǎn)發(fā)等待時(shí)間變長(zhǎng),從而增加程序整體運(yùn)行時(shí)間。服務(wù)器端的堵塞是由于后端PnetCDF數(shù)據(jù)處理的能力不足,根本原因是初始階段分配的I/O進(jìn)程太少;若分配的I/O進(jìn)程過多則會(huì)造成I/O處理能力的過剩,如圖3(a)所示,造成計(jì)算資源的浪費(fèi)。只有在計(jì)算時(shí)間恰好等于I/O時(shí)間即如圖3(c)所示的情況下,才既能保證模式程序運(yùn)行性能又不浪費(fèi)計(jì)算資源,實(shí)現(xiàn)I/O過程與計(jì)算過程的完美隱藏。同時(shí),在計(jì)算進(jìn)程數(shù)目一定的情況下,I/O進(jìn)程數(shù)目的不同會(huì)影響到每一個(gè)I/O進(jìn)程對(duì)應(yīng)的計(jì)算進(jìn)程的數(shù)目,因此每一個(gè)I/O進(jìn)程需要處理的I/O請(qǐng)求數(shù)目也會(huì)不同,進(jìn)而會(huì)影響CFIO服務(wù)器端緩沖區(qū)的使用量。

圖3 計(jì)算過程與I/O過程的重疊
在地球系統(tǒng)模式中,模式的運(yùn)行過程是有規(guī)律性的。由于地球系統(tǒng)模式中主要的計(jì)算過程均為動(dòng)量方程組的迭代求解,在某些迭代步的計(jì)算之后會(huì)輸出一些信息用于記錄模式運(yùn)行狀況或者用于從程序崩潰中重新啟動(dòng),所以地球系統(tǒng)模式的運(yùn)行會(huì)出現(xiàn)周期性的特征:計(jì)算過程和I/O過程交替運(yùn)行,計(jì)算過程是固定時(shí)間的一步或者幾步迭代,I/O過程是以某一固定頻率出現(xiàn)在計(jì)算過程之后的記錄信息輸出。因此,對(duì)于單個(gè)計(jì)算進(jìn)程來說,其I/O請(qǐng)求在時(shí)間分布上是有周期性的,由一個(gè)個(gè)突發(fā)性的波峰和波峰之后長(zhǎng)時(shí)間的無I/O的時(shí)間段構(gòu)成。而且每一個(gè)周期內(nèi)也有不同數(shù)量的I/O請(qǐng)求到達(dá)高峰,這是由于不同輸出文件輸出頻率不同造成的。而經(jīng)過對(duì)于海洋模式POP(Parallel Ocean Program)[11]、海冰模式CICE[12]兩種常用地球分量模式中I/O請(qǐng)求在CFIO服務(wù)器端的到達(dá)分布情況的測(cè)試,可以發(fā)現(xiàn)多個(gè)計(jì)算進(jìn)程的I/O請(qǐng)求在I/O進(jìn)程聚合之后仍然呈現(xiàn)出于計(jì)算進(jìn)程一樣的周期性,且與計(jì)算進(jìn)程發(fā)起I/O請(qǐng)求時(shí)的分布一致。這說明運(yùn)行在不同節(jié)點(diǎn)上的CFIO客戶端上計(jì)算過程是基本同步的,造成這種情況有兩點(diǎn)原因,一是因?yàn)樵诖蟛糠指咝阅芗褐懈鱾€(gè)物理節(jié)點(diǎn)的配置狀況相同或類似,二是因?yàn)樵诘厍蛳到y(tǒng)模式中,每一個(gè)時(shí)間步的最后會(huì)有全局的gather求和等需要全局通信的操作,因此相當(dāng)于每一個(gè)時(shí)間步各個(gè)計(jì)算進(jìn)程都需要同步一次。
此外,對(duì)于每個(gè)I/O請(qǐng)求塊的大小進(jìn)行分析可以發(fā)現(xiàn),在同一個(gè)模式程序中I/O請(qǐng)求塊大小是完全相同或者分段相同的。這是由于模式程序的輸出通常情況下是嵌套在for循環(huán)中按照維度循環(huán)輸出的,因此每次調(diào)用CFIO寫入函數(shù)發(fā)起的I/O請(qǐng)求大小會(huì)相同;對(duì)于分段相同的情況發(fā)現(xiàn)是由于寫入數(shù)據(jù)類型的變化,整個(gè)寫入過程仍然嵌套在for循環(huán)中。
根據(jù)第2章節(jié)對(duì)CFIO軟件結(jié)構(gòu)的分析,可以將CFIO服務(wù)器端對(duì)于I/O請(qǐng)求的處理看做一個(gè)排隊(duì)系統(tǒng)。根據(jù)上文的分析,該排隊(duì)系統(tǒng)到達(dá)分布為確定性的平均到達(dá),服務(wù)規(guī)則為“先到達(dá)先服務(wù)”,其服務(wù)端分布即PnetCDF庫(kù)的處理也可以看作是確定性的平均分布,服務(wù)臺(tái)的個(gè)數(shù)為1,所以進(jìn)程管理和緩沖區(qū)管理的問題可以轉(zhuǎn)化為對(duì)于該排隊(duì)系統(tǒng)中顧客源個(gè)數(shù)以及排隊(duì)長(zhǎng)度的計(jì)算問題。根據(jù)排隊(duì)論可知,排隊(duì)系統(tǒng)達(dá)到穩(wěn)定的條件為:在概率上,一段時(shí)間內(nèi)到達(dá)的顧客總量等于可以被服務(wù)的顧客總量。CFIO服務(wù)器端的I/O到達(dá)有周期性的特點(diǎn),因?yàn)樵撓到y(tǒng)達(dá)到穩(wěn)定的條件是每一個(gè)周期內(nèi)到達(dá)的所有I/O請(qǐng)求都恰好能在該周期內(nèi)被PnetCDF完全處理,即

其中,Si代表一個(gè)周期內(nèi)各個(gè)I/O請(qǐng)求塊的大小,n為I/O進(jìn)程的數(shù)目,Throughput(n)代表了n個(gè)I/O進(jìn)程時(shí)PnetCDF的總體寫入帶寬。對(duì)于I/O進(jìn)程數(shù),必須是計(jì)算進(jìn)程數(shù)約數(shù)這一點(diǎn)需要解釋,是由于CFIO設(shè)計(jì)過程中為了保證負(fù)載均衡和輸出數(shù)據(jù)的局部性,規(guī)定I/O劃分必須為計(jì)算劃分的整數(shù)倍,即I/O進(jìn)程數(shù)必須為計(jì)算進(jìn)程數(shù)的約數(shù)。
而由于I/O請(qǐng)求到達(dá)時(shí)間集中,在I/O到達(dá)階段每一個(gè)I/O請(qǐng)求到達(dá)時(shí)間間隔為1~4 ms,且CFIO服務(wù)器處理機(jī)制為一旦有I/O請(qǐng)求達(dá)到則立即判斷緩沖區(qū)空間是否充裕,以確定是否將I/O請(qǐng)求加入隊(duì)列中,能夠調(diào)用PnetCDF庫(kù)處理I/O請(qǐng)求的時(shí)間極少。因此,可以認(rèn)為緩沖區(qū)的大小需要容納I/O請(qǐng)求最高峰時(shí)所有I/O請(qǐng)求,即

其中,Si代表I/O請(qǐng)求數(shù)量最高峰時(shí)到達(dá)的各個(gè)I/O請(qǐng)求的大小,n為I/O進(jìn)程的數(shù)目,N為預(yù)執(zhí)行時(shí)I/O進(jìn)程的數(shù)目;乘N/n表示正式運(yùn)行時(shí)每一個(gè)I/O進(jìn)行需要接收N/n倍的I/O請(qǐng)求。
根據(jù)式(1)、(2)可知,為了確定I/O進(jìn)程數(shù)目n的大小,需要兩方面的信息:一是目標(biāo)模式程序的相關(guān)I/O特征,包括周期的時(shí)間長(zhǎng)度、I/O請(qǐng)求塊的大小、一個(gè)周期內(nèi)I/O請(qǐng)求塊的數(shù)目;二是運(yùn)行平臺(tái)相關(guān)信息,即不同I/O進(jìn)程數(shù)目下PnetCDF庫(kù)的寫入帶寬。因此,為了解決該問題設(shè)計(jì)了如圖4所示的解決方案。

圖4 參數(shù)自動(dòng)選擇過程圖
通過目標(biāo)地球系統(tǒng)模式程序的預(yù)運(yùn)行利用CFIO庫(kù)收集其I/O請(qǐng)求的痕跡信息,即Trace文件;然后用Trace分析子程序得到目標(biāo)模式程序的I/O特征信息并寫入到配置文件中。同時(shí),對(duì)于每一個(gè)不同的運(yùn)行平臺(tái),需要用帶寬測(cè)試子程序測(cè)試不同I/O進(jìn)程數(shù)目下PnetCDF的聚合寫入帶寬,并將測(cè)試結(jié)果寫入I/O速度記錄文件中。之后,利用配置文件中目標(biāo)模式相關(guān)信息和I/O速度記錄文件中的平臺(tái)相關(guān)信息,通過參數(shù)計(jì)算子程序根據(jù)式(1)、(2)進(jìn)行計(jì)算,得出最后需要的I/O進(jìn)程數(shù)目和緩沖區(qū)大小并打印到屏幕上。最后,可以根據(jù)所得到的參數(shù)對(duì)CFIO進(jìn)行設(shè)置,正式執(zhí)行目標(biāo)模式程序。在此過程中,用戶僅需要通過命令行依次調(diào)用帶寬測(cè)試、Trace分析和參數(shù)計(jì)算三個(gè)子程序,即可自動(dòng)地得到適合于當(dāng)前運(yùn)行平臺(tái)和目標(biāo)地球系統(tǒng)模式的合適參數(shù)。
帶寬測(cè)試子程序負(fù)責(zé)針對(duì)不同的運(yùn)行平臺(tái)測(cè)試不同I/O進(jìn)程數(shù)目下的PnetCDF庫(kù)總體寫入帶寬,在同一個(gè)平臺(tái)上帶寬測(cè)試子程序只需要運(yùn)行一次。該子程序輸入為一個(gè)2的冪的正整數(shù)X,輸出為I/O速度記錄文件。
帶寬測(cè)試子程序的核心是一個(gè)MPI測(cè)試程序,該程序調(diào)用PnetCDF庫(kù)進(jìn)行數(shù)據(jù)輸出,生成500個(gè)變量,每個(gè)變量為一個(gè)二維雙精度浮點(diǎn)數(shù)數(shù)組,數(shù)組大小為4 096×2 048。所有的變量都輸出到同一個(gè)NetCDF文件中,最終文件大小為32 GB,程序的輸出為32 GB除以程序運(yùn)行時(shí)間,即為當(dāng)前進(jìn)程數(shù)目下的PnetCDF庫(kù)的寫入總帶寬。帶寬測(cè)試子程序用腳本從1開始以2的倍增直至X的進(jìn)程數(shù)目調(diào)用MPI測(cè)試程序,并將I/O進(jìn)程數(shù)目和相應(yīng)的I/O寫入帶寬結(jié)果寫入I/O速度記錄文件中。
在實(shí)際CFIO使用過程中,I/O進(jìn)程的數(shù)目可以為不大于計(jì)算進(jìn)程數(shù)的任意正整數(shù),出于效率和成本的考慮,在帶寬測(cè)試子程序中不能夠?qū)τ诿總€(gè)I/O進(jìn)程數(shù)目的PnetCDF寫入帶寬進(jìn)行測(cè)試。僅對(duì)2的正整數(shù)次冪數(shù)目的I/O進(jìn)程I/O帶寬測(cè)試,如果在后續(xù)的參數(shù)選擇子程序計(jì)算中需要用到的I/O進(jìn)程數(shù)目恰好在測(cè)試過的列表中,將會(huì)直接將測(cè)試結(jié)果返回;如果用到帶寬測(cè)試子程序并沒有實(shí)際測(cè)試過的I/O進(jìn)程數(shù)目下的總體寫入帶寬,則需要利用已有的數(shù)據(jù)進(jìn)行估計(jì)。Li等人在對(duì)PnetCDF庫(kù)吞吐量的測(cè)試后發(fā)現(xiàn)[9],其吞吐量的變化趨勢(shì)為先隨著進(jìn)程數(shù)增加而增加,到達(dá)峰值之后再隨著進(jìn)程數(shù)的增加略有回落,實(shí)際測(cè)試的結(jié)果也是如此。這是由于PnetCDF庫(kù)后端調(diào)用了MPI-IO,而MPI-IO的聚合I/O采用兩階段I/O實(shí)現(xiàn)。以讀操作為例,進(jìn)程間通過互相通信交換各自需要讀取的數(shù)據(jù)段進(jìn)而得到一個(gè)全局的I/O視圖,MPI-IO的一個(gè)實(shí)現(xiàn)ROMIO[13]會(huì)根據(jù)全局視圖重新確定每個(gè)進(jìn)程需要讀取的數(shù)據(jù)段,然后執(zhí)行兩階段I/O:第一階段為I/O階段,每個(gè)進(jìn)程分別讀取自己負(fù)責(zé)的數(shù)據(jù)段;第二階段為通信階段,進(jìn)程間通過通信從其他進(jìn)程獲取自己原本應(yīng)該讀取的數(shù)據(jù)段。當(dāng)I/O進(jìn)程較少時(shí),PnetCDF獲益于進(jìn)程增加帶來的并行寫入效率的增加,因此總體吞吐量隨之增加;而受限于底層并行文件系統(tǒng)的寫入帶寬限制,PnetCDF庫(kù)的吞吐量會(huì)達(dá)到峰值;之后隨著進(jìn)程數(shù)的進(jìn)一步增加,兩階段I/O中的通信階段代價(jià)會(huì)隨之增大,因此總體的吞吐量會(huì)略有下降。
為了擬合這種先增加后減小的變化趨勢(shì),采用三次樣條插值算法來對(duì)未知吞吐量數(shù)值進(jìn)行估計(jì)。三次樣條插值算法[14]是一種常見的插值算法,被廣泛應(yīng)用于各種理論研究和實(shí)際問題中,例如圖形圖像領(lǐng)域、數(shù)據(jù)同化領(lǐng)域[15-16]等等。相較于雙線性等算法,三次樣條算法能獲得光滑連續(xù)的插值結(jié)果,更能滿足PnetCDF吞吐量連續(xù)變化的數(shù)據(jù)特點(diǎn),而且可以保證插值后的曲線仍滿足PnetCDF庫(kù)吞吐量先增大后減少的特征。具體的擬合效果將在后續(xù)實(shí)驗(yàn)部分呈現(xiàn)。
Trace分析子程序負(fù)責(zé)根據(jù)I/O Trace文件統(tǒng)計(jì)目標(biāo)地球系統(tǒng)模式程序的I/O特征信息,包括周期時(shí)間長(zhǎng)度、一個(gè)周期內(nèi)I/O請(qǐng)求數(shù)目、I/O平均請(qǐng)求大小等信息,其輸入是目標(biāo)模式程序的I/O Trace文件,輸出為配置文件。
模式的I/O Trace文件是預(yù)執(zhí)行階段產(chǎn)生的,重新編寫了CFIO庫(kù)的兩個(gè)函數(shù),其名稱和功能如表1所示。

表1 函數(shù)名稱及功能
cfio_init函數(shù)是CFIO在PnetCDF接口的基礎(chǔ)上新增加的一個(gè)函數(shù),其主要作用是對(duì)CFIO的客戶端、服務(wù)器進(jìn)行初始化設(shè)置。對(duì)于cfio_init函數(shù),加了一個(gè)標(biāo)志位參數(shù)flag,用flag參數(shù)的值來表示是否需要進(jìn)行I/O Trace輸出,若flag值為0,表示正式運(yùn)行程序,無需進(jìn)行I/O Trace輸出,在cfio_init函數(shù)中將全局變量tracing_flag設(shè)置為0;若flag值為1,表示模式程序處于預(yù)執(zhí)行階段,需要進(jìn)行I/O Trace的輸出,將全局變量tracing_flag設(shè)置為1。cfio_recv函數(shù)是CFIO服務(wù)器用于接收I/O請(qǐng)求并判斷是否將其放入緩沖區(qū)的函數(shù),在cfio_recv函數(shù)中先進(jìn)行判斷tracing_flag的值,如果tracing_flag值為0,則進(jìn)行之前的操作;如果tracing_flag的值為1,則在將I/O請(qǐng)求加入緩沖區(qū)之前,按照維度遍歷各個(gè)維度上count數(shù)組,即維度數(shù)據(jù)大小記錄數(shù)組,將各個(gè)維度大小相乘得到此次I/O請(qǐng)求的數(shù)據(jù)塊大小并同I/O請(qǐng)求到達(dá)時(shí)刻一起輸出到屏幕上,在程序預(yù)執(zhí)行的過程中將打印到屏幕的信息重定向到I/O Trace文件中。
在Trace分析子程序中,先對(duì)I/O Trace文件中I/O請(qǐng)求塊大小信息和時(shí)間信息分開進(jìn)行處理。根據(jù)3.1節(jié)對(duì)于地球系統(tǒng)模式中I/O特征的分析可知,I/O請(qǐng)求大小是分段一致的,為了保證在所有的周期內(nèi)均不發(fā)生堵塞,需要統(tǒng)計(jì)出I/O請(qǐng)求塊的最大值MaxSize并統(tǒng)計(jì)出I/O請(qǐng)求的總數(shù)量SumCount,這些操作僅需要對(duì)Trace中的塊大小信息進(jìn)行一次遍歷即可獲得。而對(duì)于周期的確定則相對(duì)復(fù)雜,首先要對(duì)Trace中的原始時(shí)間信息進(jìn)行處理,CFIO中輸出的時(shí)間是CFIO客戶端啟動(dòng)之后的相對(duì)時(shí)間,單位為ms。為了便于后續(xù)操作,第一遍遍歷以第一次I/O請(qǐng)求發(fā)出時(shí)間為基準(zhǔn)計(jì)算出每一個(gè)I/O請(qǐng)求到達(dá)的相對(duì)時(shí)間,同時(shí)以秒為單位對(duì)相對(duì)時(shí)間進(jìn)行向下取整;之后,第二次遍歷時(shí)間信息,統(tǒng)計(jì)從第0到最后每一秒到達(dá)的I/O請(qǐng)求數(shù)目;第三次遍歷是為了確定整個(gè)I/O過程的中各個(gè)I/O階段請(qǐng)求個(gè)數(shù)最大值信息,記為MaxBlkNum;第四次遍歷是記錄I/O請(qǐng)求個(gè)數(shù)最大值出現(xiàn)的次數(shù)PeriodCount以及峰值第一次出現(xiàn)的時(shí)刻T1和最后一次出現(xiàn)的時(shí)刻Tend,則最后周期時(shí)間長(zhǎng)度:

即用I/O請(qǐng)求個(gè)數(shù)最大值出現(xiàn)的次數(shù)表示在整個(gè)運(yùn)行過程中的周期個(gè)數(shù)PeriodCount,而Tend與T1之間間隔了(PeriodCount-1)個(gè)完整的周期,兩者相除即可得到每一個(gè)周期的時(shí)間長(zhǎng)度。最后Trace分析子程序會(huì)將得到信息:I/O請(qǐng)求塊大小的最大值MaxSize、I/O請(qǐng)求的總數(shù)量SumCount、周期個(gè)數(shù)PeriodCount以及周期時(shí)間長(zhǎng)度T以文本的形式寫入配置文件中輸出。
參數(shù)自動(dòng)選擇程序負(fù)責(zé)根據(jù)記錄在I/O速度記錄文件中的平臺(tái)相關(guān)信息和記錄在配置文件中的目標(biāo)模式相關(guān)I/O特征信息,計(jì)算出合適的CFIO庫(kù)I/O進(jìn)程數(shù)目和緩沖區(qū)大小。其輸入為帶寬測(cè)試子程序和Trace分析子程序的輸出文件即I/O速度記錄文件和配置文件還有預(yù)執(zhí)行時(shí)計(jì)算進(jìn)程的數(shù)目M,預(yù)執(zhí)行時(shí)I/O進(jìn)程數(shù)N,輸出為合適的I/O進(jìn)程數(shù)n和CFIO服務(wù)器端緩沖區(qū)大小BufferSize,并將結(jié)果打印到屏幕上。
整個(gè)計(jì)算過程的偽代碼如圖5所示,在整個(gè)參數(shù)選擇計(jì)算過程中,先根據(jù)I/O Trace文件中的信息計(jì)算出要保證在一個(gè)周期內(nèi)寫入所有I/O請(qǐng)求所需要的PnetCDF寫入帶寬Threshold,即用Trace中I/O請(qǐng)求數(shù)量之和SumCount與周期數(shù)PeriodCount相除得到每個(gè)周期I/O請(qǐng)求的數(shù)量,乘I/O請(qǐng)求塊大小的最大值MaxSize即為每一個(gè)周期最多處理的數(shù)據(jù)總量,再與周期時(shí)長(zhǎng)T相除就可以得到所需要的寫入帶寬。之后,遍歷I/O速度記錄文件,得到S1、S2、S3和P1、P2、P3六個(gè)參數(shù),其中S1表示I/O處理速度的峰值,S2表示在I/O速度上升階段第二大的值,S3表示在I/O速度下降階段第二大的值,而P1、P2、P3表示其各自對(duì)應(yīng)的I/O進(jìn)程數(shù)。接著,對(duì)多種情況展開討論,如果Threshold大于S1,則表明可能的取值會(huì)在(P2,P3)區(qū)間內(nèi),對(duì)區(qū)間內(nèi)所有可以整除計(jì)算進(jìn)程數(shù)量M的值從小到大進(jìn)行遍歷,如果在I/O記錄文件中存在則直接與Threshold值比較,如果不存在則進(jìn)行插值比較,若存在大于Threshold的值則跳出循環(huán)。如果Threshold小于S1,需要找到其所在的速度區(qū)間的最小值S4和最大值S5及其對(duì)應(yīng)的I/O進(jìn)程數(shù)目P4和P5,其中S5有可能與S1、S2重合。之后從小到大遍歷[S4,S5]區(qū)間,對(duì)于每一個(gè)可以被M整除的值對(duì)應(yīng)的總體寫入帶寬進(jìn)行插值操作,如果出現(xiàn)大于Threshold的值將直接跳出循環(huán)。

圖5 參數(shù)選擇程序偽代碼
對(duì)于CFIO服務(wù)器端緩沖區(qū)的大小,根據(jù)公式(2)可知,BufferSize=MaxBlkNum×MaxSize,即I/O請(qǐng)求數(shù)目的峰值與I/O請(qǐng)求塊大小的最大值相乘,可以根據(jù)Trace信息得到結(jié)果。
如果經(jīng)過上述過程沒有得到合適的I/O進(jìn)程參數(shù)即找不到大于Threshold的值,說明該目標(biāo)模式程序的寫入數(shù)量超過了目前平臺(tái)的寫入處理能力,必然會(huì)出現(xiàn)堵塞,需要在寫入速度峰值之前選擇盡量多的I/O進(jìn)程;如果找到了合適的I/O進(jìn)程數(shù)n,將會(huì)連同BufferSize一起打印到屏幕上。
在清華大學(xué)“探索100”百萬億次集群系統(tǒng)上,以海洋模式POP為目標(biāo)程序,對(duì)該參數(shù)自動(dòng)選擇程序進(jìn)行了測(cè)試?!疤剿?00”集群的每個(gè)計(jì)算節(jié)點(diǎn)采用兩個(gè)Intel Xeon X5670六核處理器,每個(gè)處理器主頻為2.39 GHz,配有12 MB Cache;每個(gè)節(jié)點(diǎn)內(nèi)存為32 GB,所有節(jié)點(diǎn)通過InfiniBand QDR通信網(wǎng)絡(luò)實(shí)現(xiàn)高速通信,理論帶寬為40 GB/s;使用Lusture并行文件系統(tǒng)作為其底層文件系統(tǒng),配置為1個(gè)元數(shù)據(jù)服務(wù)器(MDS)和40個(gè)對(duì)象存儲(chǔ)目標(biāo)(OST),實(shí)測(cè)寫帶寬為4 GB/s;計(jì)算節(jié)點(diǎn)運(yùn)行的操作系統(tǒng)為RedHat Enterprise Linux 5.5,所有程序使用Intel編譯器v11.1編譯,MPI版本為Intel MPIv4.0.2。
在“探索100”上運(yùn)行帶寬測(cè)試子程序,指定的最大進(jìn)程數(shù)為256,得到的結(jié)果如表2所示。

表2 不同進(jìn)程數(shù)目下PnetCDF寫入帶寬
為了驗(yàn)證插值算法的有效性,額外測(cè)試了當(dāng)I/O進(jìn)程數(shù)目為12、24、48、96和144時(shí)PnetCDF庫(kù)的總體寫入帶寬的數(shù)值。如圖6所示,其中藍(lán)色圓圈代表帶寬測(cè)試子程序中測(cè)量的寫入帶寬值,綠色曲線代表根據(jù)測(cè)量值插值獲得的曲線,而紅色折線代表了相應(yīng)I/O進(jìn)程數(shù)目時(shí)真實(shí)的寫入帶寬。根據(jù)結(jié)果可以發(fā)現(xiàn),立方插值的結(jié)果反映了PnetCDF庫(kù)總體寫入帶寬先增長(zhǎng)后下降的趨勢(shì)。同時(shí)在I/O進(jìn)程數(shù)值較小時(shí),擬合結(jié)果與實(shí)測(cè)值差距較小,隨著I/O進(jìn)程增大測(cè)量密度的降低,誤差稍有增大,總體效果在可以接受的范圍內(nèi)。

圖6 三次樣條插值效果
POP是美國(guó)洛斯阿拉莫斯國(guó)家實(shí)驗(yàn)室(Los Alamos National Laboratory)開發(fā)的海洋數(shù)值預(yù)報(bào)模式,利用POP模式可以推進(jìn)10年期和大尺度氣候預(yù)測(cè)科學(xué)的發(fā)展,現(xiàn)在已經(jīng)成為許多氣候模擬器中的標(biāo)準(zhǔn)模塊。
在本次實(shí)驗(yàn)中,將POP的重啟動(dòng)文件輸出頻率設(shè)置為每10步一輸出,映像文件和歷史文件設(shè)置為每2步一輸出,程序共運(yùn)行40步,計(jì)算進(jìn)程數(shù)M為120,在預(yù)執(zhí)行階段采用120個(gè)I/O進(jìn)程,CFIO服務(wù)器端緩沖區(qū)大小設(shè)置為3 GB。
利用Trace分析子程序可以得到模式I/O特征信息為:I/O請(qǐng)求塊最大值MaxSize為0.55 MB,I/O請(qǐng)求總數(shù)量SumCount為3 064個(gè),周期個(gè)數(shù)PeriodCount為4,周期時(shí)長(zhǎng)T為110 s。得出的滿足條件的最小寫入帶寬為:
Threshold=120×3 064×0.55/4×110=459.6 MB/s
利用參數(shù)自動(dòng)選擇程序得到I/O進(jìn)程數(shù)目為24,緩沖區(qū)大小為 1 141.25 MB,其中Throughput(24)擬合的結(jié)果為469.876 MB/s,大于Threshold值。
為了驗(yàn)證參數(shù)自動(dòng)選擇程序的正確性,在計(jì)算進(jìn)程數(shù)目固定為120的情況下,分別用I/O進(jìn)程數(shù)為20和24運(yùn)行原有的POP程序,同時(shí)在CFIO服務(wù)器端cfio_recv函數(shù)中,在每一個(gè)請(qǐng)求加入緩沖區(qū)之間輸出已用緩沖區(qū)大小信息和時(shí)間信息,并測(cè)量POP的整體運(yùn)行時(shí)間。
如圖7所示,當(dāng)I/O進(jìn)程為20個(gè)時(shí),在340 s左右由于緩沖區(qū)已滿,CFIO服務(wù)器堵塞不接受新的I/O請(qǐng)求,直到后端PnetCDF庫(kù)處理讓緩沖區(qū)有了新的空間,才會(huì)讓新的I/O請(qǐng)求進(jìn)入緩沖區(qū),所以造成了I/O請(qǐng)求的時(shí)間分布被拉長(zhǎng),且在340 s處出現(xiàn)了每秒只有50個(gè)左右的I/O請(qǐng)求進(jìn)入緩沖區(qū),進(jìn)而影響了模式程序的整體運(yùn)行時(shí)間。當(dāng)I/O進(jìn)程為20個(gè)時(shí),POP運(yùn)行40步需要524.133 s;當(dāng)I/O進(jìn)程為24時(shí),POP運(yùn)行40步僅需要434.038 s。
而對(duì)于已用緩沖區(qū)信息,以秒為單位統(tǒng)計(jì)每秒內(nèi)緩沖區(qū)使用大小最大值,結(jié)果如圖8所示。

圖7 POP計(jì)算進(jìn)程120,計(jì)算進(jìn)程20和24對(duì)比

圖8 CFIO服務(wù)器端緩沖區(qū)使用情況
緩沖區(qū)使用數(shù)量即圖8中藍(lán)色線在程序運(yùn)行過程中始終沒有超過本文通過參數(shù)選擇子程序確定的1 141.25 MB的橫線,即圖中的紅色線。
由以上分析可以認(rèn)為,這套參數(shù)自動(dòng)選擇程序確實(shí)為海洋模式POP選擇了在現(xiàn)有平臺(tái)上的最優(yōu)參數(shù),既滿足了性能的需求又避免了資源的浪費(fèi)。
面向高分辨率地球系統(tǒng)模式的并行I/O庫(kù)CFIO的出現(xiàn),通過I/O轉(zhuǎn)發(fā)技術(shù)實(shí)現(xiàn)了I/O過程與計(jì)算過程的重疊,提高了模式的整體性能。但是,對(duì)于緩沖區(qū)大小和進(jìn)程數(shù)目的管理僅僅依靠過去經(jīng)驗(yàn)式的參數(shù)指定方式會(huì)因?yàn)镮/O過程與計(jì)算過程無法完美重疊而造成性能損失或者資源浪費(fèi),基于CFIO開發(fā)了一套參數(shù)自動(dòng)選擇程序,CFIO的使用者僅需要通過命令行的方式運(yùn)行三個(gè)子程序就可以自動(dòng)地獲得針對(duì)當(dāng)前平臺(tái)當(dāng)前應(yīng)用的CFIO最佳參數(shù)。通過目標(biāo)模式的預(yù)執(zhí)行在CFIO的服務(wù)器端搜集模式I/O相關(guān)信息,并利用Trace分析子程序得出I/O塊大小、數(shù)目等統(tǒng)計(jì)信息,結(jié)合帶寬測(cè)試子程序得到的平臺(tái)吞吐量相關(guān)信息,可以得到將I/O過程完美隱藏在計(jì)算過程中的參數(shù)設(shè)置。
對(duì)這套參數(shù)自動(dòng)選擇程序在POP和CICE兩種分量模式上進(jìn)行了測(cè)試。根據(jù)其提供的結(jié)果對(duì)CFIO進(jìn)行設(shè)置可以發(fā)現(xiàn),在相應(yīng)參數(shù)下,POP和CICE都可以在使用盡量少的計(jì)算資源的情況下取得理論上最好的加速效果,可以讓地學(xué)研究人員在模式中更加方便地使用CFIO。
[1]王斌,周天軍,俞永強(qiáng).地球系統(tǒng)模式發(fā)展展望[J].氣象學(xué)報(bào),2008,66(6):857-869.
[2]Strand G.Community earth system model data management:policies and challenges[J].Procedia Computer Science,2011,4:558-566.
[3]Huang X M,Wang W C,F(xiàn)u H H,et al.A fast input/output library for high-resolution climate models[J].Geoscientific Model Development,2014,7(1):93-103.
[4]Dennis J M,Edwards J,Loy R,et al.An application-level parallel I/O library for Earth system models[J].International Journal of High Performance Computing Applications,2012,26(1):43-53.
[5]Docan C,Parashar M,Klasky S.Enabling high speed asynchronousdataextraction and transferusing DART[J].Concurrency and Computation:Practice and Experience,2010,22(9):1181-1204.
[6]Lawrence D,Yang L,Oleson K,et al.Community earth system model[Z].2010-10.
[7]Corbett P,F(xiàn)eitelson D,F(xiàn)ineberg S,et al.Overview of the MPI-IO parallel I/O interface[M]//Input/Output in Parallel and Distributed Computer Systems.[S.l.]:Springer US,1996:127-146.
[8]Rew R,Davis G.NetCDF:an interface for scientific data access[J].Computer Graphics and Applications,1990,10(4):76-82.
[9]Li J,Liao W,Choudhary A,et al.Parallel netCDF:a highperformance scientific I/O interface[C]//Supercomputing,2003 ACM/IEEE Conference.[S.l.]:IEEE,2003.
[10]Recio R,Culley P,Garcia D,et al.An RDMA protocol specification,IETF Internet-draft draft-ietf-rddp-rdmap-03.txt(work in progress)[R].2005.
[11]Smith R D,Gent P R.Reference manual for the Parallel Ocean Program(POP),ocean component of the Community Climate System Model(CCSM2.0 and 3.0),TechnicalReportLA-UR-02-2484[R].Los AlamosNational Laboratory,2002.
[12]Hunke E C,Lipscomb W H.CICE:the Los Alamos sea ice model documentation and software user’s manual,Tech Rep LA-CC-06012[R].Los Alamos National Laboratory,2004.
[13]Thakur R,Gropp W,Lusk E.Data sieving and collective I/O in ROMIO[C]//Proceedingsofthe 7th Symposium on Frontiers of Massively Parallel Computation(Frontiers’99).[S.l.]:IEEE,1999:182-189.
[14]李慶揚(yáng),王能超,易大義.數(shù)值分析[M].5版.北京:清華大學(xué)出版社,2008:41-44.
[15]Endr?di G.Multidimensional spline integration of scattered data[J].Computer Physics Communications,2011(6):1307-1314.
[16]Fahmy M F,F(xiàn)ahmy G,F(xiàn)ahmy O F.B-spline wavelets for signal denoising and image compression[J].Signal,Image and Video Processing,2011,5(2):141-153.