Loop Unrolling

Loop Unrolling (循环展开)

Refs

Problem Definition

怎样最快的求出1,000,000个数的加法?

一眼就知道直接O(n)就可以

for (int i=0; i<=1000000; i ++) {
  sum += a[i];
}

这已经是复杂度的下限了,还可以怎么优化?

Loop Unrolling是一个很简单的编译器优化,相当直接却特别有效。当然,它也是我们理解更高级的优化的基础。

我们将回答两个问题 WHYHOW:

  • Why we need it?
  • How does it work?

Why we need it?

Reason I

: from Tutorial 2

#?如何在kramdown里嵌入css. ?如何分出两栏

#block_container { text-align:center; } #bloc1, #bloc2 { display:inline; }

<version rgtjf Copyright © All Rights Reserved.>
<version rgtjf Copyright © All Rights Reserved.>

我们用汇编来描述这段代码,假设R1寄存器存着数组a的基地址, R2里存着sum, R3从1,000,000开始。

Loop: LW R4, 0(R1);     //element of a
ADD R3, R3, R4
ADDI R1, R1, #4

How does it work?

Examples

Written on March 14, 2016