gpt4 book ai didi

c++ - g++ 优化中断循环

转载 作者:可可西里 更新时间:2023-11-01 16:57:50 25 4
gpt4 key购买 nike

几天前,我遇到了我认为是 g++ 5.3 中的错误,涉及在更高的 -OX 优化级别嵌套 for 循环。 (一直在专门为-O2-O3体验)。问题是,如果你有两个嵌套的 for 循环,它们有一些内部总和来跟踪总迭代次数,一旦这个总和超过其最大值,它就会阻止外部循环终止。我能够复制它的最小代码集是:

int main(){
int sum = 0;
// Value of 100 million. (2047483648 less than int32 max.)
int maxInner = 100000000;

int maxOuter = 30;

// 100million * 30 = 3 billion. (Larger than int32 max)

for(int i = 0; i < maxOuter; ++i)
{
for(int j = 0; j < maxInner; ++j)
{
++sum;
}
std::cout<<"i = "<<i<<" sum = "<<sum<<std::endl;
}
}

当使用 g++ -o run.me main.cpp 编译时,它会按预期输出运行:

i = 0 sum = 100000000
i = 1 sum = 200000000
i = 2 sum = 300000000
i = 3 sum = 400000000
i = 4 sum = 500000000
i = 5 sum = 600000000
i = 6 sum = 700000000
i = 7 sum = 800000000
i = 8 sum = 900000000
i = 9 sum = 1000000000
i = 10 sum = 1100000000
i = 11 sum = 1200000000
i = 12 sum = 1300000000
i = 13 sum = 1400000000
i = 14 sum = 1500000000
i = 15 sum = 1600000000
i = 16 sum = 1700000000
i = 17 sum = 1800000000
i = 18 sum = 1900000000
i = 19 sum = 2000000000
i = 20 sum = 2100000000
i = 21 sum = -2094967296
i = 22 sum = -1994967296
i = 23 sum = -1894967296
i = 24 sum = -1794967296
i = 25 sum = -1694967296
i = 26 sum = -1594967296
i = 27 sum = -1494967296
i = 28 sum = -1394967296
i = 29 sum = -1294967296

但是,当使用 g++ -O2 -o run.me main.cpp 编译时,外部循环无法终止。 (这仅在 maxInner * maxOuter > 2^31 时发生)虽然 sum 不断溢出,但它不应该以任何方式影响其他变量。我还在 Ideone.com 上使用此处演示的测试用例对此进行了测试:https://ideone.com/5MI5Jb

因此,我的问题是双重的。

  1. sum 的值如何以某种方式影响系统?没有任何决定基于它的值,它仅用于计数器和 std::cout 语句的目的。
  2. 什么可能导致不同优化级别的结果截然不同?

非常感谢您花时间阅读和考虑我的问题。

注意:此问题不同于现有问题,例如:Why does integer overflow on x86 with GCC cause an infinite loop?因为那个问题的问题是哨兵变量的溢出。然而,这道题中的 ij 都没有超过 100m 的值,更不用说 2^31 了。

最佳答案

这是对正确代码完全有效的优化。您的代码不正确。

GCC 看到的是循环退出条件的唯一途径 i >= maxOuter如果您在计算 sum 的早期循环迭代期间有符号整数溢出,则永远不会达到。 .编译器假定不存在有符号整数溢出,因为标准 C 中不允许有符号整数溢出。因此,i < maxOuter可以优化为 true .

这由 -faggressive-loop-optimizations 控制旗帜。您应该能够通过添加 -fno-aggressive-loop-optimizations 获得您期望的行为到你的命令行参数。但更好的办法是确保您的代码有效。使用无符号整数类型来保证有效的环绕行为。

关于c++ - g++ 优化中断循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36626810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com