Sun Studio 12:Fortran 编程指南

9.1.1.8 -unroll=n

展开具有长迭代计数的短循环对某些例程很有利。但是,展开也会增加程序长度,甚至可能会降低其他循环的性能。如果 n=1(缺省值),优化器不会自动展开循环。如果 n 大于 1,优化器会尝试展开循环直至达到深度 n

编译器的代码产生器根据因子个数决定是否展开循环。即使该选项是以 n>1 指定的,编译器也可能拒绝展开循环。

如果可以展开具有可变循环限制的 DO 循环,已展开的版本和原始循环均会被编译。对迭代计数进行的运行时测试将决定是否适合执行已展开的循环。循环展开,特别是对于只有一条或两条语句的简单循环,会增加每次迭代执行的计算量,并且会为优化器提供调度寄存器和简化操作的更好机会。迭代次数间的权衡、循环的复杂性以及展开深度的选择都不易确定,并且可能需要进行一些试验。

下例展示如何有可能用 -unroll=4 将简单循环展开成四级深度(源代码不会随该选项而改变):

原始循环:


    DO I=1,20000
       X(I) = X(I) + Y(I)*A(I)
    END DO

经 4 次编译展开后,它会变成类似下面的样子


    DO I=1, 19997,4
       TEMP1 = X(I) + Y(I)*A(I)
       TEMP2 = X(I+1) + Y(I+1)*A(I+1)
       TEMP3 = X(I+2) + Y(I+2)*A(I+2)
       X(I+3) = X(I+3) + Y(I+3)*A(I+3)
       X(I) = TEMP1
       X(I+1) = TEMP2
       X(I+2) = TEMP3
    END DO

本例展示了一个具有固定循环计数的简单循环。对于可变循环计数,重构将更加复杂。