本發(fā)明涉及計算機程序的并行性開發(fā)領(lǐng)域,尤其涉及一種高效的DOACROSS循環(huán)的并行優(yōu)化策略。
背景技術(shù):
開發(fā)并行程序以充分發(fā)揮多核乃至眾核處理器的性能仍然是一個開放式難題。自動并行化技術(shù)因具備多重優(yōu)勢,能夠在增強多核處理器系統(tǒng)性能上發(fā)揮重要作用。以科學(xué)和工程計算應(yīng)用程序為代表的很多計算密集型應(yīng)用程序,其中的嵌套循環(huán)會占用大量的運行時間。按照循環(huán)攜帶的依賴關(guān)系,可以將循環(huán)分為三類:不攜帶跨迭代依賴的循環(huán)(所有的迭代都可與其他迭代進行完全并行),這樣的循環(huán)稱之為DOALL循環(huán);而將攜帶跨迭代依賴的循環(huán)稱為DOACROSS循環(huán);相應(yīng)的,只能串行執(zhí)行的循環(huán)稱之為串行循環(huán)。在這三種循環(huán)中,DOALL循環(huán)的并行性最強,其次為DOACROSS循環(huán),而串行循環(huán)則不具有任何并行性。大部分研究者和并行編譯器將關(guān)注點放在DOALL循環(huán)上,而將DOACROSS循環(huán)作為串行程序處理。但是,Amdahl定律指出,串行執(zhí)行的DOACROSS循環(huán)勢必會嚴(yán)重制約程序總體的并行加速效果。所以,開發(fā)DOACROSS循環(huán)中的潛在并行性具有重要意義。
對于DOACROSS循環(huán)的研究已有多年歷史。現(xiàn)有主流的自動化并行策略主要包括以下三種策略:
一、Unnikrishnan在文章《A practical approach to DOACROSS parallelization》中認(rèn)為單層的并行性足以開發(fā)可利用資源,只考慮了規(guī)則DOACROSS循環(huán)(即能夠靜態(tài)確定依賴關(guān)系的DOACROSS循環(huán)),提出了一種complier-and-runtime的方法,稱為依賴折疊(dependence folding)。該方法使用一個保守依賴(conservative dependence)表示循環(huán)分塊攜帶的多個相鄰依賴。通過該方法,為每個線程分配的同步變量個數(shù)不會超過嵌套循環(huán)的層數(shù);此外,還給出了一個收益分析模型來選擇最優(yōu)的流水計算粒度。以下簡稱ENPA策略。
二、Liu在文章《面向共享存儲結(jié)構(gòu)的并行編譯優(yōu)化技術(shù)研究》的工作面向的也是規(guī)則DOACROSS循環(huán)中的單層并行性,設(shè)計了一個從循環(huán)層中尋找計算劃分層和循環(huán)分塊層的啟發(fā)式算法,并且再次減少了每個線程的同步變量個數(shù),限定為1。此外,她還提出了一個基于流水并行的代價模型,用以選擇最佳流水計算粒度。以下簡稱CHPA策略。
三、PLuTo是一款針對仿射嵌套循環(huán)的基于多面體模型的自動并行局部性優(yōu)化工具。PLuTo通過為手工標(biāo)記的C語言源代碼尋找有效的仿射變換序列生成分塊后的OpenMP并行代碼,通過循環(huán)偏斜的方法對代碼進行了轉(zhuǎn)換,由轉(zhuǎn)換后的并行程序在多核架構(gòu)上可以獲得較好的性能提升。以下簡稱PLuTo策略。
在實際使用時,以上三種策略各有優(yōu)劣,但均未能達(dá)到多核處理器并行加速效果的最佳值。
技術(shù)實現(xiàn)要素:
為了克服上述現(xiàn)有技術(shù)存在的問題,本發(fā)明的目的在于提供一種DOACROSS循環(huán)的并行優(yōu)化方法,能夠獲得相比現(xiàn)有并行策略更好的加速比,以及更好的并行可擴展性。
為達(dá)到上述目的,本發(fā)明采用了以下技術(shù)方案:
并行計算完美嵌套循環(huán)時,每一個空閑線程申請進入臨界區(qū)A;成功進入A的線程從就緒節(jié)點隊列頭部獲取一個節(jié)點,并將該節(jié)點從就緒節(jié)點隊列中刪除后退出A;獲取該節(jié)點的線程計算該節(jié)點所指示的分塊,計算完成后申請進入臨界區(qū)B;成功進入B后的線程根據(jù)自身最近計算完成的分塊更新完美嵌套循環(huán)的循環(huán)分塊狀態(tài)矩陣,并根據(jù)更新后的循環(huán)分塊狀態(tài)矩陣更新就緒節(jié)點隊列,然后退出B,成為空閑線程,再次申請進入臨界區(qū)A;所述節(jié)點是用于指向一個分塊在循環(huán)分塊狀態(tài)矩陣中的坐標(biāo)的數(shù)據(jù)結(jié)構(gòu)。
所述循環(huán)分塊狀態(tài)矩陣的元素表示依據(jù)矩形循環(huán)分塊方法對完美嵌套循環(huán)的計算區(qū)域進行劃分所形成的各個分塊的執(zhí)行完成情況;元素與分塊一一對應(yīng)。
所述更新就緒節(jié)點隊列包括以下步驟:根據(jù)更新后的循環(huán)分塊狀態(tài)矩陣,若按字典序小于分塊b且與分塊b直接相鄰的分塊都已經(jīng)計算完成,則將分塊b對應(yīng)的節(jié)點加入就緒節(jié)點隊列尾部。
所述完美嵌套循環(huán)是通過對初始嵌套循環(huán)進行循環(huán)融合和循環(huán)交換操作而得到的,所述初始嵌套循環(huán)為非完美嵌套循環(huán)。
所述完美嵌套循環(huán)在并行計算前對阻止波陣面的規(guī)則推進的依賴關(guān)系進行消除。
所述完美嵌套循環(huán)的理論執(zhí)行時間TYZPA按下式計算:
其中,N表示經(jīng)過分塊后得到的分塊總數(shù),p表示可用線程數(shù),tji表示第i個線程執(zhí)行第j個分塊所花費的總時間,i_last表示編號最大的線程。
本發(fā)明的有益效果體現(xiàn)在:
本發(fā)明通過引入一個就緒節(jié)點隊列,將同步操作轉(zhuǎn)變?yōu)檎{(diào)度操作,實現(xiàn)了將計算區(qū)域動態(tài)分配給各線程,即,某一線程將不再固定于執(zhí)行某一片計算區(qū)域,而是總是可以及時地執(zhí)行已經(jīng)滿足可執(zhí)行條件的那些分塊。通過本發(fā)明,消除了現(xiàn)有策略存在的靜態(tài)任務(wù)分配導(dǎo)致的資源浪費現(xiàn)象,并通過理論分析證明了本發(fā)明的效果接近最優(yōu)。
附圖說明
圖1是調(diào)度策略整體流程圖;
圖2是一個二維循環(huán)TSM示意圖。
具體實施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實施例,對本發(fā)明進行進一步地詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的實施例僅僅用于解釋本發(fā)明的基本構(gòu)想,并不用于限定本發(fā)明的保護范圍。
本發(fā)明提供一種高效的DOACROSS循環(huán)的并行優(yōu)化策略(簡稱YZPA策略)。在引出該策略之前,本發(fā)明提出了關(guān)于波陣面規(guī)則推進的兩個約束條件:
約束一:統(tǒng)一采取矩形循環(huán)分塊方法。
約束二:循環(huán)分塊間的塊間依賴集合IBS包含分塊后迭代空間的所有單位坐標(biāo)向量。波陣面的推進需要保持正確的塊間依賴。
本發(fā)明在保證數(shù)據(jù)依賴正確性基礎(chǔ)上,未采用現(xiàn)有策略中將某一片計算任務(wù)固定分配給各線程后利用線程間同步來進行并行化的做法,而是加入了一個狀態(tài)矩陣和一個就緒節(jié)點隊列,將同步操作轉(zhuǎn)變?yōu)閷途w節(jié)點隊列的入隊/出隊操作。本發(fā)明實現(xiàn)了各線程對計算區(qū)域的動態(tài)任務(wù)分配,即,在保證波陣面推進的基礎(chǔ)上,某一線程將不再固定于執(zhí)行某一片計算區(qū)域,而是總是及時地執(zhí)行已經(jīng)滿足可執(zhí)行條件的那些分塊,同時也實現(xiàn)了多維分塊。
本發(fā)明需要維護一個n維循環(huán)分塊狀態(tài)矩陣(Tile State Matrix,TSM),以及一個就緒節(jié)點隊列(Ready Node Queue,RNQ),采用矩形循環(huán)分塊方式。TSM用于標(biāo)記分塊后的循環(huán)空間的執(zhí)行完成情況,TSM中的一個元素s對應(yīng)一個分塊b,元素s的坐標(biāo)對應(yīng)分塊空間中分塊b的坐標(biāo),元素s為0表示該分塊尚未完成計算,為1則表示該分塊已經(jīng)完成計算。RNQ中的節(jié)點是一個簡易數(shù)據(jù)結(jié)構(gòu),包含n個成員(n為循環(huán)深度),用以指向一個分塊在上述矩陣中的坐標(biāo)。當(dāng)上述矩陣中按字典序小于某元素(假設(shè)對應(yīng)分塊b)且與該元素直接相鄰的元素都已經(jīng)計算完成,該元素(分塊b)對應(yīng)的節(jié)點將被加入上述隊列。這個限制保證了波陣面規(guī)則推進(即約束二)。
本發(fā)明的并行優(yōu)化策略如表1所示:
表1.YZPA策略主體
參見圖1,YZPA策略具體包括以下步驟:
第一步,對初始嵌套循環(huán)進行循環(huán)融合和循環(huán)交換操作(如果可以),優(yōu)化循環(huán)的局部性。循環(huán)融合(Loop Merge)是指將兩個及以上的循環(huán)合并為一個循環(huán),用以增大循環(huán)體大小,增強局部性,并且可用于消除某些阻止其他循環(huán)變換的狀態(tài)。循環(huán)交換(Loop Interchange)是指交換兩層循環(huán)的相對位置,可以增強數(shù)據(jù)的局部性,但需要滿足一定的約束條件才可進行。對循環(huán)進行優(yōu)化的原則是不能破壞循環(huán)攜帶依賴關(guān)系,否則會導(dǎo)致錯誤結(jié)果。表2給出本步驟的具體過程。
表2.循環(huán)優(yōu)化步驟
第二步,經(jīng)過循環(huán)優(yōu)化后如果不能得到一個完美嵌套循環(huán)(Perfectly Nested Loops),則該循環(huán)無法應(yīng)用本策略。而對于得到的完美嵌套循環(huán),需要消除阻止波陣面的規(guī)則推進的依賴關(guān)系。因為要保持循環(huán)進行的正確性,固有依賴關(guān)系不能憑空消除,只不過是利用循環(huán)偏斜等技術(shù)將其改變。阻止波陣面的規(guī)則推進的依賴關(guān)系只是因為該依賴關(guān)系包含有負(fù)元素,所以,利用循環(huán)偏斜等技術(shù)將其負(fù)元素“歸零”即可“消除”該依賴關(guān)系。表3給出本步驟的具體過程。
表3.依賴消除步驟
第三步,對第二步所得到的循環(huán)進行矩形循環(huán)分塊,并按照分塊因子初始化TSM,創(chuàng)建一個RNQ;將按字典序最小的分塊的n維坐標(biāo)寫入一個節(jié)點(初始化RNQ),并將該節(jié)點插入RNQ尾部;進入并行區(qū)后,每一個空閑線程申請進入臨界區(qū)A;成功進入A的線程將從RNQ頭部獲取一個節(jié)點,并將其從RNQ中刪除后退出A;獲得節(jié)點的線程將會計算該節(jié)點所指示的計算區(qū)域(一個循環(huán)分塊),計算完成后申請進入臨界區(qū)B;成功進入B的線程將更新TSM,并根據(jù)新的TSM更新RNQ,退出B后再次申請進入A。由此往復(fù),直到所有計算區(qū)域均已完成。這一步是整個策略的核心部分。表4給出本步驟的具體過程。
表4.核心調(diào)度步驟
YZPA策略應(yīng)用實例
如圖2所示的一個2維TSM,它表示了一個2維完美嵌套循環(huán)的循環(huán)分塊狀態(tài)矩陣,對于就緒節(jié)點隊列的維護(指加入或取出節(jié)點)需要各線程互斥進行,所以設(shè)立了臨界區(qū)A和臨界區(qū)B,分別實現(xiàn)就緒節(jié)點隊列的互斥取出和互斥加入。假設(shè)線程x完成了分塊(1,4)的計算,開始申請進入臨界區(qū)B維護RNQ;線程x成功進入臨界區(qū)B后將TSM的s14(表示矩陣中第1行第4列的元素)置1,到達(dá)圖2所示狀態(tài),正方形圈出的元素s15對應(yīng)的分塊(1,5)已經(jīng)滿足開始執(zhí)行的條件,于是線程x將該分塊對應(yīng)的節(jié)點(1,5)加入就緒節(jié)點隊列(RNQ)尾部。線程x維護完RNQ后退出臨界區(qū)B,成為空閑進程,開始申請進入臨界區(qū)A。
第一步,當(dāng)線程y(y可以等于x)完成當(dāng)前分塊的計算并且維護完RNQ退出臨界區(qū)B后,線程y成為空閑進程,開始申請進入臨界區(qū)A。假設(shè)線程y成功進入臨界區(qū)A訪問RNQ,它將取出節(jié)點(1,5)(假設(shè)該節(jié)點已位于隊列頭部),并計算該節(jié)點所指示的分塊。因為圓圈圈出的元素s42尚未滿足加入隊列的條件(其左側(cè)相鄰元素s41為0),所以它將不被加入隊列,而是要等到s41為1時才可以被加入隊列。(s41、s32,即位于s42左側(cè)和上側(cè)位置的元素所對應(yīng)的分塊在字典序上小于s42所對應(yīng)的分塊。s42的對角線位置上的元素不是其相鄰元素,相應(yīng)分塊也不是相鄰分塊。)
第二步,一旦線程y完成分塊(1,5)的計算,它將申請進入臨界區(qū)B更新TSM,將s15置1,并依此來維護RNQ(如果有新的節(jié)點滿足開始計算的條件,線程y將其加入RNQ,如果沒有,則跳過)。至此,線程y完成了一次完整的計算周期,退出臨界區(qū)B成為空閑進程,直接進入下一個周期,跳到第一步。
本發(fā)明除了提出YZPA策略,還用理論分析的方法給出了各策略的理論執(zhí)行時間。
用tji表示線程i執(zhí)行分塊j所花費的總時間,包括運算時間和同步開銷時間。注意,因為各策略的同步機制不盡相同,所以對于不同的策略,t的值也不盡相同。N表示經(jīng)過分塊后得到的分塊總數(shù),p表示可用線程數(shù),線程編號由1開始,i_last表示編號最大的線程。為了理論估計的簡單起見,令N很大,則可以將流水線填充和排空時間都不納入考慮。此時,處于滿載狀態(tài)的流水線長度為N/p-(p-1)。經(jīng)過理論分析得出的各策略的理論執(zhí)行時間TCHPA、TENPA、TPLuTo、TYZPA如下:
可以看出,在不考慮各策略的同步開銷有所不同的情況下(即認(rèn)為同步開銷相同),本發(fā)明提出的YZPA策略的理論執(zhí)行時間要短于現(xiàn)有三種策略的理論執(zhí)行時間,且接近最優(yōu)執(zhí)行時間Tmin。無法達(dá)到最優(yōu)執(zhí)行時間的原因在于:在實際實現(xiàn)中,因為YZPA策略需要使用互斥操作維護一個全局隊列,互斥操作的開銷較大,所以其性能不會達(dá)到最優(yōu)加速性能。
經(jīng)過實驗驗證,本發(fā)明YZPA策略的性能加速比以及并行可擴展性都優(yōu)于另外三種策略。