循环分段

 

  • 两层的循环分段:传统的循环分段就是把单层循环分解为两层紧嵌的循环套,也叫strip mining(条带开采)。内层循环遍历的是尺寸为strip的连续区域(或叫条带循环,the strip loop),外层循环的步进单位是strip,这个strip就是最内层的分段因子。串行循环分段的变换总是合法的。广义的循环分段则是把单个循环变换为更多层的嵌套循环。

 

  • 多层的循环分段:属于广义的循环分段,即把迭代总数为niter的单个循环变换为d层嵌套循环的变换,分段因子从外到内依次是<f1,f2,f3, …,fd>,其中fi是正整数且大于1,且。显然fi=1是没有意义的分段。不等式系统意味着d层循环与原循环的迭代次数可能不一致,需要做上界约束。

 

  • 非退化的循环分段:把迭代总数为niter的单个循环进行多层分段被称为非退化的,如果满足。换句话说,f1的取值是最小合法值(由niter和内层分段决定),任何更大的取值都会在分段后的程序中引入更多空转的无效迭代。

 

设原始循环是

     for(i=0;i<niter;i++) 

           body(i)

4层循环分段变换后

    for (i1=0; i1<f1; i1++) 

        for (i2=0; i2<f2; i2++)  

            for (i3=0; i3<f3; i3++) 

                 for (i4=0; i4<f4; i4++)

                 { 

                             k=i1*(f2*f3*f4)+i2*(f3*f4)+i3*f4+i4;   

                            if (k<niter)

                                     body(k);

                }

上一篇:使用ceph-deploy部署ceph环境 rdb+mds


下一篇:使用readlines()读取文件时出现/n及其解决办法