- 两层的循环分段:传统的循环分段就是把单层循环分解为两层紧嵌的循环套,也叫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);
}