多面體模型的基本概念
編譯器中的多面體模型(polyhedral model)是一種高效的程序優(yōu)化技術(shù),它將復(fù)雜的循環(huán)依賴關(guān)系映射到高維幾何空間,從而在編譯階段實(shí)現(xiàn)對(duì)計(jì)算任務(wù)的并行化和局部性優(yōu)化。
通過(guò)構(gòu)建和操作多面體表示能有效地調(diào)度指令和數(shù)據(jù)訪問(wèn),以減少資源爭(zhēng)用和緩存未命中德情況,從而提高程序執(zhí)行的性能。
本文將介紹多面體編譯技術(shù)的理論基礎(chǔ),并以發(fā)掘循環(huán)可并行部分為例子講解。
將循環(huán)表示為線性不等式
首先我們來(lái)看一個(gè)常規(guī)的循環(huán):
for(inti=1;ifor(intj=1;j
我們先不關(guān)注循環(huán)內(nèi)執(zhí)行什么語(yǔ)句,而是關(guān)注迭代空間 i
和 j
以及迭代限制條件:
i>=1
i=1
j
轉(zhuǎn)換為等價(jià)形式:
i>=1
i<=?N?-?1
j>=1
j<=?N?-?1
再統(tǒng)一轉(zhuǎn)換為 >= 0
約束:
i-1>=0
-i+N-1>=0
j-1>=0
-j+N-1>=0
這樣就將循環(huán)迭代空間表示成了一組線性不等式,然后矩陣形式表達(dá)如下:
這一組線性不等式其實(shí)就定義了二維空間上的一個(gè)矩形:

我們?cè)賮?lái)看一個(gè)例子,
for(inti=1;ifor(intj=1;jif(i<=?N?-?j?+?1)
S[i][j]=....
這個(gè)循環(huán)相比上面的循環(huán)就是多了一個(gè)約束條件 i <= N - j + 1
也就是 j <= -i + N + 1
,也就是在上面坐標(biāo)軸上再加一條線:

這樣就很清楚了,這些約束的交集對(duì)應(yīng)了二維空間上的一個(gè)多面體(polyhedron),同理可得如果是三層循環(huán)空間,那就是對(duì)應(yīng)了三維空間上的一個(gè)多面體,每個(gè)約束條件對(duì)應(yīng)一個(gè)二維平面,而在 n 維空間上就是一個(gè)超平面了。
數(shù)據(jù)依賴距離向量的定義
接著我們來(lái)介紹怎么分析循環(huán)中的數(shù)據(jù)依賴,多面體模型中的數(shù)據(jù)依賴描述了在循環(huán)結(jié)構(gòu)中,不同迭代之間因數(shù)據(jù)訪問(wèn)而產(chǎn)生的依賴關(guān)系。
而對(duì)于循環(huán)嵌套內(nèi)的依賴關(guān)系,可以用距離向量來(lái)描述相對(duì)執(zhí)行順序。
比如對(duì)于以下循環(huán):
for(inti=1;ifor(intj=1;j-1][j]+A[i][j-1];
在當(dāng)前次 (i
和 j
) 迭代中需要往 A[i][j]
中寫入數(shù)據(jù),然后需要讀取 A[i-1][j]
和 A[i][j-1]
的內(nèi)容也就是循環(huán)維度 i
和 j
的前一次迭代 i-1
和 j-1
需要寫入的位置,所以這就引入了一個(gè)先寫然后再讀取的數(shù)據(jù)依賴。
然后我們定義距離向量如下,向量的值大小表示了在對(duì)應(yīng)循環(huán)維度上依賴的上一次迭代的距離:
-
A[i][j] -> A[i-1][j]
的距離向量為[i - (i -1 ), j - j] = [1, 0]
-
A[i][j] -> A[i][j-1]
的距離向量為[i - i, j - (j - 1)] = [0, 1]
矩陣形式表示:
能否簡(jiǎn)單從距離向量看出循環(huán)能否并行呢?
以下討論均假設(shè)循環(huán)都是正向且迭代步長(zhǎng)均為1,且迭代空間為常規(guī)的整數(shù),且不保證結(jié)論能推廣。
對(duì)于該循環(huán)
for(inti=1;ifor(intj=1;j-1][j]+A[i][j-1];
其距離向量為:
分析第一行可以看到i
循環(huán)維度的上,依賴了前一次迭代的計(jì)算值,所以可以知道在 i
循環(huán)上無(wú)法并行。
而分析第二行依賴,j
循環(huán)維度也依賴了前一次迭代的計(jì)算值,所以可以知道在 j
循環(huán)上也無(wú)法并行。
又比如對(duì)于循環(huán)
for(inti=1;ifor(intj=1;j0;
其距離向量為 [0]
。
循環(huán)維度 i
和 j
對(duì)于前面的循環(huán)沒(méi)有任何依賴,所以能將兩個(gè)循環(huán)合并為一個(gè)然后并行運(yùn)行。
又比如對(duì)于循環(huán)
for(inti=1;ifor(intj=1;j-1];
其距離向量為 [0, 1]
。循環(huán)維度 i
無(wú)依賴可以在該維度上并行,但是在 j
維度上有依賴無(wú)法并行。
又比如對(duì)于循環(huán)
for(inti=1;ifor(intj=1;j-1][j]+A[i-1][j-1];
其距離向量為:
兩個(gè)依賴的循環(huán)維度 i
都是大于0,所以在 i
維度無(wú)法循環(huán),但是在 j
維度卻可以并行。所以只要第一列都大于0,則不用分析第二維了,第二維是一定可以并行的。
有些循環(huán)的距離向量沒(méi)法直接看出來(lái),比如經(jīng)典的矩陣乘法:
for(inti=0;ifor(intj=0;jfor(intk=0;k
這里在循環(huán)維度 k
上有個(gè)隱式的依賴,當(dāng)前迭代(i', j', k')
的 C[i'][j']
計(jì)算依賴于上一次迭代 (i', j', k'-1)
計(jì)算得到的 C[i'][j']
,所以距離向量為 [0, 0, k-(k'-1)=1]
,所以在k
維度上無(wú)法并行。
對(duì)循環(huán)做變換
多面體模型中對(duì)循環(huán)優(yōu)化是通過(guò)對(duì)循環(huán)迭代空間做仿射變換實(shí)現(xiàn)的,下面我們介紹三種簡(jiǎn)單的變換,交換和傾斜。
以二層循環(huán)為例:
for(inti=1;i<=?2;++i)
for(intj=1;j<=?3;++j)
S[i][j]=...
對(duì)應(yīng)的每一次迭代的執(zhí)行順序如下圖,圖中的圓型就對(duì)應(yīng)每一次的迭代,序號(hào)就是原始執(zhí)行順序:

假設(shè)變換后的循環(huán)維度分別是 i'
和 j'
。
循環(huán)交換
對(duì)應(yīng)的變換矩陣如下:
變換過(guò)程如下:
對(duì)應(yīng)的循環(huán)就變?yōu)椋?/p>
for(intj=1;j<=?3;++j)
for(inti=1;i<=?2;++i)
S[i][j]=...
對(duì)應(yīng)的迭代執(zhí)行順序如下:
圖中圓型的序號(hào)為變換前的原始執(zhí)行順序。
第一個(gè)執(zhí)行的坐標(biāo)是 (i'=1, j'=1)
,對(duì)應(yīng)原始坐標(biāo)是 (i=1, j=1)
,對(duì)應(yīng)圓型 1
。
第二個(gè)執(zhí)行的坐標(biāo)是 (i'=1, j'=2)
,對(duì)應(yīng)原始坐標(biāo)是 (i=2, j=1)
,對(duì)應(yīng)圓型 4
。
第三個(gè)執(zhí)行的坐標(biāo)是 (i'=2, j'=1)
,對(duì)應(yīng)原始坐標(biāo)是 (i=1, j=2)
,對(duì)應(yīng)圓型 2
。
其他以此類推
循環(huán)反轉(zhuǎn)
對(duì)應(yīng)的變換矩陣如下,假設(shè)就對(duì)循環(huán) i
做反轉(zhuǎn):
變換過(guò)程如下:
對(duì)應(yīng)的循環(huán)就變?yōu)椋?/p>
for(inti=-1;i>=-2;--i)
for(intj=1;j<=?3;++j)
S[i+3][j]=...
對(duì)應(yīng)的迭代執(zhí)行順序如下:

圖中圓型的序號(hào)為變換前的原始執(zhí)行順序。
第1個(gè)迭代 (i'=-1, j'=1)
對(duì)應(yīng)原始坐標(biāo) (i=2, j=1)
,對(duì)應(yīng)原始循環(huán)的圓型 4
。
第4個(gè)迭代 (i'=-2, j'=1)
對(duì)應(yīng)原始坐標(biāo) (i=1, j=1)
,對(duì)應(yīng)原始循環(huán)圓型 1
。
循環(huán)傾斜
對(duì)應(yīng)的變換矩陣如下:
變換過(guò)程如下:
對(duì)應(yīng)的循環(huán)就變?yōu)椋?/p>
for(intd=2;d<=?5;++d)
for(intj=max(1,d-2);j<=?min(3,d-1);++j)
inti=d-j;
S[i][j]=...
對(duì)應(yīng)的迭代執(zhí)行順序如下:

圖中圓型的序號(hào)為變換前的原始執(zhí)行順序。
第1個(gè)迭代 (d=2, j=1)
對(duì)應(yīng)原始坐標(biāo) (i=1, j=1)
,對(duì)應(yīng)原始循環(huán)的圓型 1
。
第2個(gè)迭代 (d=3, j=1)
對(duì)應(yīng)原始坐標(biāo) (i=2, j=1)
,對(duì)應(yīng)原始循環(huán)圓型 4
。
第3個(gè)迭代 (d=3, j=2)
對(duì)應(yīng)原始坐標(biāo) (i=1, j=2)
,對(duì)應(yīng)原始循環(huán)圓型 2
。
第4個(gè)迭代 (d=4, j=2)
對(duì)應(yīng)原始坐標(biāo) (i=2, j=2)
,對(duì)應(yīng)原始循環(huán)圓型 5
。
第5個(gè)迭代 (d=4, j=3)
對(duì)應(yīng)原始坐標(biāo) (i=1, j=3)
,對(duì)應(yīng)原始循環(huán)圓型 3
。
第6個(gè)迭代 (d=5, j=3)
對(duì)應(yīng)原始坐標(biāo) (i=2, j=3)
,對(duì)應(yīng)原始循環(huán)圓型 6
。
如何將串行執(zhí)行的循環(huán)轉(zhuǎn)換為可并行執(zhí)行
以下面的循環(huán)為例:
for(inti=1;i<=?N;?i++)?{
????for(intj=1;j<=?N;?j++)?{
????????A[i][j]?=?A[i-1][j]+A[i][j-1];
}
}
分析上其數(shù)據(jù)依賴分析可得其距離向量:
可知該循環(huán)在 i
和 j
維度上都無(wú)法并行執(zhí)行。
接下來(lái)嘗試對(duì)循環(huán)空間 i
和 j
做仿射變換,我們采用傾斜變換,其實(shí)這個(gè)是很經(jīng)典的一個(gè)并行方法了,稱之為對(duì)角線變換。
具體到多面體編譯技術(shù)的代碼的實(shí)現(xiàn),是怎么自動(dòng)找到這個(gè)變換的過(guò)程我還沒(méi)完全弄懂,所以假設(shè)我們現(xiàn)在知道了是直接應(yīng)用傾斜變換:
代碼變?yōu)椋?/p>
for(intd=2;d<=?2*N;++d){
for(intj=max(1,d-N);j<=?min(N,?d?-?1);++j){
inti=d-j;
A[i][j]=A[i-1][j]+A[i][j-1];
}
}
接著分析數(shù)據(jù)依賴矩陣,這時(shí)候 A[i][j]= A[d-j][j]
的計(jì)算都只依賴于循環(huán) d
前一次迭代的計(jì)算而循環(huán) j
維度上沒(méi)有數(shù)據(jù)依賴,所以依賴矩陣為:
從依賴矩陣可知,變換后的循環(huán)可以在 j
循環(huán)維度上做循環(huán)。
上面的文字解釋可能有些抽象我們畫圖來(lái)輔助解釋,假設(shè)循環(huán)上界 N=5
,則原始的循環(huán)迭代空間如下圖所示:

黑色實(shí)線箭頭表示每個(gè)計(jì)算 A[i][j]
的計(jì)算順序。
數(shù)據(jù)依賴關(guān)系如下:

紅色箭頭表示數(shù)據(jù)依賴。
則經(jīng)過(guò)傾斜變換后的循環(huán)迭代空間如下:
for(intd=2;d<=?2*5;++d){
for(intj=max(1,d-5);j<=?min(5,d-1);++j){
inti=d-j;
A[i][j]=A[i-1][j]+A[i][j-1];
}
}

其實(shí)就是對(duì)應(yīng)于原始空間上,按照對(duì)角線的順序去遍歷。
數(shù)據(jù)依賴如下:

從數(shù)據(jù)依賴上看,可以看到變換后在 j
維度上沒(méi)有數(shù)據(jù)依賴所以可以并行執(zhí)行。
最后在 j
維度上加上 omp
并行:
for(intd=2;d<=?2*5;++d){
#pragmaompfor
for(intj=max(1,d-5);j<=?min(5,d-1);++j){
inti=d-j;
A[i][j]=A[i-1][j]+A[i][j-1];
}
}
后記
這篇文章中對(duì)于多面體模型有并不少是個(gè)人理解,不一定準(zhǔn)確。多面體編譯技術(shù)個(gè)人感覺(jué)很復(fù)雜,在閱讀相關(guān)文獻(xiàn)和書籍的時(shí)候,還需要去搜過(guò)相關(guān)前置知識(shí)才能看懂大概。
而這篇學(xué)習(xí)筆記也僅僅是介紹了一些基本的入門概念,多面體編譯技術(shù)能做的事情并不僅僅局限于本文所介紹的循環(huán)變換發(fā)掘可并行部分,感興趣的讀者可以閱讀參考資料。
審核編輯 :李倩
-
線性
+關(guān)注
關(guān)注
0文章
204瀏覽量
25639 -
模型
+關(guān)注
關(guān)注
1文章
3519瀏覽量
50411 -
編譯
+關(guān)注
關(guān)注
0文章
679瀏覽量
33980
原文標(biāo)題:參考資料
文章出處:【微信號(hào):GiantPandaCV,微信公眾號(hào):GiantPandaCV】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
智能天線的基本概念
人工智能基本概念機(jī)器學(xué)習(xí)算法
無(wú)刷電機(jī)的基本概念和參數(shù)介紹及無(wú)刷電機(jī)在模型上的應(yīng)用資料免費(fèi)下載

計(jì)算機(jī)網(wǎng)絡(luò)的基本概念和網(wǎng)絡(luò)互連模型OSI資料免費(fèi)下載

放大器的基本概念

評(píng)論