迴圈判斷外提
迴圈判斷外提(英語:loop unswitching)是一種編譯器最佳化的方法。迴圈判斷外提將迴圈中的條件式移到迴圈之外,在「若」與「否則」式裡各放置一個原來迴圈的內容。這可以增進迴圈平行處理的可能性。[1]
以下是一個簡單的例子。若程式碼想要將陣列 x、y 相加,並根據變數 w 做別的事,就有這種 C 的程式碼:
int i, w, x[1000], y[1000];
for (i = 0; i < 1000; i++) {
x[i] = x[i] + y[i];
if (w)
y[i] = 0;
}
因為有迴圈裡的條件式,要安全的平行處理這個迴圈變得很困難。若進行判斷外提,這個迴圈會變成:
int i, w, x[1000], y[1000];
if (w) {
for (i = 0; i < 1000; i++) {
x[i] = x[i] + y[i];
y[i] = 0;
}
} else {
for (i = 0; i < 1000; i++) {
x[i] = x[i] + y[i];
}
}
雖然迴圈外提會讓程式碼的量加倍,現在各個迴圈可以分別進行最佳化。
參考資料
- ^ Keith Cooper; Linda Torczon. Engineering a Compiler. 2004: 520–521 [2021-07-31]. ISBN 9781558606982. (原始內容存檔於2021-07-31).
- ^ GCC 3.4 系列 — 更動、新功能與臭蟲修復. [2012-06-03]. (原始內容存檔於2010-07-10).