Loop Unrolling 循环展开

在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循环条件的判断运算

posted @ 2019-10-04 04:00  Liez  阅读(1793)  评论(0编辑  收藏  举报