循環展開
循環展開(Loop unwinding或loop unrolling),是一種犧牲程序的大小來加快程序執行速度的優化方法。可以由程式設計師完成,也可由編譯器自動優化完成。
循環展開最常用來降低循環開銷,為具有多個功能單元的處理器提供指令級並行。也有利於指令管線化的調度。
例子
for (i = 1; i <= 60; i++)
a[i] = a[i] * b + c;
可以如此循環展開:
for (i = 1; i <= 58; i+=3)
{
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.
參考文獻
- ^ Adam Horvath "Code unwinding - performance is far away" (頁面存檔備份,存於網際網路檔案館)
外部連結
- Chapter 7, pages 8 to 10, of Michael Abrash's Graphics Programming Black Book is about loop unrolling, with an example in x86 assembly.
- [1] (頁面存檔備份,存於網際網路檔案館) Generalized Loop Unrolling, gives a concise introduction.