c 编译选项-funroll-loops

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TH_NUM/article/details/86541300

一.循环展开

循环展开可以减少循环的次数,对程序的性能带了两方面的提高。一是减少了对循环没有直接贡献的计算,比如循环计数变量的计算,分支跳转指令的执行等。二是提供了进一步利用机器特性进行的优化的机会。.

优化后:

void sum4(vec_ptr v,data_t *dest){
int i;
int len=vec_length(v);
int limit=len-3;
data_t  *data=get_vec_start(v);
data_t acc=0;
for(i=0;i<limit;i+=4){
    acc=acc+data[i]+data[i+1];
    acc=acc+data[i+2]+data[i+3];
}
for(;i<len;++i)
    acc+=data[i];

*dest=acc;
}

通过循环展开,每次迭代将累加4个元素,减少了循环次数,从而减少了总的执行时间(单独使用这种优化方法,对浮点数累乘几乎没有提高,但是整数累乘得益于编译器的重关联代码变化会有大幅度提高)。

这种优化可以直接利用编译器完成,将优化level设定到较高,编译器会自动进行循环展开。使用gcc,可以显式使用-funroll-loops选项。

猜你喜欢

转载自blog.csdn.net/TH_NUM/article/details/86541300