景翠萍,廖 麗,王 偉
北京應用物理與計算數學研究所,北京 100094
復雜數值模擬并行應用程序的快速研發是科學計算中的一個主要挑戰,并行應用編程框架(framework)是實現高效能編程的重要技術途徑。例如,北京應用物理與計算數學研究所自主研制的JASMIN(J adaptive structured mesh applications infrastructure)框架和JAUMIN(J adaptive unstructured mesh application infrastructure)框架,它們是面向高性能科學與工程計算結構網格和非結構網格應用的框架,提供了屏蔽并行計算的編程接口,支持領域專家在個人電腦上“串行編程”,研發適應于千萬億次計算機的高效并行應用軟件[1]。然而,基于編程框架研發并行數值模擬程序,軟件研發人員仍然面臨以下挑戰:首先,需要學習和掌握領域編程框架的編程原理與接口,并且需要熟練使用新的編程語言和開發技術;其次,采用傳統的手工編程方式,軟件研發人員通過拷貝、修改的方式編寫了很多類似的代碼,若修改不當將會花費較長的代碼調試時間;最后,軟件研發人員水平參差不齊,編寫的代碼風格各異,代碼質量難以保證。
自20世紀80年代起,計算機領域就開始探索并嘗試簡化手工編程的技術與手段,其中包括圖形化編程、代碼自動生成、領域編程語言、模型驅動開發等[2-4]。大多數編程技術并未取得廣泛的應用,僅在少數專業領域有所進展。在科學與工程計算領域,領域編程語言受到很多關注并取得初步進展[5]。通過圖形化編程降低編程難度是很多學者的努力方向,經過二十余年的發展,圖形化編程在圖形界面設計以及電氣電路設計方面取得很大進展,但在其他領域的應用非常有限。Sedov等人開發了可視并行編程的集成開發環境,該方法要求編程者直接實現并行任務調度,受限于圖形表達能力,無法獲得更好的擴展性,其并行編程模型也不能適用于當前的開發要求[6]。目前,并行軟件開發基本采用通用編程語言通過手工編程實現,實現難度大,成為并行軟件快速研制的一大障礙。代碼自動生成是支持軟件快速開發、規范代碼實現、提高工作效率的有效手段。具備代碼自動生成功能的軟件很多,如StarUML、Rational Rose等,大多數軟件提供通用的面向對象軟件設計思想,只能生成基于類的軟件架構,數據結構與編程接口依賴于編程者的設計,不適用于數值模擬軟件的研發。
基于以上分析,研制了數值模擬應用并行程序編程工具HiPro-P。HiPro-P軟件是一款基于并行編程框架的圖形化編程工具,它采用基于結構化流程圖的圖形化編程方式,屏蔽了并行編程框架的編程接口,幫助用戶在不學習編程框架的基礎上快速開發基于框架的并行應用程序。HiPro-P軟件可以支撐流體力學、分子動力學等領域的多個數值模擬程序的快速研制[7-8]。例如,北京應用物理與計算數學研究所自主研制的離散元程序,全程基于HiPro-P軟件開發,三維離散元程序的研制只用了一個半月的時間,實現了單晶以及多晶α鐵沖擊相變過程及典型非均質炸藥的沖擊響應過程的精細數值模擬。目前,HiPro-P軟件可以支撐面向結構網格應用的并行數值模擬程序的快速研發,但尚未支持非結構網格。非結構網格是科學與工程計算中普遍采用的一類網格。非結構網格應用與結構網格應用具有不同的特點,HiPro-P軟件的某些模塊不能直接用于非結構網格。為此,針對非結構網格應用特點,需擴充HiPro-P軟件的功能,支撐非結構網格應用。
針對以上需求,本文基于HiPro-P系統研制了面向非結構網格數值模擬應用并行程序的圖形化編程工具(以下簡稱“非結構網格并行編程工具”)。借助該編程工具按照一定的規范和流程,可以自動生成全部或者大部分的數值模擬程序代碼。一方面,可以有效地減輕軟件開發人員的負擔,不需或只需花費較少的時間學習編程框架,使開發人員的主要精力可以關注在軟件設計層面;另一方面,可以降低軟件研發難度,縮短數值模擬軟件的研發周期。其次,自動生成的數值模擬程序代碼規范且風格統一,可以增強程序的可讀性及可維護性。
JAUMIN框架的全稱為并行自適應非結構網格應用支撐軟件框架,它針對科學計算中的非結構網格應用,通過封裝高性能的數據結構,集成成熟的數值算法,屏蔽大規模并行和網格自適應的計算技術,支撐物理建模、數值方法、高性能算法的創新研究,加速研制可有效使用現代高性能計算機的并行自適應計算應用程序[9-10]。
圖1是基于編程框架研制的并行應用軟件架構。基于領域并行編程框架,領域專家可以結合實際應用的需求,選擇數據結構來定義物理量,選擇構件模型并編寫子區域數值計算子程序來定制并行計算構件,通過計算流程將并行計算構件組裝為應用軟件。其中,并行計算由數據結構和構件模型來實現,領域專家無需了解其實現細節。編程框架可以將并行計算的實現從應用軟件的研發中分離出來,將應用軟件的研發模式從“并行設計—并行編程”提升到“并行思考—串行編程”。
計算模式與構件模型:領域編程框架通過構件模型封裝并行計算的細節,提供不同類型的計算模式,組織內存調度、數據通信以及并行計算。JAUMIN框架凝煉了10多種計算模式,設計了相應的并行算法模板,研制了相應的構件模型,包括初值模式、規約模式、掃描模式、接觸拼接模式、復制模式、克隆模式等。初值模式為物理量賦初值,規約模式求物理量的規約值,接觸拼接模式支持接觸碰撞與滑移,復制模式將物理量的值復制給另一個物理量,克隆模式支持粒子和能群之間的獨立無關并行計算。

Fig.1 Architecture of parallel application software based on programming framework圖1 基于編程框架研制的并行應用軟件架構
基于可視化編程思想,抽象出數值模擬軟件開發的共性,找出編程規律并確定編程流程,便可以研制一種面向數值模擬軟件開發的圖形化編程工具[11-13]。JAUMIN應用程序的主控程序的流程非常類似,因此可以為用戶定制編程流程,用戶通過組裝流程來生成完整的JAUMIN程序代碼。基于以上設計思路,研制了非結構網格并行編程工具。該編程工具融合圖形化編程與代碼自動生成技術,采用基于結構化流程圖的編程模式,為用戶提供編程向導,降低用戶編程難度;可以自動生成大部分數值模擬程序代碼,從而幫助用戶基于JAUMIN框架快速重構和研制非結構網格并行應用軟件。除此之外,還可以支撐數值模擬程序在數據結構定義以及數值計算子程序編制中實現標準化和規范化。主要包括以下功能:
(1)提供可支撐非結構網格應用程序研制的圖形化編程界面,包括定義變量,創建并配置并行計算構件,定義數值計算子程序等功能。
(2)代碼自動生成引擎可自動生成大部分應用程序代碼(包括基架代碼、變量定義及引用、數值計算子程序接口定義、并行計算構件定義及配置等),只有子程序執行體部分的代碼需要用戶手工編寫。
(3)生成的代碼規范且風格統一。
HiPro-P軟件體系結構及模塊構成如圖2所示,其中灰色部分標注的是非結構網格應用并行編程工具相關的軟件模塊。數據庫模塊由變量庫、數值計算子程序庫、計算流程庫、并行計算構件庫、變量類型庫等構成。代碼自動生成引擎由文件代碼生成器、片段代碼生成器以及應用程序代碼模板構成。除此之外,提供了基于編程框架編寫并行應用程序的圖形化編程界面,包括應用程序編輯、程序編譯、代碼調試及運行配置界面等。
針對非結構網格應用特點,需要擴充領域專用變量類型庫。領域專用變量類型指高性能數值模擬應用領域特定的變量類型。非結構網格應用變量類型主要包括網格離散量、間斷有限元數據片、網格片幾何坐標量、粒子量、網格拓撲量、網格無關量、用戶自定義參數等。其中變量的屬性包括變量的名稱、類別、基本數據類型、輸入/輸出以及說明等。本文采用領域專用變量類型描述變量類別。針對非結構網格應用特點,建立了非結構網格應用領域變量類型庫。圖3是非結構網格變量類型示例,例如中心量(cell)、結點量(node)、邊心量(edge)、面心量(face)等變量類型。
非結構網格應用子程序類型包括數值計算型和非數值計算型子程序。其中數值計算子程序包括網格片數值計算型、實體集數值計算型和網格無關數值計算型。非數值計算子程序包括內存調度型、輸入輸出型和數據通信型子程序。數值計算子程序中,網格片尺寸、網格片拓撲、實體集、網格片幾何坐標、數據片及影像區寬度等數據通過形參傳遞。根據非結構網格應用數值計算子程序接口規范,將子程序形參表參數劃分為必選參數和可選參數。其中,必選參數根據數值計算子程序類型確定。

Fig.2 HiPro-P architecture圖2 HiPro-P軟件體系結構

Fig.3 Examples of variable types for unstructured grids圖3 非結構網格變量類型示例
面向JAUMIN框架提供的并行計算構件,本文建立非結構網格應用構件庫,如圖4所示。主要包括初值構件、數值構件、步長構件、歸約構件、內存構件、外表面操作構件、掃描構件以及接觸構件等。

Fig.4 Component library for unstructured grids圖4 非結構網格應用構件庫
代碼模板是用戶編寫數值模擬程序過程中常用的代碼片段構成的一段文本,其中保留一些待定的參數,這些參數通過代碼生成器的參數替換機制確定實際的值[14-16]。代碼自動生成引擎是用于生成完整代碼或代碼片段的代碼生成器。應用代碼自動生成技術,代碼生成引擎根據用戶圖形界面輸入,替換代碼模板中的參數,自動生成符合數據結構標準的變量定義代碼以及遵循子程序接口規范的子程序接口定義代碼,最終生成完整的數值模擬程序代碼。
建立非結構網格應用代碼模板庫,包括變量定義、變量引用、主控程序、網格層策略類、網格片策略類、可視化輸出以及外部子程序接口代碼模板等。非結構網格應用代碼模板庫如圖5所示。

Fig.5 Code template library for unstructured grids圖5 非結構網格應用代碼模板庫
由于變量定義、變量引用以及可視化輸出等代碼模板在面向非結構網格數值模擬應用的串行編程工具中有詳細介紹[17],這里不再詳述。下面介紹網格層時間積分算法策略類代碼模板和積分構件網格片策略類代碼模板。
(1)網格層時間積分算法策略類代碼模板
網格層時間積分算法類是JAUMIN框架求解偏微分方程組的用戶界面類,它支持顯式時間離散格式和隱式時間離散格式。建立網格層時間積分算法策略類代碼模板,通過代碼自動生成引擎可以生成網格層策略類源文件。
(2)并行計算構件網格片策略類代碼模板
并行計算構件網格片策略類封裝了構件在網格片完成的數值計算。針對每種類型的并行計算構件,代碼自動生成引擎根據構件定制圖形界面的輸入,替換對應的網格片策略類代碼模板中的變量,自動生成并行計算構件網格片策略類代碼片段。網格片策略類代碼模板包括初值構件、數值構件、步長構件、歸約構件、內存構件、外表面操作構件、掃描構件以及接觸構件網格片策略類代碼模板等。
針對非結構網格應用特點,研制可支撐非結構網格并行程序研制的圖形界面,主要包括變量庫界面、子程序編輯界面、并行計算構件定制圖形界面等。由于變量庫界面和子程序編輯界面在面向非結構網格數值模擬應用的串行編程工具中有詳細介紹[17],這里不再詳述。下面介紹并行計算構件定制圖形界面。
每種類型的并行計算構件配有特定的圖形用戶界面,直觀反映構件的功能。定制構件的操作包括:根據功能選擇構件類型,啟動該類型的構件定制圖形界面,配置構件的基本屬性及附加屬性[18]。
圖6為初值構件的定制界面,包括兩個屬性頁面:(1)基本屬性,用于修改構件名稱和功能說明;(2)初始化物理量,用于配置完成物理量初始化功能的數值計算子程序。
圖7為步長構件的定制界面,包括3個屬性頁面:(1)基本屬性,用于修改構件名稱和功能說明;(2)網格片計算時間步長,用于配置完成時間步長計算的計算內核;(3)填充影響區或內部區域,配置通信的物理量。
圖8為數值構件的定制界面,包括3個屬性頁面:(1)基本屬性,用于修改構件名稱和功能說明;(2)網格片計算,用于連接完成數值計算的計算內核;(3)填充影像區或內部區域,配置通信的物理量,為可選屬性。
除此之外,為防止參數錯配或漏配導致應用程序錯誤,系統為每類構件配備了檢查器。檢查項包括子程序類型匹配、參數類型匹配、強制參數匹配等。系統根據界面操作實時檢查配置信息的正確性與完備性。并行計算構件定制完成后,代碼自動生成引擎針對每種并行計算構件自動生成對應的網格片策略類代碼。

Fig.6 Graphical interface of initialize component configuration圖6 初值構件配置圖形界面

Fig.7 Graphical interface of time step component configuration圖7 步長構件配置圖形界面

Fig.8 Graphical interface of numerical component configuration圖8 數值構件配置圖形界面
本文介紹的非結構網格應用并行編程工具已成功應用于一些非結構網格數值模擬程序的開發,例如初級反應前二維非結構多邊形流體力學程序、ICF三維集成程序等。本文以二維情形下線性對流方程的求解程序(簡稱“LinAdv程序”)以及歐拉方程的求解程序(簡稱“Euler程序”)為例,說明非結構網格應用并行編程工具如何生成應用程序代碼,驗證編程工具生成的代碼是否可以正確編譯、運行,并統計編程工具自動生成的代碼量占總代碼量的比例。
以“LinAdv程序”為例,說明非結構網格應用并行編程工具如何生成并行應用程序代碼。簡單的線性對流方程如式(1)所示:

為方便,記F(u)=au,a=(a1,a2)為對流速度。其中,線性對流方程及計算方法在面向非結構網格數值模擬應用的串行編程工具中有詳細介紹[17]。
應用非結構網格并行編程工具編寫LinAdv程序求解以上線性對流方程,主要包括以下5個步驟:
(1)定義變量
依據式(1)需要定義以下變量:物理量包括守恒量uval_current、通量flux_new、邊的全局法向edge_normal、邊的長度edge_length、單元的面積cell_area;輸入參數包括對流速度d_velocity、CFL條件數cfl等。
通過變量庫圖形界面定義以上變量,如圖9所示。變量定義完成后,編程工具將自動生成變量定義代碼片段。

Fig.9 Defining variable圖9 定義變量
(2)編寫數值計算子程序
求解以上線性對流方程,需要編寫的數值計算子程序包括:守恒量初始化子程序InitializeConservation、時間步長計算子程序computeTimeStep、通量計算子程序ComputeFlux、守恒量更新子程序updateConservation以及物理邊界處理子程序setPhysicalBdry等。非結構網格并行編程工具編寫數值計算子程序的方法與面向非結構網格數值模擬應用的串行編程工具[17]中的方法一致,這里不再詳述。
(3)創建并定制并行計算構件
編寫完以上子程序,需要創建并定制并行計算構件封裝以上數值計算子程序。需要創建的構件包括:初值構件init_set_value、步長構件step_size、數值構件compute_flux、數值構件set_bdry、數值構件conser_diff以及內存構件allocateFlux等。
構件庫界面如圖10所示。構件庫界面用于管理和存儲用戶定義的并行計算構件,支持用戶創建構件,訪問、修改或刪除庫存構件等。
創建完并行計算構件,可以為每種并行計算構件配置構件的屬性。

Fig.10 Graphical interface of component library圖10 構件庫界面
數值構件compute_flux的定制界面如圖11所示,其他構件的定制界面不再詳述。定義完并行計算構件后,系統根據界面操作實時檢查構件配置信息的正確性與完備性。
針對每種類型的并行計算構件,代碼自動生成引擎根據構件定制界面的輸入,自動生成并行計算構件網格片策略類代碼片段。
(4)基于構件組裝計算流程

Fig.11 Numerical component configuration圖11 數值構件定制
定制完以上并行計算構件,在流程編輯界面中,支撐用戶通過組裝構件搭建基于JAUMIN框架的并行應用算法流程。圖12是HiPro-P軟件的流程編輯界面。
(5)編譯、調試、運行LinAdv程序代碼
對非結構網格應用并行編程工具自動生成的代碼量進行統計。自動生成的LinAdv程序各代碼片段占總代碼量的比例如表1所示。

Fig.12 Flowchart editor of HiPro-P圖12 HiPro-P軟件的流程編輯界面

Table 1 Percentage of automatically generated code in total amount of program(LinAdv)表1 自動生成的代碼片段占總代碼量的比例(LinAdv) %
采用非結構網格應用并行編程工具自動生成的Euler程序各代碼片段占總代碼量的比例如表2所示。

Table 2 Percentage of automatically generated code in total amount of program(Euler)表2 自動生成的代碼片段占總代碼量的比例(Euler) %
從表1和表2中可以看出:編程工具自動生成的LinAdv程序代碼約占總代碼量的90.53%;自動生成的Euler程序代碼約占總代碼量的80.45%。因此,應用編程工具編寫數值模擬程序,可以減少用戶編寫代碼量。
表3是采用手工編程方式和采用非結構網格應用并行編程工具生成的LinAdv程序和Euler程序的代碼大小。

Table 3 Comparison of code表3 代碼大小的比較
相對于手工編程方式,采用非結構網格應用并行編程工具,生成的LinAdv程序代碼大小的增長小于15%;生成的Euler程序代碼大小的增長小于10%。從實驗數據可以看出,編程工具生成的代碼在大小上相對于手工編寫的代碼是可接受的。
本文設計并研制了面向非結構網格應用的并行數值模擬程序圖形化編程工具。該編程工具有以下應用效果:首先,采用基于結構化流程圖的圖形化編程模式,屏蔽了并行編程框架的編程接口,降低了用戶編程難度;其次,自動生成大部分并行數值模擬程序代碼,用戶只需編寫數值計算子程序實現體,減少了用戶編寫代碼量;最后,生成的代碼規范統一,系統的維護效率也得以大幅度提高。示例表明,該工具可以降低用戶編程難度,并幫助用戶在不學習編程框架的基礎上快速開發基于JAUMIN框架的并行應用程序。
[1]Mo Zeyao,Zhang Aiqing,Liu Qingkai,et al.Research on the components and practices for domain-specific parallel programming models for numerical simulation[J].Scientia Sinica Informationis,2015,45(3):385-397.
[2]Cheisten M,Schenk O,Burkhart H.PATUS:a code generation and autotuning framework for parallel iterative stencil computations on modern microarchitectures[C]//Proceedings of the 25th International Symposium on Parallel and Distributed Processing,Anchorage,May 16-20,2011.Piscataway:IEEE,2011:676-687.
[3]ábrahám E,Bekas C,Brandic I,et al.Preparing HPC applications for exascale:challenges and recommendations[C]//Proceedings of the 18th International Conference on Network-Based Information Systems,Taipei,China,Sep 2-4,2015.Washington:IEEE Computer Society,2015:401-406.
[4]Wozniak J M,Armstrong T G,Wilde M,et al.Swift/T:scalable data flow programming for many-task applications[C]//Proceedings of the 18th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming,Shenzhen,Feb 23-27,2013.New York:ACM,2013:309-310.
[5]Raja A,Lakshmanan D.Domain specific languages[J].InternationalJournalofComputerApplications,2010,21(1):99-105.
[6]Sedov B,Syschikov A,Ivanova V.Integrated development environment for visual parallel programming[C]//Proceedings of the 10th Conference of Fruct Association,Tampere,Nov 7-11,2011.Piscataway:IEEE,2011:131-135.
[7]Liao Li,Zhang Aiqing,Yang Zhang,et al.IDE-JASMIN—an interactive graphical approach for parallel programming in scientific computing[C]//Proceedings of the 8th International Conference on Software Technologies,Reykjavik,Jul 29-31,2013:328-333.
[8]Liao Li,Jing Cuiping,Wang Wei,et al.HiPro-CodeGen—automatic programming for parallel numerical simulations[C]//Proceedings of the 9th International Conference on Software Engineering and Applications,Vienna,Aug 29-31,2014.Piscataway:IEEE,2014:125-131.
[9]Liu Qingkai,Zhao Weibo,Cheng Jie,et al.A programming framework for large scale numerical simulations on unstructured mesh[C]//Proceedings of the 2nd International Conference on High Performance and Smart Computing,New York,Apr 9-10,2016.Piscataway:IEEE,2016:298-303.
[10]Mo Zeyao,Zhang Aiqing,Cao Xiaolin,et al.JASMIN:a parallel software infrasture for scientific computing[J].Frontiers of Computer Science in China,2010,4(4):480-488.
[11]Wang Min,Chen Yaguang.An automatic programming tool based on visual programming[J].Computer Applications and Software,2010,27(12):29-33.
[12]Shao Weizhong,Liu Xin.Object-oriented design of humanmachine interface in the visual programming environment[J].Journal of Software,2002,13(8):1494-1499.
[13]Liu Wei,Zhao Songzheng,Sun Yiran,et al.An approach to project management information system requirements analysis[C]//Proceedings of the 2008 International Conference on Intelligent Computation Technology and Automation,Changsha,Oct 20-22,2008.Washington:IEEE Computer Society,2008:957-961.
[14]Kong Deyu,Luo Feng,Lin Weibo,et al.Research on a velocitybased automatic code generation technology[J].Computer Applications and Software,2014,31(10):20-33.
[15]Liu Yuxin,Yao Kaixue,Xu Daoyun.Automatic code generation based on template on.Net framework of three layers architecture[J].Computer Technology and Development,2012,22(8):13-16.
[16]Watts T.The SFC editor a graphical tool for algorithm development[J].Journal of Computing Sciences in Colleges,2004,20(2):73-85.
[17]Jing Cuiping,Liao Li,Wang Wei,et al.A graphical programming tool for sequential numerical simulation with unstructured grids[C]//Proceedings of the CCF HPC China 2015,Wuxi,Nov 10-12,2015:116-124.
[18]Liao Li,Zhang Aiqing,Wang Wei,et al.A graphical approach for component-based parallel programming[C]//Proceedings of the CCF HPC China 2015,Wuxi,Nov 10-12,2015:55-63.
附中文參考文獻:
[1]莫則堯,張愛清,劉青凱,等.數值模擬領域并行編程模型的要素與實例研究[J].中國科學:信息科學,2015,45(3):385-397.
[11]王敏,陳亞光.基于可視化編程的自動化編程工具[J].計算機應用與軟件,2010,27(12):29-33.
[12]邵維忠,劉昕.可視化編程環境下人機界面的面向對象設計[J].軟件學報,2002,13(8):1494-1499.
[14]孔得雨,羅峰,林偉波,等.一種基于Velocity的代碼自動生成技術研究[J].計算機應用與軟件,2014,31(10):20-33.
[15]劉于新,姚凱學,許道云.基于模板的.Net三層架構的代碼自動生成[J].計算機技術與發展,2012,22(8):13-16.
[17]景翠萍,廖麗,王偉,等.面向非結構網格數值模擬應用串行程序的圖形化編程工具[C]//2015年全國高性能計算學術年會論文集,無錫,2015:116-124.
[18]廖麗,張愛清,王偉,等.面向構件化并行編程的圖形化編程技術[C]//2015年全國高性能計算學術年會論文集,無錫,2015:55-63.