摘 要:OpenMP是共享內(nèi)存并行程序設(shè)計的工業(yè)標(biāo)準(zhǔn),它通過一些編譯指導(dǎo)語句能方便地將程序并行化,特別適合于在多線程的計算機(jī)上使用。針對一個采用電磁場FDD算法的二維波導(dǎo)問題,首先對其計算方法和計算過程進(jìn)行簡單描述,其次討論了幾個影響其并行程序執(zhí)行效率的幾個因素。結(jié)果表明,采取不同的并行方式,設(shè)定不同的調(diào)度策略,設(shè)置并行區(qū)線程數(shù)的大小均會影響并行程序的性能。因此,在使用OpenMP編寫電磁場并行程序時,需要綜合考慮各種因素的影響才能設(shè)計出高效的程序。
關(guān)鍵詞: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
在科學(xué)計算中,并行方式通常由于其較低的開銷和較短的運算時間而受到人們的廣泛關(guān)注。目前,并行計算的實現(xiàn)主要基于2種并行標(biāo)準(zhǔn):MPI(Message Passing Interface)標(biāo)準(zhǔn)[1],用于消息傳遞方式的并行編程,允許不共享內(nèi)存的多處理器合作進(jìn)行并行計算;OpenMP標(biāo)準(zhǔn)[2],用于共享存儲方式的并行編程,可以實現(xiàn)在MP(ymmetrical Multi-Processor)系統(tǒng)內(nèi)多處理器的多線程并行計算。
OpenMP是一個應(yīng)用程序接口,包括一套編譯指導(dǎo)語句和一個用來支持它的函數(shù)庫,通過與標(biāo)準(zhǔn)的Fortran,C和C++結(jié)合工作。使用OpenMP開發(fā)共享存儲的多線程程序非常簡單和容易,但卻很難保證所開發(fā)的程序具有很高的性能。同時,若使用不當(dāng),也會使程序發(fā)生混亂,產(chǎn)生諸如數(shù)據(jù)競爭,死鎖等現(xiàn)象[3],從而導(dǎo)致最終的運算結(jié)果有誤。OpenMP程序的一些因素對其執(zhí)行效率也有很大影響[4]。因此,在使用OpenMP語句編寫并行代碼時,需要對其進(jìn)行詳實而細(xì)致的分析,從而保證程序的正確性和高效性。
時域有限差分法(FDD)是模擬計算電磁場的一種基本算法,其串行方式通常由于問題的復(fù)雜程度而花費大量的計算時間。如果使用并行方式進(jìn)行計算,則能夠在很大程度上減少運算所用時間,提高運算效率。本文以一個二維平面波導(dǎo)為例,討論如何使用OpenMP語句設(shè)計電磁場的FDD并行程序,同時分析各種不同的并行方法對程序性能的影響,從而找到最為高效的并行方式,使之能夠在最短的時間內(nèi)得到正確的結(jié)果。
1 電磁場的計算過程
電磁場FDD算法的基本思想是:使用差分網(wǎng)格,將連續(xù)的電磁場問題變?yōu)殡x散系統(tǒng)問題,用各離散點上的數(shù)值解來逼近連續(xù)場域內(nèi)的真實解。使用YEE網(wǎng)格得到一系列離散的電磁場計算公式,采用蛙跳格式,利用前一時刻已知的電場和磁場求出當(dāng)前時刻的電磁場。隨著時間的推移,計算過程不斷進(jìn)行下去。
本文所討論的二維波導(dǎo)結(jié)構(gòu)如圖1所示。其中波導(dǎo)的長為3 m,寬為018 m,波導(dǎo)左端施加1 Gz的高斯脈沖激勵源。設(shè)波的傳播方向為z方向,垂直方向為x方向。當(dāng)用FDD處理該問題時,為將邊界點落在網(wǎng)格點上,選取網(wǎng)格步長ΔL為001 m將整個場域離散成一個個正方形網(wǎng)格,如圖2所示。
這樣,當(dāng)一次時刻所有場域的電磁場計算完成后,使用迭代過程就可以計算出隨時間變化的波導(dǎo)內(nèi)電磁場的分布情況。在Fortran中,使用Do循環(huán)語句可以方便的模擬上述過程。
2 OpenMP并行設(shè)計
OpenMP采用的是標(biāo)準(zhǔn)的并行模式-fork/join式并行,使用編譯器指導(dǎo)指令實現(xiàn)并行化。當(dāng)程序開始執(zhí)行時,只有1個主線程的線程存在。當(dāng)遇到OpenMP的指導(dǎo)指令要求程序并行化時,主線程派生出很多子線程。在并行區(qū)域,主線程和這些派生的子線程協(xié)同工作。在并行區(qū)結(jié)束之后,派生的線程退出或掛起,由主線程繼續(xù)執(zhí)行后續(xù)部分。因而,OpenMP的并行程序線程數(shù)是動態(tài)變化的。
采用OpenMP對本文的電磁場問題進(jìn)行并行設(shè)計時,可以有多種實現(xiàn)方法,如使用數(shù)據(jù)并行或功能并行,改變數(shù)據(jù)調(diào)度類型或改變設(shè)置的線程數(shù)目等。不同的實現(xiàn)方法在運行的效率上是不同的。下面根據(jù)實現(xiàn)方式的不同,分析不同的并行程序在性能上的差異,以此找到最為優(yōu)化的設(shè)計方法。
以下測試均在基于雙CPU四線程的多處理器系統(tǒng)上使用Intel Fortran Compiler 91編譯實現(xiàn)。
21 并行結(jié)構(gòu)的不同
OpenMP可以實現(xiàn)兩種并行方式:數(shù)據(jù)并行和功能并行[6]。數(shù)據(jù)并行是一種普遍意義上的并行方式,在程序中,常有一些循環(huán)操作,如果在循環(huán)的內(nèi)部各個計算過程之間不存在相關(guān)性,則可以轉(zhuǎn)換成并行循環(huán),即數(shù)據(jù)并行。在OpenMP中,只需要告訴編譯器該循環(huán)過程可以被并行執(zhí)行,則編譯器會負(fù)責(zé)生成派生和會合線程以及調(diào)度并行循環(huán)的代碼,并將循環(huán)的任務(wù)分配給線程。如果一個程序的某些部分之間互不影響,沒有相關(guān)性,同時執(zhí)行這些部分運算的結(jié)果是正確的,則可以使用功能并行的方式將這些部分同時分配到不同的線程上并行執(zhí)行。在OpenMP中,可以為不同的線程分配不同部分的代碼,使用parallel sections語句即可幫助編譯器實現(xiàn)功能并行。
在電磁場的計算過程中,時間步長上的迭代過程是相互關(guān)聯(lián),相互影響的。一次迭代需要使用上一次迭代的運算結(jié)果,故迭代之間不宜實現(xiàn)并行化。而在一次迭代內(nèi)部,電場和磁場的計算僅需要前一次時刻的計算結(jié)果,各個計算過程之間沒有影響,可以使用這兩種方式實現(xiàn)并行計算。
在原串行程序上的迭代循環(huán)內(nèi)部,添加“!MYMOMP PARALLEL DO”語句實現(xiàn)1次循環(huán)的數(shù)據(jù)并行,添加 “!MYMOMP PARALLEL ECION”語句將電場和磁場的計算過程分到各個線程上實現(xiàn)功能并行。將2個實現(xiàn)的方式與原串行方式的運行效率做比較,其結(jié)果如圖3所示。從圖3可以看出,并行方式明顯要比串行方式效率高,花費的時間少。而數(shù)據(jù)并行與功能并行兩者之間也有很大的差異,數(shù)據(jù)并行方式性能最佳。當(dāng)時間迭代次數(shù)從1 000次~ 000次變化時,相比數(shù)據(jù)并行方式,功能并行所花費的時間大約是其兩倍左右,而串行方式則逐漸從2倍增加到3倍。由此可見,數(shù)據(jù)并行是實現(xiàn)并行運算最好的方式。
22 調(diào)度策略的不同
在對嵌套的循環(huán)進(jìn)行并行操作的過程中,執(zhí)行不同的調(diào)度策略所需的時間差別是相當(dāng)大的。如果要計算n次的循環(huán)過程,每次循環(huán)的計算任務(wù)需要分配到t個線程中,如果每個線程被分到(n/t)次循環(huán),可能得到較低的并行效率。這是因為各個線程所需完成任務(wù)的時間可能是不同的,先完成的線程需要等待所有線程都完成任務(wù)后才能繼續(xù)下一次循環(huán)的并行計算。如果將新任務(wù)立即交給先完成任務(wù)的線程執(zhí)行,則并行計算的總效率可能是最好的。調(diào)度策略的選擇,是依照任務(wù)的負(fù)載不平衡性所決定的。在OpenMP中,使用schedual子句可以指定執(zhí)行循環(huán)調(diào)度的策略,即如何將循環(huán)過程在線程間分配。OpenMP的調(diào)度策略有多種,包括動態(tài)調(diào)度、靜態(tài)調(diào)度、指導(dǎo)性自調(diào)度、運行時調(diào)度等。本文只討論前3種調(diào)度形式,并且使用默認(rèn)的數(shù)據(jù)分塊大小完成調(diào)度操作。
在靜態(tài)調(diào)度中,任務(wù)在執(zhí)行之前就已經(jīng)被分配到各個線程中了,每個線程被分配到(n/t)次連續(xù)的循環(huán)。
如果使用動態(tài)調(diào)度,則任務(wù)開始時只分配1次循環(huán),當(dāng)線程執(zhí)行完這次循環(huán)操作后,再將下一次循環(huán)任務(wù)交給線程執(zhí)行。
指導(dǎo)性自調(diào)度方式是一種啟發(fā)式自調(diào)度方法,開始時每個任務(wù)會分配到較大的數(shù)據(jù)任務(wù)塊,之后任務(wù)每次請求新的任務(wù)時會被分配到大小遞減的數(shù)據(jù)任務(wù)塊,直到所有任務(wù)均完成為止。靜態(tài)調(diào)度的開銷小,但有明顯的負(fù)載不平衡現(xiàn)象,動態(tài)調(diào)度的開銷相對大,但可減少負(fù)載的不平衡現(xiàn)象。
在效率最高的數(shù)據(jù)并行方式上,對不同的調(diào)度方式做測試,包括靜態(tài)調(diào)度AIC,動態(tài)調(diào)度DYNAMIC,指導(dǎo)性自調(diào)度GUIDED和不定義調(diào)度方式。測試結(jié)果如圖4所示。
不同的調(diào)度策略對程序的整體性能是有影響的。從圖4中可以看出,相比其他2種情況,靜態(tài)的調(diào)度方式與未指定調(diào)度策略的方式效率最好,運行時間大致相等。這說明在使用FDD進(jìn)行電磁場計算的過程中,各個場量的計算所用時間大體上一致,負(fù)載的不平衡性較小,可以忽略這種現(xiàn)象而在執(zhí)行并行計算開始前直接把任務(wù)全部分配到線程中去。而倘若使用動態(tài)調(diào)度或指導(dǎo)性自調(diào)度方式,增加負(fù)載的不平衡現(xiàn)象,消耗時間,影響效率。可見,在本例中,靜態(tài)調(diào)度方式是最為合適的調(diào)度策略。
23 設(shè)置線程數(shù)的不同
在使用OpenMP實現(xiàn)共享存儲并行計算的過程中,線程數(shù)目的大小并不一定和系統(tǒng)實際的線程數(shù)一致,可以事先指定并行區(qū)域的線程總數(shù)來完成并行操作。線程數(shù)的不同會影響到并行程序效率,OpenMP中使用OMP_E_NUM_READ()函數(shù)對并行部分的線程數(shù)進(jìn)行定義,線程總數(shù)的定義需要在并行操作前的串行部分,若未指定線程數(shù),則默認(rèn)使用系統(tǒng)最大的線程數(shù)完成并行操作。前面關(guān)于并行實現(xiàn)方式和調(diào)度策略2個測試就是在未指定線程數(shù)的大小下完成的。當(dāng)線程數(shù)發(fā)生變化時,程序運行時間的變化情況如表1所示。
可以看到,當(dāng)設(shè)置的線程數(shù)與實際系統(tǒng)的線程數(shù)一致時(表1中線程數(shù)為4的列),運行的時間是最短的;當(dāng)線程數(shù)超過系統(tǒng)的最大線程時,為實現(xiàn)并行化,線程之間增加了同步和競爭系統(tǒng)資源系統(tǒng)所需要的時間,這種差距越大,耗時越多;當(dāng)線程數(shù)小于系統(tǒng)的最大線程時,并行計算的過程中總會有一些CPU空閑,計算機(jī)并未工作在最佳的狀態(tài),因而用時也較多;當(dāng)線程數(shù)設(shè)置為1時,此時的并行程序?qū)嶋H上只有一個線程執(zhí)行,成為串行方式。因此,使用系統(tǒng)默認(rèn)的最大線程數(shù)是實現(xiàn)電磁場并行計算的最有效途徑。
3 結(jié) 語
目前,個人計算機(jī)的CPU逐漸走向多核化,單機(jī)多線程的MP系統(tǒng)也逐漸普及起來,在此類系統(tǒng)上設(shè)計并使用并行化程序有著重要的實用價值。本文以二維波導(dǎo)的電磁場FDD算法為例,研究如何使用OpenMP設(shè)計其并行程序,以及分析影響并行效率的幾個因素。測試分析的結(jié)果表明,采用不同的并行方式,設(shè)定不同的調(diào)度策略以及修改并行線程數(shù)的大小均會對并行程序本身的優(yōu)化效率性能產(chǎn)生影響。綜合考慮各個因素才能設(shè)計出最為優(yōu)化的并行程序。本文所使用的例子雖然簡單,但代表了設(shè)計此類問題的一般方法,對在使用FDD算法的電磁場復(fù)雜問題有著一定的指導(dǎo)意義。
使用OpenMP設(shè)計的基于共享存儲標(biāo)準(zhǔn)的電磁場并行程序雖然在效率方面有一些提高,但只能運行在多線程的MP系統(tǒng)上。如果結(jié)合消息傳遞機(jī)制的MPI標(biāo)準(zhǔn)對這一類問題混合編寫并行代碼,則能夠適用于由多處理器計算機(jī)組成的多機(jī)機(jī)群,用途更廣、效率也更高。這一問題,將在今后的研究中進(jìn)行下去。
參 考 文 獻(xiàn)
[1]莫則堯,袁國興消息傳遞并行編程環(huán)境MPI[M]北京:科學(xué)出版社,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
王秉中計算電磁學(xué)[M]北京:科學(xué)出版社,2002
[6]Michael JQuinnMPI與OpenMP并行程序設(shè)計[M]陳文光,武永衛(wèi),譯北京:清華大學(xué)出版社,2004
作者簡介 李正浩 男,1983年出生,碩士研究生。主要從事電磁粒子模擬的并行研究。