單維鋒,陳福明,李 軍
(防災科技學院 災害信息工程系,河北 三河 065201)
多核環境下潮汐分析輔助軟件并行繪制技術研究
單維鋒,陳福明,李 軍
(防災科技學院 災害信息工程系,河北 三河 065201)
為方便科研人員使用Baytap-G潮汐分析軟件,基于C#.NET程序設計語言設計了一套潮汐分析輔助軟件,實現了Baytap-G軟件的封裝,完成了輸入數據格式的自動轉換、輸出數據的自動提取,以及水位、振幅、相位數據的可視化展示;在介紹C#.NET語言中任務(TASK)并行編程模型的基礎上,詳細討論了繪制振幅、相位圖任務分解、并行化程序設計考慮及其實現;實驗結果表明,合理設計并行程序可以充分利用多核計算機的計算資源,提升程序運行效率,但是過多的任務數、不均勻的工作負載通常會影響并行程序的效率。
多核;潮汐分析;并行;繪制;任務
多年來,國內外研究人員廣泛開展了潮汐應力與地震活動性關系的研究,探索地震孕育規律[1-4]。近年來,開始研究固體潮的相位變化及其與孕震有關聯的潮汐參數變化和地震相關關系研究。重力固體潮汐的研究工作主要是通過對觀測數據實施調和分析獲得相關參數(振幅因子和相位滯后),然后研究這些數據的變化與地震之間的關系[5]。
Baytap-G是國際上廣泛應用的固體潮觀測數據分析軟件[6],由日本Tamura博士研制,Baytap-G軟件使用Fortran語言編寫。由于Baytap -G軟件參數眾多,科研人員經常因為參數配置問題或數據格式問題,導致運行錯誤;其次,軟件要求的輸入數據格式和科研人員下載到的水位數據格式不同,不僅需要進行數據格式轉換,而且需要將開始時間、數據記錄總條數等信息同時寫入到數據文件和參數配置文件中,工作繁雜,易于出錯,從而導致計算結果錯誤;此外,輸出文件中雖然包含了各個波的振幅、相位、潮汐因子等數據,但是除此之外還有很多其它輔助數據,數據可讀性差、波形參數數據提取困難,迫切需要一套輔助軟件幫助科研人員形象直觀的完成參數配置、輸入數據格式自動轉換,數據自動填充,并從計算結果中快速提取振幅、相位、影響因子等波形數據,實現原始水位數據、振幅、相位數據和地震震級數據的可視化展示。
此外,隨著多核時代的到來,傳統的串行程序難以利用現有多核計算機的CPU計算資源。以多線程技術為代表的并行程序設計技術能夠有效地發揮多核CPU的計算能力,并可顯著提高程序的執行效率。雖然多線程技術在單核時代已經存在了數十年,但只有在多核計算機或多CPU計算機上才真正實現了并行化。因此,隨著多核CPU的普及,軟件由串行編程時代開始步入并行編程時代。很多軟件設計已經開始充分考慮多核資源的利用[7]。
本文研制的Baytap-G潮汐分析輔助軟件就是為了方便科研人員的使用,應用C#.NET編程語言對Baytap-G軟件進行了封裝,完成了輸入數據格式的自動轉換和輸出數據的自動提取,實現了水位、振幅、相位數據的并行可視化,降低了使用難度。
本文在介紹潮汐分析輔助軟件及C#.NET編程語言中基于任務的新并發編程技術的基礎上,分析了并行繪制圖形關鍵技術,通過對比實驗分析了軟件并行化后的繪制性能。
Baytap-G潮汐分析輔助軟件采用SDI程序風格,包含“系統”、“潮汐數據處理”和“關于”3個主菜單項,如圖1所示。“系統”菜單項下面包含“退出”子菜單項。“潮汐數據處理”下包含“潮汐分析”、“繪制水位圖”、“繪制振幅相位圖”等功能,功能較為簡單。

圖1 Baytap-G潮汐分析輔助軟件
“潮汐分析”功能是對Baytap-G軟件的封裝,首先,軟件將用戶在本界面錄入的各種參數信息以及選擇的水位數據文件,按照Baytap-G軟件格式保存到參數文件input05.dat、input12.dat和input14.dat(如果包含氣壓數據)文件中。然后,調用baytap-G軟件進行計算,計算完成后,會自動從baytap-G軟件輸出文件output06.dat中提取各個波形數據,保存到用戶指定的輸出文件夾下,每個波形數據保存為一個文件,命名為Sheet_xxx.txt,其中xxx表示波的名稱如O1、M2、N2等,最多12個波。在該文件中,每行為一條記錄,包含了時間、振幅、相位、誤差等數據,中間用逗號分隔,時間僅記錄每次潮汐計算的開始時間。
通過對Baytap-G程序進行分析,發現如果輸入的水位數據多,SPAN和SHIFT參數設置較小情況下,計算工作量會非常大。但由于Baytap-G程序每個SPAN數據的計算依賴于用戶選擇的起始數據和以前的計算結果,因此難以并行化。
此外,由于“繪制水位圖”是對用戶待處理水位數據的簡單可視化實現,計算任務量并不大,因此也沒有必要進行并行化。程序運行界面如圖2所示。

圖2 水位圖
繪制振幅、相位圖是為了直觀形象的對比分析各個波形數據和水位數據及地震之間的關系,如圖3所示。用戶點擊“選擇數據文件夾”后面的瀏覽按鈕,選擇存放baytap-G輸出數據的文件夾,然后直接點擊“繪制”按鈕,就可以同時將水位數據、振幅數據和相位數據繪制在界面上。用戶可以通過選擇SYMBOL后面下拉框的值繪制不同的波形數據圖,用戶也可以定制曲線的顏色,以及繪制的刻度數等參數,調整圖形。水位數據、振幅數據和相位數據使用相同的時間軸,以便進行對比,但是X軸刻度可以分別進行調整。在水位數據中,僅將缺數數據簡單置為0,因此從圖3可以看出水位有多處突升和突降。圖4的下半部分是振幅、相位數據,由于其意義和取值范圍存在很大差別,因此將右側作為振幅的Y軸,左側作為相位的Y軸,共用一個X時間軸,根據實際取值等比縮放在一個相同的Y軸空間內。通過此圖,可以直觀的觀察水位數據和波形數據之間的關系。
此外,如果在圖3中點擊“選擇震級Excel”標簽后的“瀏覽”按鈕,指定了地震目錄數據,還可以根據地震的發震時刻,將震級數據同時繪制在此界面上,每個震級用下箭頭表示。地震目錄Excel文件要依次包含發震日期、年、月、日、時間、震級、經度、維度、深度等信息,否則無法正常標注。
由此可見,振幅相位圖繪制功能計算任務繁重,如果采用傳統的串行編程模式,一方面難以發揮多核計算機的計算能力,另一方面由于串行計算時間長,用戶需要更長的等待時間。在確定了繪制坐標原點、繪制長度和高度之后,完全可以并行繪制水位圖、振幅圖和相位圖,因為這些任務之間幾乎沒有依賴關系。

圖3 振幅相位圖面
隨著多核時代的到來,傳統的串行程序難以利用現有計算機的多核CPU計算資源,多線程技術可以有效地發揮多核CPU的計算能力,在很大程度上提高程序的運行效率。雖然多線程技術在單核時代已經存在了數十年,但是多線程在實際執行時,在同一個時刻只有一個線程處于活動狀態。而在多核時代,多個線程可以同時并行執行。由于多核體系結構和單核體系結構在緩存和線程優先級等方面存在巨大的差別,在設計多線程應用程序時,需要仔細分配各個線程的工作負載才可能達到最高的性能。眾所周知,在基于多線程技術的并行程序設計中,軟件開發者必須通過鎖、信號量等同步機制來進行細粒度的控制,導致開發難度大、難以理解、難以檢驗等諸多問題。
微軟在發布的 .NET Framework 4.0中增強了其并行編程功能,引入了一個新的概念——任務。作為并行計算的重要組成部分,任務是對傳統線程池技術的一個補充和完善。眾所周知,在使用線程池技術時,一旦把要執行的任務放進去后,就無法通過內置的方式知曉任務何時才能執行完成。任務相比線程池有更小的開銷和精確的控制方式,這使得多核環境下并行編程變得相對簡單。
在.NET Framework 4.0的中System.Threading.Tasks 命名空間下包含了任務相關類,如果執行的任務不需要返回值,可以使用Task類,若需要處理返回值,可以使用Task
有兩種方式創建任務,一種是通過Task.Factory.StartNew方法來創建一個新任務,任務創建完成,其中的代碼被馬上執行。
另一種方法是通過Task類的構造函數來創建一個新任務,如:
Task task = new Task( ()=>Console.WriteLine(“Test Task!”));
用此方法時,只是把要完成的工作交給任務,但任務并未真正開始執行。需要調用任務對象task的Start方法,任務才會在將來某個時候開始執行。
此外,還可以調用Task類的WaitAll或WaitAny方法來等待一組或任意一個任務的完成,也可以調用某個具體任務的IsCompleted屬性來判斷任務是否完成。
由此可見,相對于線程池技術,任務提供了更易于理解的封裝,具有更易用的訪問接口,特別適合任務并行等同步操作較少的場合。
3.1 初步任務分解
并行繪制振幅相位圖,首先是對數據進行預處理,把水位數據和震級數據合并為一個內存結構中(如鏈表),在處理過程中順便求出水位的最大值和最小值,以便等比例縮放水位數據,同時將缺數數據置為0。然后根據選擇的波,讀取波形數據文件中的時間、振幅、相位數據,并分別找出振幅和相位數據的最大值和最小值,以便計算并繪制高度。接著需要定義水位、震級圖(圖3上半部分)坐標原點、高度和寬度,定義振幅、相位圖(圖3下半部分)的坐標原點、高度和寬度,其中上、下兩部分圖的寬度相同,以便對比分析。上述任務完成后,就可以繪制坐標軸、水位、振幅、相位了。所以一種可能的任務分解如圖5所示。

圖4 初步任務分解圖
3.2 并行任務實現
雖然可以將圖4中的每個任務直接映射到C#.NET中任務,從而實現并行化軟件改造,但是由于任務最終通過線程技術實現,因此任務太多,導致線程調度過于頻繁,無謂的消耗會影響系統的性能。此外,還需要考慮任務之間的負載均衡問題,系統的運行時間取決于最后任務執行完畢的時間。
因此,考慮到震級的數據量遠遠小于水位數據,將繪制水位圖和繪制震級任務合并為一個任務。另外,由于潮汐計算產生的振幅、相位數據依賴于SHIFT參數的設置,數據量約為水位/SHIFT,因此遠小于水位數據個數,因此將繪制振幅和相位圖、繪制坐標任務合并一個新的任務。此外,將定義坐標及其之前的所有任務合并為一個并行任務。設計完成后,程序實際的并行任務模型如圖5所示,僅包含3個任務。

圖5 任務執行圖
將上述每個功能任務封裝為一個方法,然后通過Task.Factory.StartNew方法創建并執行一個任務,核心代碼如下:
Task t1 = Task.Factory.StartNew(() =>
{
處理水位數據;
處理震級數據;
合并水位/震級數據;
處理潮汐分析數據;
定義坐標;
});
Task t2 = t1.ContinueWith(t =>
{
繪制水位圖;
繪制震級;
});
Task t3 = t1.ContinueWith(t =>
{
繪制振幅圖;
繪制相位圖;
});
在上述代碼中任務象t1的ContinueWith方法表示等待t1任務完成后再執行方法主體部分的代碼,即任務t1執行完成后才會執行t2和t3任務,所以t1和t2之間是串行執行,t1和t3之間也是串行執行,但是t2和t3是并行執行的。
為了對比潮汐分析輔助軟件并行化前后系統的性能,通過本軟件的潮汐分析功能產生了7組潮汐分析數據。繪圖數據包括水位、振幅、相位數據。理論上,并行繪制技術涉及到線程的創建、調度等額外開銷,在處理的數據規模較大和任務分配較為平均的情況下,會有較大的性能提升。因此,考慮到各種情況,選取測試用例如表1所示。
T5測試用例數據最少,T4用例的水位數據最多,T6和T7測試了相同水位個數下不同振幅/相位數的情況。各測試用例的結果如圖7所示,每個用例分別運行5次,然后取平均運行時間作為該用例的耗時時間。

表1 測試用例

圖6 測試結果圖
在圖6中,橫坐標為測試用例,縱坐標為串行程序或并行程序的運行耗時。無論是串行程序還是并行程序,都是隨著處理數據量的增加而處理時間有所增長。總的來看,程序并行化后,系統的運行時間有所縮短,在所有的測試用例中,并行程序的耗時都比串行程序低,并行程序性能明顯高于串行程序。在測試用例T4中,并行性能大大高于串行程序性能,表明當程序運算任務繁重時,并行程序可以顯著改善串行程序的性能,相反并行程序并不具有優勢,如T5用例,水位數據和振幅相位數據都最少,系統并行化性能提升非常有限。T6、T7的水位數據相同,T6振幅相位數據多于T7,換句話說,根據3.2節任務的劃分,T6中任務t2和t3負載較T7更均衡一些,因此T6并行性能明顯高于T7。
在實際測試也發現,如果任務數目過多或負載分配不均衡會大大影響并行程序的性能。
本文基于C#.NET程序設計語言中任務機制實現了Baytap-G潮汐分析輔助軟件并行繪制振幅、相位圖功能,并就相關技術和關鍵細節進行闡述。程序并行化后,系統運行效率有了較大提升。但是相對于串行程序而言,并行編程仍然存在很大挑戰,如何設計數目合理的任務、如何處理任務之間的關系、如何合理分配任務都會影響到系統的性能。任何一個環節處理不好,都有可能適得其反,這也是當前并行程序設計存在的主要難點。
[1] 張 晶,陳榮華,楊林章,等. 強震前形變潮汐異常判識與機理研究[J].地震學報,2006,28(2):150-157
[2] 廖 欣,劉春平,楊賢和, 等. 承壓井水位對含水層潮汐應力響應是否滿足不排水條件的檢驗[J].地震學報, 2011,33(2):234-242,270
[3] 熊 峰, 張 起, 查 斯, 等. 海拉爾地震臺重力潮汐擾動分析[J]. 山西地震, 2015(2):21-23
[4] 陳志遙,呂品姬,李正媛,等.汶川Ms8.0地震前的潮汐變化分析[J].大地測量與地球動力學,2009,29(4):48-50
[5] 陳曉東,孫和平. 一種新的重力潮汐數據預處理和分析方法[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] 潘佳賓,胡越黎,陳曉君,等.基于多核的車牌識別的架構實現[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);中央高校基本科研業務費專項資金(創新項目團隊資助計劃)(ZY20160106)。
單維鋒(1977-),男,山東茌平人,博士,副教授,主要從事地震大數據、可視化技術方向的研究。
1671-4598(2017)05-0140-03
10.16526/j.cnki.11-4762/tp.2017.05.039
TP311
A