曹 杭 袁 良 黃 珊 張?jiān)迫?徐勇軍 陸鵬起 張廣婷
1(計(jì)算機(jī)體系結(jié)構(gòu)國家重點(diǎn)實(shí)驗(yàn)室(中國科學(xué)院計(jì)算技術(shù)研究所) 北京 100190)
2(中國科學(xué)院大學(xué) 北京 100049)
Stencil計(jì)算(模板計(jì)算)是科學(xué)工程應(yīng)用中一類常見的嵌套循環(huán)算法,也被稱為“結(jié)構(gòu)化網(wǎng)格計(jì)算”,是13個(gè)伯克利核心計(jì)算模式之一.在動(dòng)態(tài)規(guī)劃、圖像處理等領(lǐng)域的很多算法中也包含相似的依賴模式.Stencil定義了一種更新結(jié)點(diǎn)所需鄰居結(jié)點(diǎn)的模式.Stencil計(jì)算在時(shí)間維度上迭代更新規(guī)則的d維網(wǎng)格(也稱為數(shù)據(jù)空間),數(shù)據(jù)空間沿著時(shí)間維度更新,產(chǎn)生的d+1維空間被稱為迭代空間.
與其他的數(shù)值算法不同,例如稠密或稀疏矩陣計(jì)算類型的多樣性主要來源于輸入數(shù)據(jù)如稠密或稀疏矩陣的數(shù)據(jù)量,Stencil的計(jì)算類型本質(zhì)上取決于問題的類型.Stencil可以從不同的角度進(jìn)行分類,如格點(diǎn)維度(1維,2維,…),鄰居數(shù)目,即階數(shù)(3點(diǎn),5點(diǎn),…),形狀(盒型,星型,…),依賴類型(高斯-賽德爾,雅可比,…)和邊界條件(常量的,周期的,…)等.
Stencil計(jì)算具有計(jì)算密集度低的特征,d維Stencil的簡(jiǎn)單實(shí)現(xiàn)由d+1個(gè)循環(huán)組成,其中最外層循環(huán)遍歷時(shí)間維度,內(nèi)層循環(huán)更新d維空間的所有格點(diǎn).簡(jiǎn)單實(shí)現(xiàn)的數(shù)據(jù)重用度較差且典型的帶寬受限.
分塊是提高多重嵌套循環(huán)的數(shù)據(jù)局部性和并行度最有效的優(yōu)化技術(shù)之一,目前有大量針對(duì)Stencil計(jì)算分塊方案的研究.空間分塊算法促進(jìn)了2維至更高維度Stencil在一個(gè)時(shí)間步內(nèi)的數(shù)據(jù)重用.為了進(jìn)一步增強(qiáng)數(shù)據(jù)重用度,往往同時(shí)考慮時(shí)間維度和空間維度,后文將詳細(xì)介紹這些技術(shù).另一類工作采用簡(jiǎn)單的超矩形分塊形狀[1-4]并引入冗余計(jì)算來解決塊間數(shù)據(jù)依賴.這些研究包括自動(dòng)調(diào)優(yōu)框架[5-12]、編程模型[13-14]、CPU[2,15-18]、GPU[19-23]和Phi[24-25]上的手動(dòng)調(diào)優(yōu)實(shí)現(xiàn).
不同的Stencil類型也衍生出不同的解決方案.Pluto系統(tǒng)[26]延伸到周期性邊界條件Stencil的處理[27].菱形分塊最初是針對(duì)1維Stencil的分塊[28],然后擴(kuò)展到更高維度的Stencil[29].高速緩存參數(shù)無關(guān)(cache oblivious)方案從最初的算法[30-31],CORALS(cache oblivious parallelograms)方案[32],發(fā)展到能處理任意Stencil并達(dá)到最大并發(fā)度的Pochoir系統(tǒng)[33].
據(jù)我們所知,目前沒有針對(duì)不同Stencil形狀的解決方案,特別是盒型和星型Stencil.星型Stencil只依賴于每個(gè)坐標(biāo)軸上的點(diǎn),盒型Stencil在此之外還有對(duì)角線上的數(shù)據(jù)依賴.不區(qū)分盒型和星型Stencil的根本原因可能是盒型Stencil包含星型Stencil,任何適用于盒型Stencil的算法也能應(yīng)用到星型Stencil.
本文首先在數(shù)據(jù)空間上提出“自然塊”的概念來確定星型和盒型Stencil之間的區(qū)別.然后針對(duì)星型Stencil提出了一個(gè)新的2層密鋪方案,在此方案中,自然塊和它的后繼塊可以密鋪整個(gè)空間,而他們沿著時(shí)間維度擴(kuò)展后形成對(duì)迭代空間的密鋪.密鋪框架類似于文獻(xiàn)[34]中提出的方法.我們將統(tǒng)一闡述基于自然塊概念的2種方案并將已有的方案稱為盒型密鋪而將新提出的方案稱為星型密鋪.
在密鋪方案中區(qū)別盒型和星型Stencil有2個(gè)主要的優(yōu)點(diǎn),分別利用不同層次上的數(shù)據(jù)局部性.首先,當(dāng)給定緩存大小時(shí),相比盒型密鋪,用星型Stencil的自然塊密鋪能得到更大的塊,這樣可以更有效地減少內(nèi)存系統(tǒng)的壓力;其次,我們針對(duì)第二后繼塊中的元素提出了一個(gè)新穎的“2次更新”技術(shù),可對(duì)1個(gè)元素連續(xù)進(jìn)行2次更新,進(jìn)一步提升了核心數(shù)據(jù)的重用.
分塊技術(shù)[35-39]是探究多層嵌套循環(huán)數(shù)據(jù)局部性和并行度最有效的轉(zhuǎn)換技術(shù)之一.Wonnacott和Strout[40]對(duì)比了一些現(xiàn)有分塊方案的可擴(kuò)展性,下面我們將總結(jié)一些和Stencil計(jì)算有關(guān)的技術(shù).
1) 重疊分塊(overlapped tiling).高性能領(lǐng)域中經(jīng)常在手動(dòng)調(diào)優(yōu)的實(shí)現(xiàn)中采用超矩形分塊[1-4].為了執(zhí)行多個(gè)時(shí)間步,往往采用冗余計(jì)算[41]來解決分塊之間的依賴,這就是重疊分塊[28,42].Philips和Fatica[22]提出了GPU上手動(dòng)調(diào)優(yōu)的手寫3.5維分塊實(shí)現(xiàn)方案,在2.5維分塊方案[4]上增加了時(shí)間維度上的劃分.Demmel等人[43-44]減少了2倍的冗余計(jì)算.形狀規(guī)則的超矩形可以獲得更高的并發(fā)度和更多細(xì)粒度優(yōu)化.
2) 時(shí)間偏移(time skewing).時(shí)間偏移分塊[45-47](分塊形狀在2維上是平行四邊形,在3維上是平行六面體,在更高維上是超平行體)消除了冗余計(jì)算,但是大多數(shù)方法只用單一形狀的塊填充空間,導(dǎo)致流水線啟動(dòng)和有限的并發(fā)度[48-49].
3) 菱形分塊(diamond tiling).Bondhugula等人[26]對(duì)1維Stencil采用菱形分塊.Bandishti等人[29,50]將此方法擴(kuò)展到更高空間維度的Stencil.Grosser等人[51]對(duì)2維的菱形尖端粗粒度化形成六邊形,在3維上演化成截掉頂端的八面體.
4) 緩存無關(guān)分塊(cache oblivious tiling).緩存無關(guān)技術(shù)旨在內(nèi)存層次結(jié)構(gòu)參數(shù)未知時(shí)充分利用數(shù)據(jù)局部性.Frigo和Strumpen提出了第1個(gè)串行[30]和并行[31]緩存無關(guān)Stencil算法.緩存無關(guān)平行四邊形方法[32]同時(shí)分離時(shí)間空間維度,但是會(huì)導(dǎo)致波陣面并行.Pochior[33]實(shí)現(xiàn)了多維空間劃分,能夠同時(shí)劃分所有空間維度.
5) 分裂分塊(split tiling).分裂分塊方法發(fā)掘每個(gè)塊中的獨(dú)立子塊,然后將這些子塊發(fā)送給他們的后繼塊,使得剩下的區(qū)域同樣可以并發(fā)執(zhí)行[28,52-54].Grosser等人[55]提出了另一個(gè)類似于具有緩存無關(guān)范式的多維空間劃分的分裂分塊方法.嵌套分裂分塊(the nested split-tiling)[56]能在所有空間維度遞歸分裂.
6) 混合分塊(hybrid tiling).Strzodka等人[57]提出的CATS(cache accurate time skewing)算法結(jié)合了菱形分塊、平行四邊形分塊和流水線處理.Grosser等人[58]采用混合六邊形和平行四邊形的分塊算法.這些算法取某一維空間和時(shí)間維度組成平面,用六邊形分塊和菱形分塊進(jìn)行劃分,在剩下的空間維度中采用時(shí)間偏移分塊,從而分解迭代空間.混合分裂分塊方法[56]結(jié)合了嵌套分裂分塊和時(shí)間偏移分塊.
7) 密鋪分塊(tessellating).密鋪方案[34]適用于包括星型和盒型等不同Stencil類型.空間被一系列分塊密鋪,分塊之間可以無冗余并行執(zhí)行.相應(yīng)地,這些分塊在時(shí)間維度上擴(kuò)展后得到的擴(kuò)展塊可以在迭代空間中形成密鋪.簡(jiǎn)單明了的數(shù)學(xué)特性使得這種方法可以與細(xì)粒度優(yōu)化方法相結(jié)合.
為了使核心程序達(dá)到更高的性能,核心內(nèi)的優(yōu)化技術(shù)如計(jì)算重用[59-60]、計(jì)算重組[61]、向量化[15,62-64]和數(shù)據(jù)布局轉(zhuǎn)換[65-66]等十分關(guān)鍵.但是這些方法大多沒有對(duì)不同的Stencil形狀進(jìn)行區(qū)分.本文設(shè)計(jì)實(shí)現(xiàn)了一個(gè)新穎的技術(shù)來提升星型Stencil核心程序級(jí)別上的數(shù)據(jù)重用.這種技術(shù)也可以應(yīng)用到其他的分塊方法上.
本節(jié)首先介紹一個(gè)新的概念,即自然塊,來區(qū)分不同的Stencil形狀特征.然后圍繞自然塊和后繼塊這2個(gè)方面,詳細(xì)描述新提出的星型Stencil密鋪方案以及已有的盒型密鋪方案[34].最后將密鋪方案應(yīng)用于高階Stencil和不同的邊界條件.
Gauss-Seidel Stencil需要執(zhí)行逐點(diǎn)45°流水線啟動(dòng),使用分塊技術(shù)也不能使其完全并發(fā)啟動(dòng)[28].因此我們僅考慮Jacobi Stencil.此外,星型Stencil只能應(yīng)用到2維數(shù)據(jù)空間中,我們只討論2維Stencil.在第5節(jié)的實(shí)驗(yàn)中,對(duì)于3維星型Stencil將保留1維數(shù)據(jù)空間不進(jìn)行切分.
密鋪3維迭代空間對(duì)應(yīng)于計(jì)算2維Stencil,我們首先將其劃分成多個(gè)相同的時(shí)間片.在一個(gè)時(shí)間片開始時(shí)所有格點(diǎn)處于同一時(shí)間維度,結(jié)束時(shí)所有格點(diǎn)都更新了t個(gè)時(shí)間步(在下面的例子中t=4).不失一般性,我們只討論第1個(gè)時(shí)間片的密鋪,即密鋪前所有格點(diǎn)的時(shí)間維度均為0,密鋪后所有格點(diǎn)的時(shí)間維度為t.
Fig. 1 Natural block B0(0)圖1 自然塊B0(0)
當(dāng)所有格點(diǎn)在時(shí)間維度上的值相同時(shí),更新某一格點(diǎn)t個(gè)時(shí)間步所需的最小鄰居點(diǎn)集被稱為時(shí)間步為t的自然塊,簡(jiǎn)稱自然塊.
圖1(a)和圖1(b)分別展示了2D9P盒型Stencil和2D5P星型Stencil時(shí)間步長(zhǎng)為4的自然塊.
最大更新方法[34]與自然塊概念相近.具體定義為:在數(shù)據(jù)空間中給定B,沿著時(shí)間維度最大更新每個(gè)格點(diǎn),直到不滿足Stencil定義的依賴關(guān)系為止.形式上而言,對(duì)所有格點(diǎn)b∈B,滿足以下2個(gè)條件中任一個(gè)時(shí),停止更新:
1)time[b]=t,t是給定的最大時(shí)間更新步數(shù);
2) 存在至少一個(gè)b的鄰居b′,b′的時(shí)間維度嚴(yán)格小于b(time[b′]