Linaro编译速度
我正在研究在嵌入式ARM平台上运行的软件。 在更新我们的平台的过程中,我们正在从基于OpenEmbedded的系统切换到Linaro。
在我的机器上,使用OpenEmbedded为我们构建的32位gcc 4.6.4,现在需要大约9分钟的时间来交叉编译我们的ARM软件。 对于新系统,我们现在正在尝试使用Linaro的gcc 4.7二进制文件 - 令人惊讶的结果是编译突然需要大约两倍的时间(18分钟)。 Linaro gcc 4.6二进制文件具有相同的问题,因此它不是gcc版本特定的。
使用Linaro的crosstool-ng创建其编译器的调整版本(例如尝试尽可能接近配置选项)并没有加快速度。
我们之前的gcc编译器和Linaro之间的主要区别在于:
with-target=armv7-a
和with-tune=cortex-a9
明确设置 使用multilib,目标CPU(cortex-a8 vs a9)来改变gcc中的配置选项,如启用ssp,拇指/手臂模式,并没有带来改进。
对于一个简单的test.cpp,性能速度已经不同了,它只有一个带有vector<int>
的主函数,所以它与链接无关,我怀疑STL头文件造成了很大的差别。
我正在想什么来调整。 有人有想法吗?
编辑4:我也尝试了Ubuntu 12.04(gcc版本4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5))的arm交叉编译器,它的编译时间与我的4.6.4版本相当。 所以在Linaro的版本中似乎有些特别的不同,我可能无法关闭或者是他们应用的一些特殊补丁?
编辑3:来自Linaro gcc 4.7的-ftime-report
来自项目的实际源文件:
Execution times (seconds)
phase setup : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.02 ( 1%) wall 2076 kB ( 2%) ggc
phase parsing : 1.72 (74%) usr 0.34 (85%) sys 2.04 (75%) wall 66732 kB (79%) ggc
phase lang. deferred : 0.28 (12%) usr 0.04 (10%) sys 0.33 (12%) wall 10215 kB (12%) ggc
phase cgraph : 0.32 (14%) usr 0.02 ( 5%) sys 0.33 (12%) wall 5481 kB ( 6%) ggc
phase generate : 0.60 (26%) usr 0.06 (15%) sys 0.66 (24%) wall 15700 kB (19%) ggc
|name lookup : 0.28 (12%) usr 0.02 ( 5%) sys 0.24 ( 9%) wall 8058 kB (10%) ggc
|overload resolution : 0.32 (14%) usr 0.06 (15%) sys 0.36 (13%) wall 10042 kB (12%) ggc
callgraph construction : 0.06 ( 3%) usr 0.00 ( 0%) sys 0.02 ( 1%) wall 551 kB ( 1%) ggc
callgraph optimization : 0.02 ( 1%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall 224 kB ( 0%) ggc
varpool construction : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall 94 kB ( 0%) ggc
df scan insns : 0.06 ( 3%) usr 0.00 ( 0%) sys 0.02 ( 1%) wall 5 kB ( 0%) ggc
df reg dead/unused notes: 0.00 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall 22 kB ( 0%) ggc
alias analysis : 0.00 ( 0%) usr 0.02 ( 5%) sys 0.00 ( 0%) wall 11 kB ( 0%) ggc
preprocessing : 0.08 ( 3%) usr 0.10 (25%) sys 0.29 (11%) wall 1069 kB ( 1%) ggc
parser (global) : 0.58 (25%) usr 0.08 (20%) sys 0.43 (16%) wall 25145 kB (30%) ggc
parser struct body : 0.28 (12%) usr 0.02 ( 5%) sys 0.34 (12%) wall 12400 kB (15%) ggc
parser enumerator list : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall 121 kB ( 0%) ggc
parser function body : 0.14 ( 6%) usr 0.00 ( 0%) sys 0.15 ( 6%) wall 2435 kB ( 3%) ggc
parser inl. func. body : 0.10 ( 4%) usr 0.02 ( 5%) sys 0.18 ( 7%) wall 3682 kB ( 4%) ggc
parser inl. meth. body : 0.24 (10%) usr 0.02 ( 5%) sys 0.20 ( 7%) wall 5298 kB ( 6%) ggc
template instantiation : 0.58 (25%) usr 0.14 (35%) sys 0.75 (28%) wall 26588 kB (31%) ggc
tree gimplify : 0.02 ( 1%) usr 0.00 ( 0%) sys 0.03 ( 1%) wall 785 kB ( 1%) ggc
tree CFG construction : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall 543 kB ( 1%) ggc
tree SSA other : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.02 ( 1%) wall 32 kB ( 0%) ggc
out of ssa : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall 0 kB ( 0%) ggc
expand : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall 438 kB ( 1%) ggc
varconst : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall 6 kB ( 0%) ggc
integrated RA : 0.04 ( 2%) usr 0.00 ( 0%) sys 0.09 ( 3%) wall 1313 kB ( 2%) ggc
reload : 0.06 ( 3%) usr 0.00 ( 0%) sys 0.02 ( 1%) wall 60 kB ( 0%) ggc
thread pro- & epilogue : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.02 ( 1%) wall 92 kB ( 0%) ggc
final : 0.02 ( 1%) usr 0.00 ( 0%) sys 0.02 ( 1%) wall 4 kB ( 0%) ggc
rest of compilation : 0.02 ( 1%) usr 0.00 ( 0%) sys 0.02 ( 1%) wall 133 kB ( 0%) ggc
unaccounted todo : 0.02 ( 1%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall 0 kB ( 0%) ggc
TOTAL : 2.32 0.40 2.72 84519 kB
和我的gcc-4.6一样:
Execution times (seconds)
callgraph construction: 0.00 ( 0%) usr 0.00 ( 0%) sys 0.02 ( 1%) wall 527 kB ( 1%) ggc
trivially dead code : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 1%) wall 0 kB ( 0%) ggc
df scan insns : 0.02 ( 2%) usr 0.00 ( 0%) sys 0.01 ( 1%) wall 5 kB ( 0%) ggc
df reg dead/unused notes: 0.00 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 1%) wall 22 kB ( 0%) ggc
preprocessing : 0.08 ( 7%) usr 0.10 (26%) sys 0.14 ( 9%) wall 1016 kB ( 1%) ggc
parser : 0.68 (58%) usr 0.24 (63%) sys 0.83 (52%) wall 52215 kB (76%) ggc
name lookup : 0.28 (24%) usr 0.02 ( 5%) sys 0.41 (26%) wall 10211 kB (15%) ggc
inline heuristics : 0.00 ( 0%) usr 0.02 ( 5%) sys 0.00 ( 0%) wall 0 kB ( 0%) ggc
tree gimplify : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 1%) wall 637 kB ( 1%) ggc
tree CFG construction : 0.02 ( 2%) usr 0.00 ( 0%) sys 0.00 ( 0%) wall 463 kB ( 1%) ggc
expand : 0.02 ( 2%) usr 0.00 ( 0%) sys 0.01 ( 1%) wall 426 kB ( 1%) ggc
varconst : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.02 ( 1%) wall 132 kB ( 0%) ggc
integrated RA : 0.02 ( 2%) usr 0.00 ( 0%) sys 0.03 ( 2%) wall 304 kB ( 0%) ggc
reload : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 1%) wall 58 kB ( 0%) ggc
machine dep reorg : 0.02 ( 2%) usr 0.00 ( 0%) sys 0.00 ( 0%) wall 3 kB ( 0%) ggc
final : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.02 ( 1%) wall 4 kB ( 0%) ggc
rest of compilation : 0.02 ( 2%) usr 0.00 ( 0%) sys 0.01 ( 1%) wall 133 kB ( 0%) ggc
unaccounted todo : 0.02 ( 2%) usr 0.00 ( 0%) sys 0.03 ( 2%) wall 0 kB ( 0%) ggc
TOTAL : 1.18 0.38 1.59 68315 kB
EDIT2: Linaro gcc 4.6.3的-ftime-report
输出非常简单的test.cpp(包括选项-fno-graphite-identity -fno-graphite
):
Execution times (seconds)
preprocessing : 0.00 ( 0%) usr 0.02 (50%) sys 0.02 (10%) wall 121 kB ( 2%) ggc
parser : 0.10 (62%) usr 0.02 (50%) sys 0.11 (55%) wall 4022 kB (65%) ggc
name lookup : 0.02 (12%) usr 0.00 ( 0%) sys 0.04 (20%) wall 879 kB (14%) ggc
tree gimplify : 0.02 (13%) usr 0.00 ( 0%) sys 0.00 ( 0%) wall 20 kB ( 0%) ggc
expand : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 5%) wall 34 kB ( 1%) ggc
integrated RA : 0.02 (12%) usr 0.00 ( 0%) sys 0.01 ( 5%) wall 59 kB ( 1%) ggc
TOTAL : 0.16 0.04 0.20 6207 kB
并为我的旧gcc 4.6.4相同的文件:
Execution times (seconds)
preprocessing : 0.02 (25%) usr 0.00 ( 0%) sys 0.02 (14%) wall 119 kB ( 2%) ggc
parser : 0.00 ( 0%) usr 0.04 (100%) sys 0.06 (43%) wall 4021 kB (65%) ggc
name lookup : 0.04 (50%) usr 0.00 ( 0%) sys 0.03 (21%) wall 879 kB (14%) ggc
expand : 0.02 (25%) usr 0.00 ( 0%) sys 0.01 ( 7%) wall 34 kB ( 1%) ggc
unaccounted todo : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 7%) wall 0 kB ( 0%) ggc
TOTAL : 0.08 0.04 0.14 6204 kB
用这两种编译器生成预处理文件没有显着差异(Linaro的gcc的输出只有3行更长)。
EDIT1:旧版 gcc -v(路径缩短或删除(例如--sbindir)
# arm-none-linux-gnueabi-g++ -v
Using built-in specs.
COLLECT_GCC=..sysroots/i686-linux/usr/bin/arm-none-linux-gnueabi-g++
COLLECT_LTO_WRAPPER=../libexec/gcc/arm-none-linux-gnueabi/4.6.4/lto-wrapper
Target: arm-none-linux-gnueabi
Configured with: ..tmp/work/armv7a-none-linux-gnueabi/gcc-cross-4.6.3+svnr184847-r27/gcc-4_6-branch/configure --build=i686-linux --host=i686-linux --target=arm-none-linux-gnueabi --with-gnu-ld --enable-shared --enable-languages=c,c++ --enable-threads=posix --disable-multilib --enable-c99 --enable-long-long --enable-symvers=gnu --enable-libstdcxx-pch --program-prefix=arm-none-linux-gnueabi- --without-local-prefix --enable-lto --enable-libssp --disable-bootstrap --disable-libgomp --disable-libmudflap --with-system-zlib --with-linker-hash-style=gnu --with-ppl=no --with-cloog=no --enable-cheaders=c_global --enable-languages=c,c++,fortran --disable-libunwind-exceptions --with-mpfr=..sysroots/i686-linux/usr --with-system-zlib --enable-__cxa_atexit
Thread model: posix
gcc version 4.6.4 20120303 (prerelease) (GCC)
和Linaro gcc -v
# arm-linux-gnueabihf-g++ -v
Using built-in specs.
COLLECT_GCC=..compiler/bin/arm-linux-gnueabihf-g++
COLLECT_LTO_WRAPPER=../libexec/gcc/arm-linux-gnueabihf/4.7.2/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: .build/src/gcc-linaro-4.7-2012.08/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu --target=arm-linux-gnueabihf --enable-languages=c,c++,fortran --enable-multilib --with-arch=armv7-a --with-tune=cortex-a9 --with-fpu=vfpv3-d16 --with-float=hard --with-pkgversion='crosstool-NG linaro-1.13.1-2012.08-20120827 - Linaro GCC 2012.08' --with-bugurl=https://bugs.launchpad.net/gcc-linaro --enable-__cxa_atexit --enable-libmudflap --enable-libgomp --enable-libssp --with-gmp=.. --with-mpfr=.. --with-mpc=.. --with-ppl=.. --with-cloog=.. --with-libelf=.. --with-host-libstdcxx='-L.. -lpwl' --enable-threads=posix --disable-libstdcxx-pch --enable-linker-build-id --enable-gold --with-local-prefix=.. --enable-c99 --enable-long-long --with-mode=thumb
Thread model: posix
gcc version 4.7.2 20120731 (prerelease) (crosstool-NG linaro-1.13.1-2012.08-20120827 - Linaro GCC 2012.08)
对于后者,我还对-disable-multilib --disable-libmudflap --disable-libgomp --disable-multilib进行了调整。
这里是Ubuntu 12.04的arm编译器:
> arm-linux-gnueabihf-g++-4.6 -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-g++-4.6
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.6/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/arm-linux-gnueabihf/include/c++/4.6.3 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --enable-multilib --disable-sjlj-exceptions --with-arch=armv7-a --with-float=hard --with-fpu=vfpv3-d16 --with-mode=thumb --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabihf
您可以将-time
或-ftime-report
传递给gcc
编译器,以了解gcc
编译时间的原因和位置。
但为什么编译时间对你来说很重要?
您应该注意生成的可执行二进制文件的执行时间。
另外,向我们展示传递给你的gcc
的-v
选项的输出
你可以将-j
选项传递给make
命令,让它并行工作(例如并行运行多个gcc
)。 您还可以降低优化级别,例如从-O3
到-O2
或-O1
好的 - 你的时间报告测试清楚地显示“解析器”是罪魁祸首; 我猜测模板(通常)和STL(特别是)是根本原因。
建议:
查看是否有任何方法可以在工具链中使用“预编译头文件”。 如果可以,那可能会消除整个问题。
链接(不幸的是,我不确定哪些可能或不适用于您):
为什么C ++编译需要这么长时间?
http://gcc.gnu.org/onlinedocs/gcc-4.0.4/gcc/Precompiled-Headers.html
http://clang.llvm.org/docs/UsersManual.html#precompiledheaders
在GCC中,是否可以从其他头文件中包含预编译头文件?
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472c/CIHJFBHC.html