個人理解的循環分塊技術實現原理


最近看論文過程中看到了關於循環分塊(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 ;

代碼來自:一個新的循環分塊算法 -- 舒輝 康緋


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM