摘 要:OpenMP是共享內存并行程序設計的工業標準,它通過一些編譯指導語句能方便地將程序并行化,特別適合于在多線程的計算機上使用。針對一個采用電磁場FDD算法的二維波導問題,首先對其計算方法和計算過程進行簡單描述,其次討論了幾個影響其并行程序執行效率的幾個因素。結果表明,采取不同的并行方式,設定不同的調度策略,設置并行區線程數的大小均會影響并行程序的性能。因此,在使用OpenMP編寫電磁場并行程序時,需要綜合考慮各種因素的影響才能設計出高效的程序。
關鍵詞:OpenMP;并行程序;FDD;影響因素
Performance of the Electromagnetic FDD Parallel Program Based on OpenMP
LI Zhenghao,ZOU Jun,LIU Dagang
(chool of Physical Electronics,University of Electronic cience echnology of China,Chengdu,61004,China)
Abstract:OpenMP is a industrial standard designed for shared memory multiprocessors,which is widely used in the multi-thread computerWith some guided sentences,it can make program parallelism easilyUsing a 2D wave-guide for example,the performance of its electromagnetic FDD parallel program is discussion in this paperhe result shows us that,using different ways to parallelism,setting varies kinds of schedule tactic or changing the parallel regions thread numbers,can all affect the performance of the parallel programIt is strongly recommended that all of this when trying to write electromagnetic parallel code with OpenMP,and only in this way,the program with high performance can be designed
Keywords:OpenMP;parallel program;FDD;influencing factor
在科學計算中,并行方式通常由于其較低的開銷和較短的運算時間而受到人們的廣泛關注。目前,并行計算的實現主要基于2種并行標準:MPI(Message Passing Interface)標準[1],用于消息傳遞方式的并行編程,允許不共享內存的多處理器合作進行并行計算;OpenMP標準[2],用于共享存儲方式的并行編程,可以實現在MP(ymmetrical Multi-Processor)系統內多處理器的多線程并行計算。
OpenMP是一個應用程序接口,包括一套編譯指導語句和一個用來支持它的函數庫,通過與標準的Fortran,C和C++結合工作。使用OpenMP開發共享存儲的多線程程序非常簡單和容易,但卻很難保證所開發的程序具有很高的性能。同時,若使用不當,也會使程序發生混亂,產生諸如數據競爭,死鎖等現象[3],從而導致最終的運算結果有誤。OpenMP程序的一些因素對其執行效率也有很大影響[4]。因此,在使用OpenMP語句編寫并行代碼時,需要對其進行詳實而細致的分析,從而保證程序的正確性和高效性。
時域有限差分法(FDD)是模擬計算電磁場的一種基本算法,其串行方式通常由于問題的復雜程度而花費大量的計算時間。如果使用并行方式進行計算,則能夠在很大程度上減少運算所用時間,提高運算效率。本文以一個二維平面波導為例,討論如何使用OpenMP語句設計電磁場的FDD并行程序,同時分析各種不同的并行方法對程序性能的影響,從而找到最為高效的并行方式,使之能夠在最短的時間內得到正確的結果。
1 電磁場的計算過程
電磁場FDD算法的基本思想是:使用差分網格,將連續的電磁場問題變為離散系統問題,用各離散點上的數值解來逼近連續場域內的真實解。使用YEE網格得到一系列離散的電磁場計算公式,采用蛙跳格式,利用前一時刻已知的電場和磁場求出當前時刻的電磁場。隨著時間的推移,計算過程不斷進行下去。
本文所討論的二維波導結構如圖1所示。其中波導的長為3 m,寬為018 m,波導左端施加1 Gz的高斯脈沖激勵源。設波的傳播方向為z方向,垂直方向為x方向。當用FDD處理該問題時,為將邊界點落在網格點上,選取網格步長ΔL為001 m將整個場域離散成一個個正方形網格,如圖2所示。
這樣,當一次時刻所有場域的電磁場計算完成后,使用迭代過程就可以計算出隨時間變化的波導內電磁場的分布情況。在Fortran中,使用Do循環語句可以方便的模擬上述過程。
2 OpenMP并行設計
OpenMP采用的是標準的并行模式-fork/join式并行,使用編譯器指導指令實現并行化。當程序開始執行時,只有1個主線程的線程存在。當遇到OpenMP的指導指令要求程序并行化時,主線程派生出很多子線程。在并行區域,主線程和這些派生的子線程協同工作。在并行區結束之后,派生的線程退出或掛起,由主線程繼續執行后續部分。因而,OpenMP的并行程序線程數是動態變化的。
采用OpenMP對本文的電磁場問題進行并行設計時,可以有多種實現方法,如使用數據并行或功能并行,改變數據調度類型或改變設置的線程數目等。不同的實現方法在運行的效率上是不同的。下面根據實現方式的不同,分析不同的并行程序在性能上的差異,以此找到最為優化的設計方法。
以下測試均在基于雙CPU四線程的多處理器系統上使用Intel Fortran Compiler 91編譯實現。
21 并行結構的不同
OpenMP可以實現兩種并行方式:數據并行和功能并行[6]。數據并行是一種普遍意義上的并行方式,在程序中,常有一些循環操作,如果在循環的內部各個計算過程之間不存在相關性,則可以轉換成并行循環,即數據并行。在OpenMP中,只需要告訴編譯器該循環過程可以被并行執行,則編譯器會負責生成派生和會合線程以及調度并行循環的代碼,并將循環的任務分配給線程。如果一個程序的某些部分之間互不影響,沒有相關性,同時執行這些部分運算的結果是正確的,則可以使用功能并行的方式將這些部分同時分配到不同的線程上并行執行。在OpenMP中,可以為不同的線程分配不同部分的代碼,使用parallel sections語句即可幫助編譯器實現功能并行。
在電磁場的計算過程中,時間步長上的迭代過程是相互關聯,相互影響的。一次迭代需要使用上一次迭代的運算結果,故迭代之間不宜實現并行化。而在一次迭代內部,電場和磁場的計算僅需要前一次時刻的計算結果,各個計算過程之間沒有影響,可以使用這兩種方式實現并行計算。
在原串行程序上的迭代循環內部,添加“!MYMOMP PARALLEL DO”語句實現1次循環的數據并行,添加 “!MYMOMP PARALLEL ECION”語句將電場和磁場的計算過程分到各個線程上實現功能并行。將2個實現的方式與原串行方式的運行效率做比較,其結果如圖3所示。從圖3可以看出,并行方式明顯要比串行方式效率高,花費的時間少。而數據并行與功能并行兩者之間也有很大的差異,數據并行方式性能最佳。當時間迭代次數從1 000次~ 000次變化時,相比數據并行方式,功能并行所花費的時間大約是其兩倍左右,而串行方式則逐漸從2倍增加到3倍。由此可見,數據并行是實現并行運算最好的方式。
22 調度策略的不同
在對嵌套的循環進行并行操作的過程中,執行不同的調度策略所需的時間差別是相當大的。如果要計算n次的循環過程,每次循環的計算任務需要分配到t個線程中,如果每個線程被分到(n/t)次循環,可能得到較低的并行效率。這是因為各個線程所需完成任務的時間可能是不同的,先完成的線程需要等待所有線程都完成任務后才能繼續下一次循環的并行計算。如果將新任務立即交給先完成任務的線程執行,則并行計算的總效率可能是最好的。調度策略的選擇,是依照任務的負載不平衡性所決定的。在OpenMP中,使用schedual子句可以指定執行循環調度的策略,即如何將循環過程在線程間分配。OpenMP的調度策略有多種,包括動態調度、靜態調度、指導性自調度、運行時調度等。本文只討論前3種調度形式,并且使用默認的數據分塊大小完成調度操作。
在靜態調度中,任務在執行之前就已經被分配到各個線程中了,每個線程被分配到(n/t)次連續的循環。
如果使用動態調度,則任務開始時只分配1次循環,當線程執行完這次循環操作后,再將下一次循環任務交給線程執行。
指導性自調度方式是一種啟發式自調度方法,開始時每個任務會分配到較大的數據任務塊,之后任務每次請求新的任務時會被分配到大小遞減的數據任務塊,直到所有任務均完成為止。靜態調度的開銷小,但有明顯的負載不平衡現象,動態調度的開銷相對大,但可減少負載的不平衡現象。
在效率最高的數據并行方式上,對不同的調度方式做測試,包括靜態調度AIC,動態調度DYNAMIC,指導性自調度GUIDED和不定義調度方式。測試結果如圖4所示。
不同的調度策略對程序的整體性能是有影響的。從圖4中可以看出,相比其他2種情況,靜態的調度方式與未指定調度策略的方式效率最好,運行時間大致相等。這說明在使用FDD進行電磁場計算的過程中,各個場量的計算所用時間大體上一致,負載的不平衡性較小,可以忽略這種現象而在執行并行計算開始前直接把任務全部分配到線程中去。而倘若使用動態調度或指導性自調度方式,增加負載的不平衡現象,消耗時間,影響效率。可見,在本例中,靜態調度方式是最為合適的調度策略。
23 設置線程數的不同
在使用OpenMP實現共享存儲并行計算的過程中,線程數目的大小并不一定和系統實際的線程數一致,可以事先指定并行區域的線程總數來完成并行操作。線程數的不同會影響到并行程序效率,OpenMP中使用OMP_E_NUM_READ()函數對并行部分的線程數進行定義,線程總數的定義需要在并行操作前的串行部分,若未指定線程數,則默認使用系統最大的線程數完成并行操作。前面關于并行實現方式和調度策略2個測試就是在未指定線程數的大小下完成的。當線程數發生變化時,程序運行時間的變化情況如表1所示。
可以看到,當設置的線程數與實際系統的線程數一致時(表1中線程數為4的列),運行的時間是最短的;當線程數超過系統的最大線程時,為實現并行化,線程之間增加了同步和競爭系統資源系統所需要的時間,這種差距越大,耗時越多;當線程數小于系統的最大線程時,并行計算的過程中總會有一些CPU空閑,計算機并未工作在最佳的狀態,因而用時也較多;當線程數設置為1時,此時的并行程序實際上只有一個線程執行,成為串行方式。因此,使用系統默認的最大線程數是實現電磁場并行計算的最有效途徑。
3 結 語
目前,個人計算機的CPU逐漸走向多核化,單機多線程的MP系統也逐漸普及起來,在此類系統上設計并使用并行化程序有著重要的實用價值。本文以二維波導的電磁場FDD算法為例,研究如何使用OpenMP設計其并行程序,以及分析影響并行效率的幾個因素。測試分析的結果表明,采用不同的并行方式,設定不同的調度策略以及修改并行線程數的大小均會對并行程序本身的優化效率性能產生影響。綜合考慮各個因素才能設計出最為優化的并行程序。本文所使用的例子雖然簡單,但代表了設計此類問題的一般方法,對在使用FDD算法的電磁場復雜問題有著一定的指導意義。
使用OpenMP設計的基于共享存儲標準的電磁場并行程序雖然在效率方面有一些提高,但只能運行在多線程的MP系統上。如果結合消息傳遞機制的MPI標準對這一類問題混合編寫并行代碼,則能夠適用于由多處理器計算機組成的多機機群,用途更廣、效率也更高。這一問題,將在今后的研究中進行下去。
參 考 文 獻
[1]莫則堯,袁國興消息傳遞并行編程環境MPI[M]北京:科學出版社,2001
[2]OpenMP Architecture ReviewOpenMP Application Program Interface[EB/OL]Version 2http://wwwopen[CD4]mporg,200
[3]Paul Petersen,anjiv hahOpenMP upport in the Intel hread Checker[J]International Workshop on OpenMP Applications and ools,WOMPA 2003oronto,2003:1-12
[4]Li Jianjiang,hu Jiwu,Chen Yongjian,et alAnalysis of Factors Affecting Execution Performance of OpenMP Programs[J]singhua cience and echnology,200,10(3):304-308
王秉中計算電磁學[M]北京:科學出版社,2002
[6]Michael JQuinnMPI與OpenMP并行程序設計[M]陳文光,武永衛,譯北京:清華大學出版社,2004
作者簡介 李正浩 男,1983年出生,碩士研究生。主要從事電磁粒子模擬的并行研究。