Loop Unrolling 循环展开

Posted liez

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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循环条件的判断运算

以上是关于Loop Unrolling 循环展开的主要内容,如果未能解决你的问题,请参考以下文章

展开 y86 循环

强制/说服/欺骗 GCC 展开 _Longer_ 循环?

如何要求 GCC 完全展开这个循环(即剥离这个循环)?

使用循环展开计算正数、负数和零数的最有效方法

Python3练习题系列(03)

[未解决问题记录]python asyncio+aiohttp出现Exception ignored:RuntimeError('Event loop is closed')(代码片段