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