考虑到我正在从源代码编译GCC + mpfr、gmp、mpc、libelf和binutils,这样更改优化标志是一个好主意吗?
CFLAGS="-O3" CXXFLAGS="-O3" ./configure
在配置GCC或其他软件时,您需要注意什么?
我有一个c2duo处理器。
编辑:我担心这些标志可能会改变这些程序/库的行为。
考虑到我正在从源代码编译GCC + mpfr、gmp、mpc、libelf和binutils,这样更改优化标志是一个好主意吗?
CFLAGS="-O3" CXXFLAGS="-O3" ./configure
在配置GCC或其他软件时,您需要注意什么?
我有一个c2duo处理器。
编辑:我担心这些标志可能会改变这些程序/库的行为。
您可以做两件事:
If you're natively bootstrapping, you can do a full, and complete profile guided bootstrap. This will build the compiler and dependencies with a bootstrapped compiler providing the third round with the profile information it can use to optimize itself. After configure
, do make profiledbootstrap
. Note you can place the dependencies and stuff likke binutils and gdb inside the gcc source tree, and they should be built as well in the process.
If you don't want to go through a long profiled bootstrap process, set CFLAGS
, CXXFLAGS
, CFLAGS_FOR_TARGET
, CXXFLAGS_FOR_TARGET
, etc. at GCC configure time to:
-O2 -flto -march=core2
And set LDFLAGS
and LDFLAGS_FOR_TARGET
to
-flto
这将优化最多和最安全的内容。
请注意,所有这些麻烦可能只会在最终可执行文件中获得微小的加速。
gcc-4.8.1
提取出来,你应该能够添加 gcc-4.8.1/gmp
等等,让 GCC 构建系统也构建 GMP 等等。这并不是完全可靠的,但在 Linux 上可能仍然有效。 - rubenvblibelf
就是其中的一部分。在configure之后执行make
应该就可以了。你可能需要使用--with-gmp --with-mpfr --with-mpc --with-isl --with-cloog --with-libelf
来避免使用系统库。 - rubenvbbinutils
目录,但似乎这并不起作用,这是正常的吗?我应该如何添加本地的binutils安装?我想提供一个与全局可用的不同的binutils安装。 - user2485710--with-sysroot=/usr
和--prefix=/your/binutils/install/prefix
来解决,然后在构建GCC之前将your/binutils/install/prefix/bin
添加到PATH
中。虽然它应该仍然有效... - rubenvb先衡量,再优化。在这种情况下,我首先会尝试使用原始编译器和默认配置设置(步骤0)编译gcc。
一旦我确定编译完成没有问题,那么就可以进行以下操作:
make distclean
首先,使用类似的编译器并测量使用该编译器编译所需的时间(步骤1)。
接着,安装新的gcc,并测量新的gcc(和其他工具)使用默认配置编译所需的时间(步骤2)。
然后,使用您喜欢的任何-O优化级别或其他非默认设置进行编译。一旦您获得了干净的编译结果,请执行“make distclean”,然后再次测量使用非默认设置的新默认设置gcc编译自身所需的时间(步骤3)。
现在,您拥有一个可以用于编译自身的-O3(或其他)gcc(步骤4),并以与其他步骤相同的方式进行测量。
最后,比较计时(确保您从每个编译之前都处于相同的基本状态)。您真正关心的部分是步骤2和步骤4,但步骤1和步骤3也可能提供信息。
请注意,这实际上只是衡量gcc(或其他编译器)能够编译自身的速度,如果您编写的代码与此非常不同,则您的效果可能会有所不同 - 但是您可以使用相同的技术来测量和比较各种优化级别在您经常编译的任何代码中的速度。
编辑:我担心这些标志会改变这些程序/库的行为。
理论上不应该,但有时确实会改变/破坏行为。
如果你想要确定,最好使用经过充分测试的默认设置。
请注意,如果其他值如-O1
或-O3
可以显著提高性能,那么这些设置已经成为标准并且已经被测试过了。
-O3
可能会使代码变慢。通常建议使用-O2
。 - jordanm-O3
会使内联变得更加激进,从而导致代码膨胀。缓存失效率更高,需要从磁盘读取更多的代码...大多数情况下会更慢。Linux 内核一段时间以来一直使用-Os
进行编译,因为这样更快... - vonbrand-O3
编译几乎总是比使用-O2
编译需要更长的时间,但由于通常只编译一次,所需时间并不重要。如下面的答案所说,为了更快的GCC,如果使用-O3
可靠地使GCC更快,那么它将成为默认选项。使用基于配置文件的优化和/或LTO进行引导是获得更快GCC的更好方法。 - Jonathan Wakely