使用 -O3 优化编译 GNU/Linux

使用 -O3 优化编译 GNU/Linux

据说使用-O3gcc 优化选项编译 GNU 工具和 Linux 内核会产生奇怪的 bug。这是真的吗?有人尝试过还是这只是一个骗局?

答案1

-O3有几个缺点:

  1. 首先,它生成的代码通常比-O2或慢-Os。有时,由于循环展开,它会产生更长的代码,实际上,由于代码的缓存性能较差,代码可能会更慢。
  2. 正如所说,它有时会产生错误的代码。这可能是由于优化错误或代码错误(例如忽略严格别名)。由于内核代码有时是“智能”的,有时必须是“智能的”,我想说某些内核开发人员可能犯了一些错误。当我使用当时稳定的 gcc 4.5 编译内核时,我遇到了各种奇怪的问题,例如用户空间实用程序崩溃。由于各种错误,我仍然使用 gcc 4.4 作为内核和几个选定的用户空间实用程序。同样的情况也适用于-O3.
  3. 我不认为它给 Linux 内核带来太多好处。内核不进行繁重的计算,并且在某些地方进行了汇编优化。-O3旗帜将不是改变上下文切换的成本或 I/O 的速度。我认为整体性能加速 <0.1% 是不值得的。

答案2

在过去的 10 年里,我一直在运行多个 Gentoo 系统,其中包含 1000 多个-O3 -march=native全球使用的软件包,但尚未遇到任何这些本-O3应出现的神秘稳定性问题。 CPU 密集型应用程序(如数学/科学应用程序)的基准测试始终表明-O3可以生成更快的代码,毕竟如果不这样做,那就毫无意义。对于大多数桌面应用程序来说,CFLAGS由于它们受 IO 限制,所以并不那么重要,但对于受 CPU 限制的服务器端内容来说,这很重要。

答案3

它是在Gentoo中使用的,我没有发现任何异常。

答案4

-O3 使用一些激进的优化,只有在有关寄存器使用、堆栈帧如何交互以及函数重入性的某些假设为真时才是安全的,并且这些假设在某些代码(如内核)中不能保证为真,特别是当内联汇编时使用(因为它在内核及其驱动程序模块的一些非常低级别的部分中)。

相关内容