回圈判断外提
外观
![本页使用了标题或全文手工转换](http://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
回圈判断外提(英语: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).
|