码迷,mamicode.com
首页 > 其他好文 > 详细

Loop Unrolling 循环展开

时间:2019-10-04 09:23:44      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:float   算数   计算   ini   程序   运行   循环   编译   app   

在csapp第五章5.2中提到了循环展开(loop unrolling)。这里展开一下为什么循环展开可以提升程序的效率。

以书中计算数组和的两段代码为例:

1.未展开:

 void psum1(float a[], float p[], long int n)
 {
 long int i;
 p[0] = a[0];
 for (i = 1; i < n; i++)
 p[i] = p[i-1] + a[i];
 }

2.展开:

 void psum2(float a[], float p[], long int n)
 {
 long int i;
 p[0] = a[0];
 for (i = 1; i < n-1; i+=2) {
 float mid_val = p[i-1] + a[i];
 p[i] = mid_val;
 p[i+1] = mid_val + a[i+1];
 }
 /* For odd n, finish remaining element */
 if (i < n)
 p[i] = p[i-1] + a[i];
 }

以上两段代码在功能上是相等的(计算数组和),但是经过展开的代码运行起来会更快。关键在于,展开后的代码使得编译器需要执行的指令减少了。

当循环未展开时,采用for循环对整个数组进行迭代,每次执行一次叠加操作——这意味着,数组有多长,编译器就会执行多少次对for循环条件的判断运算

Loop Unrolling 循环展开

标签:float   算数   计算   ini   程序   运行   循环   编译   app   

原文地址:https://www.cnblogs.com/liez/p/11621282.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!