
OpenMP是一種工業(yè)標準的API設(shè)計規(guī)范,是由Sun、HP、IBM和Intel等多家頂級計算機廠商和軟件開發(fā)商聯(lián)手推出的,其目的在于為軟件開發(fā)人員提供一種通用的規(guī)范,使其可以很方便地設(shè)計新并行應(yīng)用程序或修改及并行化現(xiàn)有串行應(yīng)用程序,從而利用配置了多處理器計算系統(tǒng)的共享內(nèi)存??梢浦残砸彩荗penMP的主要目標之一,使用OpenMP開發(fā)的并行應(yīng)用程序源代碼可由支持OpenMP的任何編譯器編譯,且編譯好的二進制代碼可在目標硬件平臺上運行,以獲得出色的并行性能。
最流行的本地編程語言Fortran和C/C++都支持OpenMP。左圖給出了分別以C/C++和Fortran編寫的簡單OpenMP程序示例。在本例中,將y數(shù)組加到x數(shù)組這一循環(huán)迭代操作,是以并行方式執(zhí)行的。源代碼中的編譯指示、指令和編程API調(diào)用表示了OpenMP的結(jié)構(gòu)。OpenMP 的結(jié)構(gòu)允許程序員指定并行區(qū)域、同步和數(shù)據(jù)作用域?qū)傩?,它還支持用于指定運行時配置的環(huán)境變量,例如,環(huán)境變量OMP_NUM_THREADS指定了運行時所使用的工作線程的數(shù)量。
由于OpenMP編程模型專用于單一進程,因此其可伸縮性最終要受到一臺計算機中處理器(線程)數(shù)量的限制??缮炜s性還會受編程邏輯復(fù)雜程度和編程風格的限制。當前的OpenMP語義尚不夠靈活,無法處理某些應(yīng)用程序。例如,當前的OpenMP規(guī)范僅允許在并行區(qū)域內(nèi)創(chuàng)建有限的動態(tài)線程。
MPI(Message Passing Interface,消息傳遞接口)是一種工業(yè)標準的API規(guī)范,專為在多處理器計算機和計算機集群上獲得高性能計算而設(shè)計,該標準是由大量計算機供應(yīng)商和軟件開發(fā)商共同設(shè)計的。有多種來自不同研究機構(gòu)和廠商的MPI實現(xiàn),其中最流行的一種就是MPICH,MPICH常用作為特定平臺或互連而優(yōu)化的MPI實現(xiàn)的編碼基礎(chǔ)。MPI實現(xiàn)依然在不斷發(fā)展。MPI-1支持一些關(guān)鍵特性,如點到點及與通信設(shè)備的集群消息通信。一條消息中可包含基本數(shù)據(jù)類型或派生(用戶定義的)數(shù)據(jù)類型的MPI數(shù)據(jù),它還支持互連拓撲。MPI-2則提供許多高級通信特性,如遠程內(nèi)存訪問和單端通信等,還支持動態(tài)進程創(chuàng)建、管理和并行I/O。
總體而言,MPI為計算機集群上的并行應(yīng)用程序提供了一個出色的解決方案,但對于許多開發(fā)人員來說,MPI也是一種困難的編程模型,因為MPI的通信延遲時間較長,所以必須合理分割程序的核心邏輯,以使分布成本更為合理。分析及劃分應(yīng)用程序問題,并將問題映射到分布式進程集合中,絕對不是一項可靠直覺完成的任務(wù),因為許多MPI進程之間的交互作用都相當復(fù)雜,因此即便選用了恰當?shù)墓ぞ?,調(diào)試并調(diào)整運行在大量節(jié)點上的MPI應(yīng)用程序也極具挑戰(zhàn)性。MPI的性能取決于底層硬件平臺和互連,在某些極端的情況下,MPI應(yīng)用程序的性能可能會受到繁重的互連流量的影響。另外一個嚴重的問題就是大規(guī)模MPI應(yīng)用程序的可靠性。對于許多MPI實現(xiàn)而言,只要單一計算節(jié)點發(fā)生故障,無法正確響應(yīng),MPI程序就會停止工作。(本文內(nèi)容由Sun軟件架構(gòu)師 Liang T?Chen和微軟軟件架構(gòu)師Herb Sutter提供)
編看編想
大規(guī)模的并行化來了
姜波
在服務(wù)器端,RISC架構(gòu)的服務(wù)器進入多核技術(shù)領(lǐng)域要早一些,所以一些專有的、或者說是基于Unix操作系統(tǒng)的行業(yè)化特征非常顯著的應(yīng)用已經(jīng)是并行化編寫的。而當x86領(lǐng)域迎來64位計算和多核技術(shù)的時候,絕大多數(shù)的基于Windows的應(yīng)用都是傳統(tǒng)的按照單一線程開發(fā)的。
現(xiàn)在,標準化、開放、TCO等浪潮席卷整個計算領(lǐng)域,x86服務(wù)器市場在飛速發(fā)展,逐步擠壓原來的、非常強勢的RISC架構(gòu)服務(wù)器占有的份額,跟隨服務(wù)器硬件技術(shù)的發(fā)展腳步,基于x86服務(wù)器的操作系統(tǒng)以及上層應(yīng)用,都需要考慮處理器級別的多核、并行計算設(shè)計帶來的性能提升,考慮軟件如何能夠適應(yīng)并且更充分發(fā)揮硬件架構(gòu)的優(yōu)勢。應(yīng)該說,這是軟件層進入了大規(guī)模的并行化設(shè)計階段,畢竟,在銷售量方面,x86市場是絕對領(lǐng)先的。
記者之前接觸過一些將應(yīng)用改為并行運行的案例,是采用集群系統(tǒng)后,將原來的應(yīng)用進行一些修改以便能夠充分利用集群系統(tǒng)并行處理的優(yōu)勢,比如石油勘探行業(yè)的用戶,他們在計算和分析地震勘探資料應(yīng)用中,采用大規(guī)模并行計算系統(tǒng)來實現(xiàn)疊前偏移和精確地震成像處理,提高勘探開發(fā)效益。不過,這些應(yīng)用都還處在一個剛剛開始的并行化應(yīng)用階段,采用的是集群系統(tǒng)。多核技術(shù)在x86服務(wù)器中成熟后,如何能夠充分利用到多核并行處理的優(yōu)勢,才是軟件層面真正的挑戰(zhàn),就是所謂的“線程級并行”。
處理器在并行計算方面所做出的技術(shù)革新貢獻,僅僅是整個產(chǎn)業(yè)鏈上的一個小環(huán)節(jié),與用戶應(yīng)用緊密相連的是軟件層,正如文章中引述的微軟軟件架構(gòu)師Sutter所說的:處理器設(shè)計首要的著眼點應(yīng)該是可編程性,而不是速度。
相關(guān)鏈接
真實案例研究 并行搜索
要在大量符合某條件的問題中查找最優(yōu)解決方案,或所有可枚舉出的解決方案,最流行的一種方法就是樹搜索。許多科學(xué)問題或日常生活中遇到的問題都可以轉(zhuǎn)換并表達為一個并行樹搜索問題??赡艿膽?yīng)用程序范圍從微不足道的解謎一直到復(fù)雜的戰(zhàn)略分析。一種流行的方式就是建造一個狀態(tài)樹,每個節(jié)點表示一種特定的應(yīng)用程序狀態(tài),然后對狀態(tài)樹進行搜索,找到具有最優(yōu)狀態(tài)的目標節(jié)點,或經(jīng)過最少的步驟抵達目標節(jié)點。
為這樣的并行搜索應(yīng)用程序開發(fā)軟件共有兩個步驟。第一步是創(chuàng)建一個良好的抽象模型和轉(zhuǎn)換問題,并以狀態(tài)樹的形式將其表現(xiàn)出來。抽象模型的質(zhì)量將影響樹的形狀和大小,也會影響搜索的難易程度。第二步是使用并行計算在整個狀態(tài)樹內(nèi)搜索。在大多數(shù)情況下,樹都是在程序運行時動態(tài)建造的。由于樹易于以一種不均衡的方式成長,因此隨機地將一個子分支指派給工作線程或進程,可能會失去負載均衡。
總體而言,概括并行搜索編程非常困難,從模型抽象開始,我們就要面對挑戰(zhàn),隨后是樹建造,最后是并行搜索算法。一個出色的樹模型需要開發(fā)人員具備指定行業(yè)的豐富經(jīng)驗,將問題完備地表達出來,并用樹節(jié)點的形式表現(xiàn)問題。建造狀態(tài)樹后,通常還需要對樹模式進行試驗分析,以設(shè)計出一種有效的并行搜索算法。算法通常需要對樹節(jié)點進行分割和分組,以發(fā)揮并行性能。