最近看論文過程中看到了關於循環分塊(loop tiling)相關的內容,不太能理解。網上關於這方面的內容也不多,找了兩篇論文看了下,大致知道是怎么實現的了,以下是流水賬:
首先對於一個嵌套循環:
do i = 0 to N - 1 step 1
do j = 0 to N -1 step 1
do k = 0 to N - 1 step 1
A( j , k ) ;
continue
首先忽略循環 i = 0 to N-1 由於循環體並未涉及 i ,所以外層循環只是簡單的對於內層循環的重復執行 ;
內層循環的維度為A(N ,N)循環塊 ;
下面將該循環進行分塊,分塊大小為 Bj X Bk :
do jj = 0 to N-1 step Bj
do kk = 0 to N-1 step Bk
do i = 0 to N-1 step 1 //將每個分塊內的內容重復計算N次 (與位置無關,可置於最外層)
do j = jj to min( jj+Bj-1 , N-1 ) step 1
do k = kk to min( kk+Bk-1 , N-1 ) step 1
A( j , k ) ;
continue ;
理解:將原始的外圍循環塊以Bj,Bk為單位進行分割,如jj每隔Bj大小取值一次,直到N-1,也就是將j原來的取值范圍[0,N-1] 划分為以Bj為大小的多個塊,kk同理;
然后在內層,對於取定的 jj ,j 的取值遍歷從當前jj值開始到下一個jj值-1的所有值(step=1),這樣隨着外層jj值的改變,j的值就能遍歷所有的[0,N-1]的值;
上述代碼中的min( jj+Bj-1 , N-1 ) 的出現是因為最后一個分塊長度可能不足Bj ;