唐佩佳,徐 云,鐘旭陽(yáng)
1(中國(guó)科學(xué)技術(shù)大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,合肥 230027)
2(安徽省高性能計(jì)算重點(diǎn)實(shí)驗(yàn)室,合肥 230026)
并行計(jì)算是目前主流的提高計(jì)算機(jī)系統(tǒng)計(jì)算速度和處理能力的一種有效手段,可將原有的串行程序改造為并行程序來(lái)解決性能問(wèn)題,充分利用并行計(jì)算技術(shù)提高數(shù)據(jù)處理能力.而串行程序并行化的過(guò)程需要專(zhuān)業(yè)的并行編程能力,需要大量的工程成本.同時(shí),隨著各種并行計(jì)算平臺(tái)數(shù)量的增加,并呈現(xiàn)出多樣化,需要保證并行程序有一定的跨平臺(tái)性,使得并行程序可在多個(gè)并行平臺(tái)上跨平臺(tái)運(yùn)行.然而,不同的并行計(jì)算平臺(tái)的硬件、所適用的并行模型和運(yùn)行時(shí)環(huán)境都各不相同,這對(duì)程序的可移植性提出了嚴(yán)峻的挑戰(zhàn).
串行程序并行化的工具或系統(tǒng)可以分為兩類(lèi):一類(lèi)是采用專(zhuān)用編譯器等自動(dòng)并行化工具直接將串行程序自動(dòng)并行化,編譯器開(kāi)發(fā)成本較高,而并行效率不高.比如斯坦福大學(xué)的SUIF 編譯器[1]和Mathews 的ACP編譯器[2],為了保持原有串行程序語(yǔ)義,導(dǎo)致編譯器的策略非常保守,實(shí)際效果不太理想.其他工具例如Cetus[3]、Par4all[4]、Pluto[5]僅可實(shí)現(xiàn)循環(huán)級(jí)別的并行,不支持任務(wù)并行.S2P[6]雖然提供了任務(wù)級(jí)并行,但其并行粒度沒(méi)有優(yōu)化.現(xiàn)有自動(dòng)并行化工具支持的并行平臺(tái)較少,僅僅包括共享存儲(chǔ)平臺(tái)的少數(shù)系統(tǒng)和少量異構(gòu)平臺(tái).另一類(lèi)是采用加編譯制導(dǎo)的編譯器或并行編程框架,對(duì)串行程序進(jìn)行輔助標(biāo)記來(lái)實(shí)現(xiàn)并行化.
常見(jiàn)的并行編程平臺(tái)主要有共享存儲(chǔ)和分布式存儲(chǔ)兩類(lèi).共享存儲(chǔ)平臺(tái)下,OpenMP 采用在串行程序中添加并行標(biāo)記語(yǔ)句的方法來(lái)實(shí)現(xiàn)并行化,這種方法會(huì)產(chǎn)生較好的并行效果但需要一定的標(biāo)記工作量,系統(tǒng)好壞取決標(biāo)記方法和工作量的大小.Blumofe 提出的Cilk/Cilk++[7,8]是一種基于C/C++的多線程并行編程模型,是在原有C/C++的基礎(chǔ)上提供和并行相關(guān)的制導(dǎo)標(biāo)記,實(shí)現(xiàn)任務(wù)分解和并行.Habel 等[9]實(shí)現(xiàn)了一種基于標(biāo)記的分布式并行編程框架的設(shè)計(jì),該框架提供了數(shù)據(jù)來(lái)源和分布的標(biāo)記,通過(guò)源到源編譯器將標(biāo)記解析為并行程序,但該框架僅支持矩陣密集型的科學(xué)計(jì)算.分布式存儲(chǔ)平臺(tái)下,MPI 并行編程模型采用消息傳遞機(jī)制完成并行計(jì)算和同步通信;以FORTRAN90 為基礎(chǔ)的HPF[10]并行編程模型,通過(guò)制導(dǎo)語(yǔ)句實(shí)現(xiàn)數(shù)據(jù)并行制導(dǎo)和數(shù)據(jù)映射制導(dǎo).Sourouri 提出的Panda[11]異構(gòu)并行編程框架可將帶標(biāo)記的串行代碼轉(zhuǎn)化為MPI或MPI+CUDA 并行代碼,但該框架缺少運(yùn)行時(shí)系統(tǒng).
同時(shí)支持共享存儲(chǔ)和分布式存儲(chǔ)的并行編程框架不多見(jiàn),這些系統(tǒng)和框架往往與應(yīng)用任務(wù)特性相關(guān)或一些特定并行編程模型相關(guān),實(shí)現(xiàn)或生成的并行程序效率也是一個(gè)問(wèn)題.Liu 等[12,13]提出了一個(gè)基于任務(wù)和管道(TNC)模型的并行編程框架.應(yīng)用程序分為主程序?qū)雍腿蝿?wù)實(shí)現(xiàn)層.主程序?qū)优c平臺(tái)無(wú)關(guān),框架提供定義和啟動(dòng)任務(wù)和管道的接口;任務(wù)實(shí)現(xiàn)層與平臺(tái)相關(guān),具體各類(lèi)型任務(wù)和管道由平臺(tái)相關(guān)編程方法實(shí)現(xiàn),框架再將任務(wù)和管道封裝,管道負(fù)責(zé)各任務(wù)間的通信.應(yīng)用程序主程序?qū)涌梢员3植蛔?任務(wù)實(shí)現(xiàn)層根據(jù)不同目標(biāo)平臺(tái)調(diào)整,從而提高并行程序的維護(hù)和可移植性,但該方法在分布式環(huán)境下通信開(kāi)銷(xiāo)較大.Kutil[14]提出了基于面向?qū)ο蟮腃++的編程框架,支持共享存儲(chǔ)平臺(tái)和分布式存儲(chǔ)平臺(tái).該方法將矩陣運(yùn)算分解為無(wú)通信的子運(yùn)算,由框架負(fù)責(zé)具體的數(shù)據(jù)通信,但該方法的并行化設(shè)計(jì)僅針對(duì)矩陣運(yùn)算領(lǐng)域,無(wú)法擴(kuò)展到其他計(jì)算任務(wù).
為了解決上述問(wèn)題,本文提出了一種基于標(biāo)記語(yǔ)言的三層并行編程框架.我們對(duì)共享和分布式存儲(chǔ)編程平臺(tái)的基本并行特性進(jìn)行抽象,提取各并行編程平臺(tái)并行程序的基本結(jié)構(gòu)和共同點(diǎn)形成跨平臺(tái)的標(biāo)記語(yǔ)言.實(shí)現(xiàn)了二個(gè)層間轉(zhuǎn)換過(guò)程,一個(gè)是串行程序?qū)拥讲⑿兄虚g代碼層轉(zhuǎn)換,采用對(duì)串行程序進(jìn)行并行標(biāo)記得到有并行語(yǔ)義的程序代碼;另一個(gè)是并行中間代碼層到目標(biāo)并行編程語(yǔ)言程序?qū)愚D(zhuǎn)換,采用對(duì)并行中間代碼進(jìn)行解析映射的方法,輔助并行編程框架實(shí)現(xiàn)目標(biāo)并行平臺(tái)的并行程序轉(zhuǎn)換.
為了使框架結(jié)構(gòu)清晰,設(shè)計(jì)了一個(gè)跨平臺(tái)的分層并行編程模型,共有3 層,分別是:上層、中層、和下層.如圖1所示.
圖1 編程框架的層次模型
上層是用戶(hù)的串行程序?qū)?是平臺(tái)無(wú)關(guān)的.中層是與串行程序?qū)?yīng)的、帶有制導(dǎo)標(biāo)記的中間代碼,有并行語(yǔ)義但與平臺(tái)無(wú)關(guān).下層是目標(biāo)并行編程語(yǔ)言程序?qū)?可在并行計(jì)算執(zhí)行模型上運(yùn)行,與平臺(tái)相關(guān).
并行計(jì)算執(zhí)行模型主要包括:成熟的通用并行計(jì)算執(zhí)行模型,例如Pthread、OpenMP、MPI 和CUDA、OpenACC 等;特殊應(yīng)用并行編程模型,例如Vxworks下多任務(wù)并行編程模型.
底層硬件平臺(tái)主要包括共享存儲(chǔ)多核CPU 平臺(tái)、分布式存儲(chǔ)Cluster、異構(gòu)GPU 三種類(lèi)型.
利用框架將一個(gè)串行程序?qū)崿F(xiàn)并行化的流程如圖2所示.首先輸入選擇待轉(zhuǎn)化的串行程序文件,進(jìn)入第一個(gè)層間轉(zhuǎn)換階段:在串行程序定義的位置添加并行標(biāo)記或者在需要并行參數(shù)尋優(yōu)和同步控制等功能的位置添加相應(yīng)的標(biāo)記,得到有并行語(yǔ)義的程序代碼.然后進(jìn)入第二個(gè)層間轉(zhuǎn)換階段:并行編程框架將逐一解析各并行標(biāo)記,結(jié)合用戶(hù)界面輸入的目標(biāo)平臺(tái)參數(shù),經(jīng)過(guò)一系列映射過(guò)程后得到目標(biāo)并行編程語(yǔ)言程序.
圖2 編程框架的處理流程模型
對(duì)串行程序進(jìn)行簡(jiǎn)單標(biāo)記,再經(jīng)過(guò)解析映射得到能夠并行地在共享存儲(chǔ)平臺(tái)、分布存儲(chǔ)平臺(tái)和GPU平臺(tái)等多種平臺(tái)上正常運(yùn)行的目標(biāo)并行編程語(yǔ)言程序.主要研究基于標(biāo)記的串行API 跨平臺(tái)并行化方法,包括兩個(gè)層間轉(zhuǎn)換過(guò)程:(1)并行中間代碼生成;(2)基于標(biāo)記信息的解析映射.
標(biāo)記語(yǔ)言用于輔助并行編程框架實(shí)現(xiàn)目標(biāo)并行平臺(tái)的并行程序轉(zhuǎn)換,是并行編程框架的重要組成部分.我們對(duì)多種并行平臺(tái)語(yǔ)言的基本并行特性進(jìn)行抽象,因此標(biāo)記語(yǔ)言是一種可表示并行語(yǔ)義的跨平臺(tái)標(biāo)記語(yǔ)言,命名為Sigma 標(biāo)記語(yǔ)言(以下簡(jiǎn)稱(chēng)標(biāo)記語(yǔ)言).以簡(jiǎn)潔易用、功能齊備的指導(dǎo)原則,設(shè)計(jì)了類(lèi)似OpenMP的三段式標(biāo)記語(yǔ)言.標(biāo)記語(yǔ)言的指令結(jié)構(gòu)如圖3所示.
圖3 標(biāo)記語(yǔ)言結(jié)構(gòu)
標(biāo)記語(yǔ)言共有5 類(lèi)19 條,包括并行、輔助并行、性能、平臺(tái)等類(lèi)型的標(biāo)記,標(biāo)記語(yǔ)言與平臺(tái)無(wú)關(guān).
本文研究的工程背景是雷達(dá)數(shù)據(jù)處理.以雷達(dá)數(shù)據(jù)為代表的此類(lèi)工業(yè)數(shù)據(jù)有以下幾個(gè)特點(diǎn):
(1)數(shù)據(jù)規(guī)整.每個(gè)數(shù)據(jù)包都有固定的大小,包含多批固定長(zhǎng)度和類(lèi)型的數(shù)據(jù).
(2)數(shù)據(jù)獨(dú)立性.各個(gè)數(shù)據(jù)包彼此獨(dú)立不相關(guān),可以單獨(dú)處理,對(duì)有的處理過(guò)程,數(shù)據(jù)包的各批次數(shù)據(jù)可以被單獨(dú)處理.
(3)周期性.每個(gè)數(shù)據(jù)包按固定周期到達(dá).
針對(duì)上述數(shù)據(jù)特點(diǎn),并行方式采用數(shù)據(jù)并行.并行標(biāo)記設(shè)計(jì)為#sigma parallel_task [標(biāo)記子句].
并行標(biāo)記提供了數(shù)據(jù)并行所需要的信息,有4 個(gè)標(biāo)記子句:
(1)src_data:提供串行API 輸入數(shù)據(jù)源、數(shù)據(jù)類(lèi)型和數(shù)據(jù)長(zhǎng)度;
(2)dst_data:提供串行API 輸出數(shù)據(jù)源、數(shù)據(jù)類(lèi)型和數(shù)據(jù)長(zhǎng)度;
(3)group:提供分組(批)數(shù),即數(shù)據(jù)源可以劃分為若干批或組來(lái)相對(duì)獨(dú)立的處理;
(4)varlist:串行API 的其他參數(shù).
采用對(duì)串行程序進(jìn)行并行標(biāo)記得到有并行語(yǔ)義的程序代碼,即第一層間轉(zhuǎn)換階段.
在一個(gè)需要并行化的數(shù)據(jù)處理串行API 的定義位置添加并行標(biāo)記得到并行中間代碼,如圖4所示.
圖4 并行中間代碼
采用對(duì)并行中間代碼進(jìn)行解析映射得到目標(biāo)并行編程語(yǔ)言程序,即第二層間轉(zhuǎn)換階段.
用戶(hù)在并行編程框架界面選擇目標(biāo)平臺(tái)參數(shù)(硬件平臺(tái)、操作系統(tǒng)和并行計(jì)算執(zhí)行模型等)后,框架將2.1 中的并行中間代碼進(jìn)行解析映射可以得到目標(biāo)平臺(tái)并行語(yǔ)言編程程序.具體步驟如下:
(1)標(biāo)記解析.并行編程框架將并行中間代碼進(jìn)行解析,得到標(biāo)記提供的數(shù)據(jù)并行參數(shù),如輸入數(shù)據(jù)源srcname、輸入數(shù)據(jù)源大小srcsize、輸出數(shù)據(jù)源dstname、輸出數(shù)據(jù)源大小dstsize、分批數(shù)num 和其他參數(shù);
(2)標(biāo)記映射.并行編程框架將并行中間代碼映射為基于數(shù)據(jù)并行的目標(biāo)平臺(tái)并行語(yǔ)言編程程序,
框架對(duì)多種并行平臺(tái)語(yǔ)言的基本并行特性進(jìn)行抽象.以Pthread 多線程線程池并行編程模型和MPI 并行編程模型為例,展示共享存儲(chǔ)平臺(tái)和分布式平臺(tái)的并行程序架構(gòu)對(duì)比如表1所示.
表1 共享存儲(chǔ)平臺(tái)和分布存儲(chǔ)平臺(tái)并行程序結(jié)構(gòu)對(duì)比
由表1可知,并行程序的主要結(jié)構(gòu)包括數(shù)據(jù)劃分和分發(fā)、調(diào)用原串行API、數(shù)據(jù)收集等部分.其他可用于數(shù)據(jù)并行的OpenMP 模型和Vxworks 系統(tǒng)并行模型等并行編程也滿(mǎn)足類(lèi)似結(jié)構(gòu).
因此,并行編程框架根據(jù)這個(gè)主體結(jié)構(gòu)封裝了多個(gè)目標(biāo)平臺(tái)下的基礎(chǔ)并行代碼段,主要用于并行初始化、數(shù)據(jù)分發(fā)和收集、并行計(jì)算執(zhí)行等.這些代碼段將使用上述(1)標(biāo)記解析得到的并行參數(shù).標(biāo)記映射過(guò)程,即目標(biāo)并行平臺(tái)代碼生成過(guò)程如算法1 所示.
算法1.并行標(biāo)記映射算法輸入:數(shù)據(jù)并行參數(shù)srcname、srcsize、dstname、dstsize、num 等,串行API 名稱(chēng),numprocs 為并行處理單元數(shù)(共享存儲(chǔ)平臺(tái)的計(jì)算單元是線程,分布式存儲(chǔ)平臺(tái)的計(jì)算單元是節(jié)點(diǎn)進(jìn)程);目標(biāo)平臺(tái)參數(shù)(硬件平臺(tái)、操作系統(tǒng)和并行計(jì)算執(zhí)行模型等).輸出:并行代碼.1)寫(xiě)初始化部分代碼.主要實(shí)現(xiàn)并行初始化和臨時(shí)變量定義,變量空間申請(qǐng),框架根據(jù)不同的目標(biāo)平臺(tái)使用不同的并行初始化代碼段.2)寫(xiě)數(shù)據(jù)劃分部分代碼.主要實(shí)現(xiàn)將num 批數(shù)據(jù)劃分為numprocs份;劃分方式有靜態(tài)和動(dòng)態(tài)劃分兩種,框架根據(jù)用戶(hù)選擇的劃分方式調(diào)用不同的函數(shù)實(shí)現(xiàn),函數(shù)參數(shù)將使用num 和numprocs.3)寫(xiě)數(shù)據(jù)分發(fā)部分代碼.主要實(shí)現(xiàn)將數(shù)據(jù)分發(fā)到每個(gè)并行處理單元.共享存儲(chǔ)平臺(tái)使用自定義函數(shù)Data_trans,以傳遞存儲(chǔ)地址實(shí)現(xiàn),分布式存儲(chǔ)平臺(tái)的數(shù)據(jù)分發(fā)使用MPI 自帶消息傳遞函數(shù),以傳消息實(shí)現(xiàn).框架根據(jù)不同的目標(biāo)平臺(tái)調(diào)用不同的數(shù)據(jù)分發(fā)代碼段,代碼段將使用srcname 和srcsize 參數(shù).
4)寫(xiě)數(shù)據(jù)處理部分代碼.主要實(shí)現(xiàn)數(shù)據(jù)的并行處理.共享存儲(chǔ)平臺(tái)以線程方式調(diào)用串行API,分布式存儲(chǔ)平臺(tái)以進(jìn)程方式調(diào)用串行API.框架根據(jù)不同的目標(biāo)平臺(tái)調(diào)用不同的并行計(jì)算執(zhí)行代碼段.5)寫(xiě)數(shù)據(jù)收集部分代碼.方法與3)類(lèi)似,主要實(shí)現(xiàn)收集各并行計(jì)算單元結(jié)果.框架提供的代碼段將使用dstname 和dstsize 參數(shù).6)寫(xiě)結(jié)束收尾部分代碼.主要實(shí)現(xiàn)變量空間回收和并行環(huán)境結(jié)束工作.
算法1 的第2)步中的數(shù)據(jù)劃分方式有靜態(tài)劃分和動(dòng)態(tài)劃分.靜態(tài)劃分是均勻劃分,數(shù)據(jù)劃分的塊數(shù)與并行處理單元數(shù)相等.動(dòng)態(tài)劃分指的是根據(jù)并行參數(shù)自動(dòng)尋優(yōu)的結(jié)果來(lái)進(jìn)行劃分,并行參數(shù)尋優(yōu)的方法見(jiàn)3.2.假設(shè)有4 個(gè)并行處理單元(共享存儲(chǔ)平臺(tái)的計(jì)算單元是線程,分布式存儲(chǔ)平臺(tái)的計(jì)算單元是節(jié)點(diǎn)進(jìn)程)來(lái)處理一個(gè)數(shù)據(jù)集,兩種劃分方式如圖5所示.
圖5 數(shù)據(jù)劃分方式示意圖
劃分后的數(shù)據(jù)是相對(duì)獨(dú)立的,在數(shù)據(jù)處理過(guò)程中各并行處理單元之間沒(méi)有數(shù)據(jù)交換和同步,不會(huì)出現(xiàn)數(shù)據(jù)競(jìng)爭(zhēng).對(duì)于某些有數(shù)據(jù)交換和同步需求的程序,參考fork/join 模型,將源程序中數(shù)據(jù)交換和同步部分保持不變,仍然采用串行執(zhí)行,將剩余部分封裝為一個(gè)或多個(gè)新的API,再對(duì)新API 進(jìn)行并行化.原串行程序的可并行部分通過(guò)并行化提高了運(yùn)行效率,不可并行部分實(shí)現(xiàn)了數(shù)據(jù)交換和同步功能,在保證原程序的總體功能實(shí)現(xiàn)的前提下實(shí)現(xiàn)了原串行API 的并行化.第4節(jié)中的副瓣對(duì)消計(jì)算實(shí)例即按此方法實(shí)現(xiàn).
算法1 的第4)步中共享存儲(chǔ)平臺(tái)的多線程實(shí)現(xiàn)所涉及的并行計(jì)算執(zhí)行代碼段包括:Pthread 模型、OpenMP模型和VxWorks 系統(tǒng)并行模型,分別使用Pthread 線程池、OpenMP 多線程制導(dǎo)和VxWorks 多任務(wù)實(shí)現(xiàn).
算法1 的第1)和6)步在全部并行計(jì)算完成前僅需執(zhí)行一次,為了提高易用性,將算法1 的2)到5)封裝為并行API 以供多次調(diào)用,同時(shí)保持并行API 和串行API保持參數(shù)列表的一致,增加了可讀性.
針對(duì)GPU 平臺(tái)并行程序的特殊程序結(jié)構(gòu),即host/device 混合編程模型,并行框架增加了面向GPU 平臺(tái)的kernel 標(biāo)記手段,可將kernel 標(biāo)記解析映射為CUDA API 并行實(shí)現(xiàn).
并行參數(shù)自動(dòng)尋優(yōu)的目的是幫助用戶(hù)選擇最優(yōu)的并行參數(shù),優(yōu)化并行效果.并行參數(shù)包括線程數(shù)、節(jié)點(diǎn)數(shù)和數(shù)據(jù)劃分比例等,綜合影響因素和優(yōu)化效果,共享存儲(chǔ)平臺(tái)和分布式存儲(chǔ)平臺(tái)分別挑選線程數(shù)和數(shù)據(jù)劃分比例作為優(yōu)化對(duì)象.使用并行參數(shù)自動(dòng)尋優(yōu)標(biāo)記后,框架將會(huì)生成目標(biāo)并行平臺(tái)下的并行參數(shù)自動(dòng)尋優(yōu)程序.
(1)共享存儲(chǔ)平臺(tái)
框架可自動(dòng)計(jì)算不同的線程數(shù)下程序的耗時(shí),并擇優(yōu)確定最佳線程數(shù).具體過(guò)程見(jiàn)算法2.
算法2.共享存儲(chǔ)平臺(tái)并行參數(shù)自動(dòng)選優(yōu)算法輸入:線程數(shù)集合P=2:N,N 為物理核數(shù),最小耗時(shí)初始值Tmin 初始化為最大值;輸出:最佳線程數(shù)Popt;1)for each 線程p 屬于P 2)統(tǒng)計(jì)多次并行函數(shù)運(yùn)行平均耗時(shí)t;3)if t 標(biāo)記使用方法:將標(biāo)記#sigma auto_optization_SM_start 和#sigma auto_optization_SM_end 分別加在并行域的開(kāi)始和結(jié)束位置即可. (2)分布式存儲(chǔ)平臺(tái): 框架可自動(dòng)收集同一個(gè)算例在不同的節(jié)點(diǎn)運(yùn)行耗時(shí)后確定最佳數(shù)據(jù)分配比例,實(shí)現(xiàn)負(fù)載均衡.具體過(guò)程見(jiàn)算法3. 由節(jié)點(diǎn)耗時(shí)計(jì)算任務(wù)分配比例的公式如下所示: 其中,Ti是多次標(biāo)準(zhǔn)算例運(yùn)行平均耗時(shí),N是分布式存儲(chǔ)平臺(tái)的節(jié)點(diǎn)數(shù),Li是節(jié)點(diǎn)i的任務(wù)分配比例. 由任務(wù)分配比例計(jì)算任務(wù)量的公式如下所示: 其中,W是待分配的任務(wù)總量,Wi是節(jié)點(diǎn)i所分配得到的任務(wù)量. 算法3.分布式存儲(chǔ)平臺(tái)并行參數(shù)自動(dòng)選優(yōu)算法輸入:分布式存儲(chǔ)集群有N 個(gè)節(jié)點(diǎn),待分配的任務(wù)總量W,標(biāo)準(zhǔn)算例;輸出:各節(jié)點(diǎn)的任務(wù)量w;1)for each node i 2)統(tǒng)計(jì)多次標(biāo)準(zhǔn)算例運(yùn)行平均耗時(shí)Ti;3)收集其他節(jié)點(diǎn)的耗時(shí)Tj,j∈{1:N }但j≠i;4)通過(guò)式(1)計(jì)算節(jié)點(diǎn)i 的任務(wù)分配比例;5)通過(guò)式(2)計(jì)算節(jié)點(diǎn)i 的任務(wù)量;6)end for 7)return 各節(jié)點(diǎn)的任務(wù)量w; 標(biāo)記使用方法:將標(biāo)記#sigma auto_optization_DM 加在并行域的開(kāi)始位置即可. 雷達(dá)信號(hào)處理是典型的工程應(yīng)用,涉及大量的數(shù)學(xué)變換和矩陣運(yùn)算,我們選取脈沖壓縮、副瓣對(duì)消、雷達(dá)圖像處理3 個(gè)處理過(guò)程來(lái)測(cè)試我們的并行框架. 首先,對(duì)并行框架的功能性進(jìn)行測(cè)試,即考察并行框架是否能正確實(shí)現(xiàn)跨平臺(tái)并行化. 以副瓣對(duì)消串行API 程序并行化為例.首先,對(duì)副瓣對(duì)消串行API 程序添加并行標(biāo)記,選擇目標(biāo)并行平臺(tái)為“共享存儲(chǔ)多核平臺(tái)-Linux-Pthread”和“分布式存儲(chǔ)平臺(tái)-Linux-MPI”后,并行框架對(duì)標(biāo)記進(jìn)行解析映射后,可以生成共享存儲(chǔ)多核平臺(tái)(Linux)上的線程池的并行程序和分布式存儲(chǔ)平臺(tái)(Linux)上的基于MPI 的并行程序.兩個(gè)并行程序的運(yùn)行結(jié)果和原串行程序一致,證明本文的并行框架具備跨平臺(tái)并行能力. 其次,對(duì)框架生成的并行編程語(yǔ)言程序的性能也進(jìn)行了測(cè)試. (1)共享存儲(chǔ)平臺(tái) 以脈沖壓縮串行程序?yàn)槔?對(duì)于框架產(chǎn)生的Pthread脈沖壓縮并行程序,將并行度分別取2、4、8、12 時(shí),即線程數(shù)分別取為上述值時(shí),統(tǒng)計(jì)程序運(yùn)行耗時(shí).并行程序運(yùn)行的硬件條件為:共享存儲(chǔ)平臺(tái)Intel(R)Core(TM)i7-8700K CPU @ 3.40 GHz,CPU 6 核12 線程,Linux. 由程序運(yùn)行耗時(shí)計(jì)算的加速比如圖6所示,由圖可知,兩種方式產(chǎn)生的并行程序均取得了較好的加速比,由于框架自動(dòng)生成的并行程序的冗余代碼較少,代碼規(guī)范且執(zhí)行高效,其加速比要略?xún)?yōu)于人工實(shí)現(xiàn)的并行程序. 圖6 脈沖壓縮并行程序取不同并行度時(shí)并行化加速比 (2)分布式存儲(chǔ)平臺(tái) 以雷達(dá)圖像處理串行程序的并行化為例,對(duì)于框架產(chǎn)生的分布式圖像處理并行程序,將并行度分別取1、8、16、24 時(shí),即進(jìn)程數(shù)分別取為上述值時(shí),統(tǒng)計(jì)程序運(yùn)行耗時(shí).并行程序運(yùn)行的硬件條件為:雙AMD(R)Opteron 6168 處理器,每個(gè)處理器有12 個(gè)計(jì)算核心,Linux 操作系統(tǒng). 由程序運(yùn)行耗時(shí)計(jì)算的加速比如圖7所示,由圖可知,由并行框架生成的并行程序的加速比與人工實(shí)現(xiàn)的并行程序相當(dāng). 圖7 圖像處理并行程序取不同并行度時(shí)并行化加速比 我們?cè)O(shè)計(jì)了一種基于標(biāo)記語(yǔ)言的上層(串行程序?qū)?、中層(并行中間代碼層)和下層(目標(biāo)并行編程語(yǔ)言程序?qū)?的三層并行編程框架.我們對(duì)多種并行平臺(tái)語(yǔ)言的基本并行特性進(jìn)行抽象,形成了一種可表示并行語(yǔ)義的跨平臺(tái)標(biāo)記語(yǔ)言.標(biāo)記語(yǔ)言輔助并行編程框架完成了二個(gè)層間轉(zhuǎn)換過(guò)程,實(shí)現(xiàn)了目標(biāo)并行平臺(tái)的并行程序轉(zhuǎn)換,解決了串行代碼自動(dòng)跨平臺(tái)并行化的問(wèn)題,僅需一次標(biāo)記,即可得到多個(gè)平臺(tái)的并行程序.將框架應(yīng)用于雷達(dá)數(shù)據(jù)處理程序并行化改造,實(shí)驗(yàn)結(jié)果表明,該框架可以生成目標(biāo)并行編程平臺(tái)的并行代碼,且經(jīng)過(guò)系統(tǒng)參數(shù)優(yōu)化的并行代碼加速比相當(dāng)或優(yōu)于人工實(shí)現(xiàn)的并行代碼.4 實(shí)驗(yàn)分析
5 結(jié)論與展望