循環展開

維基百科,自由的百科全書
跳至導覽 跳至搜尋

循環展開,英文中稱(Loop unwinding或loop unrolling),是一種犧牲程序的尺寸來加快程序的執行速度的優化方法。可以由程式設計師完成,也可由編譯器自動優化完成。

循環展開最常用來降低循環開銷,為具有多個功能單元的處理器提供指令級並行。也有利於指令流水線的調度。

例子[編輯]

for (i = 1; i <= 60; i++) 
   a[i] = a[i] * b + c;

可以如此循環展開:

for (i = 1; i <= 20; i+=1)
{
  a[i] = a[i] * b + c;
  a[i+1] = a[i+1] * b + c;
  a[i+2] = a[i+2] * b + c;
}

這被稱為展開了兩次。

優點[編輯]

  • 分支預測失敗減少。
  • 如果循環體內語句沒有數據相關,增加了並發執行的機會。
  • 可以在執行時動態循環展開。這種情況在編譯時也不可能掌握。

缺點[編輯]

  • 代碼膨脹
  • 代碼可讀性降低,除非是編譯器透明執行循環展開。
  • 循環體內包含遞歸可能會降低循環展開的得益。[1]

進一步閱讀[編輯]

Kennedy, Ken; Allen, Randy. Optimizing Compilers for Modern Architectures: A Dependence-based Approach. Morgan Kaufmann. 2001. ISBN 1-55860-286-0. 

參考文獻[編輯]

外部連結[編輯]