單維鋒,陳福明,李 軍
(防災(zāi)科技學院 災(zāi)害信息工程系,河北 三河 065201)
多核環(huán)境下潮汐分析輔助軟件并行繪制技術(shù)研究
單維鋒,陳福明,李 軍
(防災(zāi)科技學院 災(zāi)害信息工程系,河北 三河 065201)
為方便科研人員使用Baytap-G潮汐分析軟件,基于C#.NET程序設(shè)計語言設(shè)計了一套潮汐分析輔助軟件,實現(xiàn)了Baytap-G軟件的封裝,完成了輸入數(shù)據(jù)格式的自動轉(zhuǎn)換、輸出數(shù)據(jù)的自動提取,以及水位、振幅、相位數(shù)據(jù)的可視化展示;在介紹C#.NET語言中任務(wù)(TASK)并行編程模型的基礎(chǔ)上,詳細討論了繪制振幅、相位圖任務(wù)分解、并行化程序設(shè)計考慮及其實現(xiàn);實驗結(jié)果表明,合理設(shè)計并行程序可以充分利用多核計算機的計算資源,提升程序運行效率,但是過多的任務(wù)數(shù)、不均勻的工作負載通常會影響并行程序的效率。
多核;潮汐分析;并行;繪制;任務(wù)
多年來,國內(nèi)外研究人員廣泛開展了潮汐應(yīng)力與地震活動性關(guān)系的研究,探索地震孕育規(guī)律[1-4]。近年來,開始研究固體潮的相位變化及其與孕震有關(guān)聯(lián)的潮汐參數(shù)變化和地震相關(guān)關(guān)系研究。重力固體潮汐的研究工作主要是通過對觀測數(shù)據(jù)實施調(diào)和分析獲得相關(guān)參數(shù)(振幅因子和相位滯后),然后研究這些數(shù)據(jù)的變化與地震之間的關(guān)系[5]。
Baytap-G是國際上廣泛應(yīng)用的固體潮觀測數(shù)據(jù)分析軟件[6],由日本Tamura博士研制,Baytap-G軟件使用Fortran語言編寫。由于Baytap -G軟件參數(shù)眾多,科研人員經(jīng)常因為參數(shù)配置問題或數(shù)據(jù)格式問題,導(dǎo)致運行錯誤;其次,軟件要求的輸入數(shù)據(jù)格式和科研人員下載到的水位數(shù)據(jù)格式不同,不僅需要進行數(shù)據(jù)格式轉(zhuǎn)換,而且需要將開始時間、數(shù)據(jù)記錄總條數(shù)等信息同時寫入到數(shù)據(jù)文件和參數(shù)配置文件中,工作繁雜,易于出錯,從而導(dǎo)致計算結(jié)果錯誤;此外,輸出文件中雖然包含了各個波的振幅、相位、潮汐因子等數(shù)據(jù),但是除此之外還有很多其它輔助數(shù)據(jù),數(shù)據(jù)可讀性差、波形參數(shù)數(shù)據(jù)提取困難,迫切需要一套輔助軟件幫助科研人員形象直觀的完成參數(shù)配置、輸入數(shù)據(jù)格式自動轉(zhuǎn)換,數(shù)據(jù)自動填充,并從計算結(jié)果中快速提取振幅、相位、影響因子等波形數(shù)據(jù),實現(xiàn)原始水位數(shù)據(jù)、振幅、相位數(shù)據(jù)和地震震級數(shù)據(jù)的可視化展示。
此外,隨著多核時代的到來,傳統(tǒng)的串行程序難以利用現(xiàn)有多核計算機的CPU計算資源。以多線程技術(shù)為代表的并行程序設(shè)計技術(shù)能夠有效地發(fā)揮多核CPU的計算能力,并可顯著提高程序的執(zhí)行效率。雖然多線程技術(shù)在單核時代已經(jīng)存在了數(shù)十年,但只有在多核計算機或多CPU計算機上才真正實現(xiàn)了并行化。因此,隨著多核CPU的普及,軟件由串行編程時代開始步入并行編程時代。很多軟件設(shè)計已經(jīng)開始充分考慮多核資源的利用[7]。
本文研制的Baytap-G潮汐分析輔助軟件就是為了方便科研人員的使用,應(yīng)用C#.NET編程語言對Baytap-G軟件進行了封裝,完成了輸入數(shù)據(jù)格式的自動轉(zhuǎn)換和輸出數(shù)據(jù)的自動提取,實現(xiàn)了水位、振幅、相位數(shù)據(jù)的并行可視化,降低了使用難度。
本文在介紹潮汐分析輔助軟件及C#.NET編程語言中基于任務(wù)的新并發(fā)編程技術(shù)的基礎(chǔ)上,分析了并行繪制圖形關(guān)鍵技術(shù),通過對比實驗分析了軟件并行化后的繪制性能。
Baytap-G潮汐分析輔助軟件采用SDI程序風格,包含“系統(tǒng)”、“潮汐數(shù)據(jù)處理”和“關(guān)于”3個主菜單項,如圖1所示?!跋到y(tǒng)”菜單項下面包含“退出”子菜單項?!俺毕珨?shù)據(jù)處理”下包含“潮汐分析”、“繪制水位圖”、“繪制振幅相位圖”等功能,功能較為簡單。
圖1 Baytap-G潮汐分析輔助軟件
“潮汐分析”功能是對Baytap-G軟件的封裝,首先,軟件將用戶在本界面錄入的各種參數(shù)信息以及選擇的水位數(shù)據(jù)文件,按照Baytap-G軟件格式保存到參數(shù)文件input05.dat、input12.dat和input14.dat(如果包含氣壓數(shù)據(jù))文件中。然后,調(diào)用baytap-G軟件進行計算,計算完成后,會自動從baytap-G軟件輸出文件output06.dat中提取各個波形數(shù)據(jù),保存到用戶指定的輸出文件夾下,每個波形數(shù)據(jù)保存為一個文件,命名為Sheet_xxx.txt,其中xxx表示波的名稱如O1、M2、N2等,最多12個波。在該文件中,每行為一條記錄,包含了時間、振幅、相位、誤差等數(shù)據(jù),中間用逗號分隔,時間僅記錄每次潮汐計算的開始時間。
通過對Baytap-G程序進行分析,發(fā)現(xiàn)如果輸入的水位數(shù)據(jù)多,SPAN和SHIFT參數(shù)設(shè)置較小情況下,計算工作量會非常大。但由于Baytap-G程序每個SPAN數(shù)據(jù)的計算依賴于用戶選擇的起始數(shù)據(jù)和以前的計算結(jié)果,因此難以并行化。
此外,由于“繪制水位圖”是對用戶待處理水位數(shù)據(jù)的簡單可視化實現(xiàn),計算任務(wù)量并不大,因此也沒有必要進行并行化。程序運行界面如圖2所示。
圖2 水位圖
繪制振幅、相位圖是為了直觀形象的對比分析各個波形數(shù)據(jù)和水位數(shù)據(jù)及地震之間的關(guān)系,如圖3所示。用戶點擊“選擇數(shù)據(jù)文件夾”后面的瀏覽按鈕,選擇存放baytap-G輸出數(shù)據(jù)的文件夾,然后直接點擊“繪制”按鈕,就可以同時將水位數(shù)據(jù)、振幅數(shù)據(jù)和相位數(shù)據(jù)繪制在界面上。用戶可以通過選擇SYMBOL后面下拉框的值繪制不同的波形數(shù)據(jù)圖,用戶也可以定制曲線的顏色,以及繪制的刻度數(shù)等參數(shù),調(diào)整圖形。水位數(shù)據(jù)、振幅數(shù)據(jù)和相位數(shù)據(jù)使用相同的時間軸,以便進行對比,但是X軸刻度可以分別進行調(diào)整。在水位數(shù)據(jù)中,僅將缺數(shù)數(shù)據(jù)簡單置為0,因此從圖3可以看出水位有多處突升和突降。圖4的下半部分是振幅、相位數(shù)據(jù),由于其意義和取值范圍存在很大差別,因此將右側(cè)作為振幅的Y軸,左側(cè)作為相位的Y軸,共用一個X時間軸,根據(jù)實際取值等比縮放在一個相同的Y軸空間內(nèi)。通過此圖,可以直觀的觀察水位數(shù)據(jù)和波形數(shù)據(jù)之間的關(guān)系。
此外,如果在圖3中點擊“選擇震級Excel”標簽后的“瀏覽”按鈕,指定了地震目錄數(shù)據(jù),還可以根據(jù)地震的發(fā)震時刻,將震級數(shù)據(jù)同時繪制在此界面上,每個震級用下箭頭表示。地震目錄Excel文件要依次包含發(fā)震日期、年、月、日、時間、震級、經(jīng)度、維度、深度等信息,否則無法正常標注。
由此可見,振幅相位圖繪制功能計算任務(wù)繁重,如果采用傳統(tǒng)的串行編程模式,一方面難以發(fā)揮多核計算機的計算能力,另一方面由于串行計算時間長,用戶需要更長的等待時間。在確定了繪制坐標原點、繪制長度和高度之后,完全可以并行繪制水位圖、振幅圖和相位圖,因為這些任務(wù)之間幾乎沒有依賴關(guān)系。
圖3 振幅相位圖面
隨著多核時代的到來,傳統(tǒng)的串行程序難以利用現(xiàn)有計算機的多核CPU計算資源,多線程技術(shù)可以有效地發(fā)揮多核CPU的計算能力,在很大程度上提高程序的運行效率。雖然多線程技術(shù)在單核時代已經(jīng)存在了數(shù)十年,但是多線程在實際執(zhí)行時,在同一個時刻只有一個線程處于活動狀態(tài)。而在多核時代,多個線程可以同時并行執(zhí)行。由于多核體系結(jié)構(gòu)和單核體系結(jié)構(gòu)在緩存和線程優(yōu)先級等方面存在巨大的差別,在設(shè)計多線程應(yīng)用程序時,需要仔細分配各個線程的工作負載才可能達到最高的性能。眾所周知,在基于多線程技術(shù)的并行程序設(shè)計中,軟件開發(fā)者必須通過鎖、信號量等同步機制來進行細粒度的控制,導(dǎo)致開發(fā)難度大、難以理解、難以檢驗等諸多問題。
微軟在發(fā)布的 .NET Framework 4.0中增強了其并行編程功能,引入了一個新的概念——任務(wù)。作為并行計算的重要組成部分,任務(wù)是對傳統(tǒng)線程池技術(shù)的一個補充和完善。眾所周知,在使用線程池技術(shù)時,一旦把要執(zhí)行的任務(wù)放進去后,就無法通過內(nèi)置的方式知曉任務(wù)何時才能執(zhí)行完成。任務(wù)相比線程池有更小的開銷和精確的控制方式,這使得多核環(huán)境下并行編程變得相對簡單。
在.NET Framework 4.0的中System.Threading.Tasks 命名空間下包含了任務(wù)相關(guān)類,如果執(zhí)行的任務(wù)不需要返回值,可以使用Task類,若需要處理返回值,可以使用Task
有兩種方式創(chuàng)建任務(wù),一種是通過Task.Factory.StartNew方法來創(chuàng)建一個新任務(wù),任務(wù)創(chuàng)建完成,其中的代碼被馬上執(zhí)行。
另一種方法是通過Task類的構(gòu)造函數(shù)來創(chuàng)建一個新任務(wù),如:
Task task = new Task( ()=>Console.WriteLine(“Test Task!”));
用此方法時,只是把要完成的工作交給任務(wù),但任務(wù)并未真正開始執(zhí)行。需要調(diào)用任務(wù)對象task的Start方法,任務(wù)才會在將來某個時候開始執(zhí)行。
此外,還可以調(diào)用Task類的WaitAll或WaitAny方法來等待一組或任意一個任務(wù)的完成,也可以調(diào)用某個具體任務(wù)的IsCompleted屬性來判斷任務(wù)是否完成。
由此可見,相對于線程池技術(shù),任務(wù)提供了更易于理解的封裝,具有更易用的訪問接口,特別適合任務(wù)并行等同步操作較少的場合。
3.1 初步任務(wù)分解
并行繪制振幅相位圖,首先是對數(shù)據(jù)進行預(yù)處理,把水位數(shù)據(jù)和震級數(shù)據(jù)合并為一個內(nèi)存結(jié)構(gòu)中(如鏈表),在處理過程中順便求出水位的最大值和最小值,以便等比例縮放水位數(shù)據(jù),同時將缺數(shù)數(shù)據(jù)置為0。然后根據(jù)選擇的波,讀取波形數(shù)據(jù)文件中的時間、振幅、相位數(shù)據(jù),并分別找出振幅和相位數(shù)據(jù)的最大值和最小值,以便計算并繪制高度。接著需要定義水位、震級圖(圖3上半部分)坐標原點、高度和寬度,定義振幅、相位圖(圖3下半部分)的坐標原點、高度和寬度,其中上、下兩部分圖的寬度相同,以便對比分析。上述任務(wù)完成后,就可以繪制坐標軸、水位、振幅、相位了。所以一種可能的任務(wù)分解如圖5所示。
圖4 初步任務(wù)分解圖
3.2 并行任務(wù)實現(xiàn)
雖然可以將圖4中的每個任務(wù)直接映射到C#.NET中任務(wù),從而實現(xiàn)并行化軟件改造,但是由于任務(wù)最終通過線程技術(shù)實現(xiàn),因此任務(wù)太多,導(dǎo)致線程調(diào)度過于頻繁,無謂的消耗會影響系統(tǒng)的性能。此外,還需要考慮任務(wù)之間的負載均衡問題,系統(tǒng)的運行時間取決于最后任務(wù)執(zhí)行完畢的時間。
因此,考慮到震級的數(shù)據(jù)量遠遠小于水位數(shù)據(jù),將繪制水位圖和繪制震級任務(wù)合并為一個任務(wù)。另外,由于潮汐計算產(chǎn)生的振幅、相位數(shù)據(jù)依賴于SHIFT參數(shù)的設(shè)置,數(shù)據(jù)量約為水位/SHIFT,因此遠小于水位數(shù)據(jù)個數(shù),因此將繪制振幅和相位圖、繪制坐標任務(wù)合并一個新的任務(wù)。此外,將定義坐標及其之前的所有任務(wù)合并為一個并行任務(wù)。設(shè)計完成后,程序?qū)嶋H的并行任務(wù)模型如圖5所示,僅包含3個任務(wù)。
圖5 任務(wù)執(zhí)行圖
將上述每個功能任務(wù)封裝為一個方法,然后通過Task.Factory.StartNew方法創(chuàng)建并執(zhí)行一個任務(wù),核心代碼如下:
Task t1 = Task.Factory.StartNew(() =>
{
處理水位數(shù)據(jù);
處理震級數(shù)據(jù);
合并水位/震級數(shù)據(jù);
處理潮汐分析數(shù)據(jù);
定義坐標;
});
Task t2 = t1.ContinueWith(t =>
{
繪制水位圖;
繪制震級;
});
Task t3 = t1.ContinueWith(t =>
{
繪制振幅圖;
繪制相位圖;
});
在上述代碼中任務(wù)象t1的ContinueWith方法表示等待t1任務(wù)完成后再執(zhí)行方法主體部分的代碼,即任務(wù)t1執(zhí)行完成后才會執(zhí)行t2和t3任務(wù),所以t1和t2之間是串行執(zhí)行,t1和t3之間也是串行執(zhí)行,但是t2和t3是并行執(zhí)行的。
為了對比潮汐分析輔助軟件并行化前后系統(tǒng)的性能,通過本軟件的潮汐分析功能產(chǎn)生了7組潮汐分析數(shù)據(jù)。繪圖數(shù)據(jù)包括水位、振幅、相位數(shù)據(jù)。理論上,并行繪制技術(shù)涉及到線程的創(chuàng)建、調(diào)度等額外開銷,在處理的數(shù)據(jù)規(guī)模較大和任務(wù)分配較為平均的情況下,會有較大的性能提升。因此,考慮到各種情況,選取測試用例如表1所示。
T5測試用例數(shù)據(jù)最少,T4用例的水位數(shù)據(jù)最多,T6和T7測試了相同水位個數(shù)下不同振幅/相位數(shù)的情況。各測試用例的結(jié)果如圖7所示,每個用例分別運行5次,然后取平均運行時間作為該用例的耗時時間。
表1 測試用例
圖6 測試結(jié)果圖
在圖6中,橫坐標為測試用例,縱坐標為串行程序或并行程序的運行耗時。無論是串行程序還是并行程序,都是隨著處理數(shù)據(jù)量的增加而處理時間有所增長??偟膩砜矗绦虿⑿谢?,系統(tǒng)的運行時間有所縮短,在所有的測試用例中,并行程序的耗時都比串行程序低,并行程序性能明顯高于串行程序。在測試用例T4中,并行性能大大高于串行程序性能,表明當程序運算任務(wù)繁重時,并行程序可以顯著改善串行程序的性能,相反并行程序并不具有優(yōu)勢,如T5用例,水位數(shù)據(jù)和振幅相位數(shù)據(jù)都最少,系統(tǒng)并行化性能提升非常有限。T6、T7的水位數(shù)據(jù)相同,T6振幅相位數(shù)據(jù)多于T7,換句話說,根據(jù)3.2節(jié)任務(wù)的劃分,T6中任務(wù)t2和t3負載較T7更均衡一些,因此T6并行性能明顯高于T7。
在實際測試也發(fā)現(xiàn),如果任務(wù)數(shù)目過多或負載分配不均衡會大大影響并行程序的性能。
本文基于C#.NET程序設(shè)計語言中任務(wù)機制實現(xiàn)了Baytap-G潮汐分析輔助軟件并行繪制振幅、相位圖功能,并就相關(guān)技術(shù)和關(guān)鍵細節(jié)進行闡述。程序并行化后,系統(tǒng)運行效率有了較大提升。但是相對于串行程序而言,并行編程仍然存在很大挑戰(zhàn),如何設(shè)計數(shù)目合理的任務(wù)、如何處理任務(wù)之間的關(guān)系、如何合理分配任務(wù)都會影響到系統(tǒng)的性能。任何一個環(huán)節(jié)處理不好,都有可能適得其反,這也是當前并行程序設(shè)計存在的主要難點。
[1] 張 晶,陳榮華,楊林章,等. 強震前形變潮汐異常判識與機理研究[J].地震學報,2006,28(2):150-157
[2] 廖 欣,劉春平,楊賢和, 等. 承壓井水位對含水層潮汐應(yīng)力響應(yīng)是否滿足不排水條件的檢驗[J].地震學報, 2011,33(2):234-242,270
[3] 熊 峰, 張 起, 查 斯, 等. 海拉爾地震臺重力潮汐擾動分析[J]. 山西地震, 2015(2):21-23
[4] 陳志遙,呂品姬,李正媛,等.汶川Ms8.0地震前的潮汐變化分析[J].大地測量與地球動力學,2009,29(4):48-50
[5] 陳曉東,孫和平. 一種新的重力潮汐數(shù)據(jù)預(yù)處理和分析方法[J].大地測量與地球動力學,2002,22(3):83-87
[6] Tamura Y, Sato T, et al.A procedure for tidal analysis with a Bayesian information criterion[J]. Geophysical Journal International, 1991(104):507-516
[7] 潘佳賓,胡越黎,陳曉君,等.基于多核的車牌識別的架構(gòu)實現(xiàn)[J].計算機測量與控制,2015,23(1):213-217.
Research on Parallel Drawing Technology of Tide Analysis Aided Software Under Multi-core Environment
Shan Weifeng, Chen Fuming, Li Jun, Wang Jinfeng
(Department of Disaster Information Engineering, Institute of Disaster Prevention, Sanhe 065201, China)
In order to help researcher to use Baytap conveniently, a new tide analysis aided software based on C#.NET programming language is designed, which encapsulates the Baytap-G software, and automatically transfer the input data into the target format. It also provides the ability of data extraction from the Baytap-G output data file and visual drawing for water level, phase and amplitude data. After introducing of TASK parallel programming model in C#.NET language, the paper analyzes the task decomposition of drawing diagram for the water level, amplitude and phase data, then gives the design and implement consideration of parallel program. The experimental results show that the reasonable design of parallel programs can make full use of multi-core computer computing resources, and improve the efficiency of the program. However, too much tasks and uneven workload usually seriously affect the efficiency of parallel program.
multi-core; tide analysis; parallel; drawing; task
2017-02-14;
2017-03-07。
中國地震局教師科研基金(20130111);國家自然科學基金(41504037);地震科技星火計劃(XH16059);中央高校基本科研業(yè)務(wù)費專項資金(創(chuàng)新項目團隊資助計劃)(ZY20160106)。
單維鋒(1977-),男,山東茌平人,博士,副教授,主要從事地震大數(shù)據(jù)、可視化技術(shù)方向的研究。
1671-4598(2017)05-0140-03
10.16526/j.cnki.11-4762/tp.2017.05.039
TP311
A