我有一个运行 CentOS 5 的 AMD Opteron 服务器。我想要一个用于相当大的基于 C++ Boost 的程序的编译器。我应该选择哪个编译器?
9 回答
这里有一个有趣的PDF,它比较了许多编译器。
我希望这有助于多于伤害:)
一年多前的某个时候,我做了一个小小的编译器枪战,我快要忘记记忆了。
- GCC 4.2(苹果)
- 英特尔 10
- GCC 4.2(苹果)+ LLVM
我测试了我编写的多个模板重音频信号处理程序。
编译时间:英特尔编译器是迄今为止最慢的编译器——比另一个帖子引用的“慢 2 倍”还多。
与 Intel 相比,GCC 处理深度模板非常好。
英特尔编译器生成了巨大的目标文件。
GCC+LLVM 产生最小的二进制文件。
由于程序的构造以及可以使用 SIMD 的位置,生成的代码可能会有很大的差异。
对于我的写作方式,我发现 GCC + LLVM 生成了最好的代码。对于我在认真考虑优化之前编写的程序(正如我所写的那样),英特尔通常更好。
英特尔的结果各不相同;它处理一些程序要好得多,有些程序要差得多。它很好地处理了原始处理,但我给了 GCC+LLVM 蛋糕,因为当放到更大(正常)程序的上下文中时……它做得更好。
英特尔凭借开箱即用、对庞大数据集的数字运算赢得了胜利。
GCC 单独生成最慢的代码,尽管它可以与测量和纳米优化一样快。我宁愿避免这些,因为风可能会随着下一个编译器版本改变方向,可以这么说。
我从来没有在这个测试中测量过写得不好的程序(即结果优于流行性能库的分布)。
最后,这些程序是用几年时间编写的,当时使用 GCC 作为主要编译器。
更新:我还为 Core2Duo 启用了优化/扩展。这些程序足够干净,可以启用严格的别名。
MySQL 团队曾经发布过 icc 比 gcc 提高了 10% 的性能。我会尝试找到链接。
一般来说,我发现“本机”编译器在各自平台上的性能优于 gcc
编辑:我有点不对劲。典型的收益是 20-30% 而不是 10%。一些窄边案例的性能翻了一番。 http://www.mysqlperformanceblog.com/files/presentations/LinuxWorld2004-Intel.pdf
我想它会因代码而异,但对于我现在正在处理的代码库,ICC 11.035 在 Xeon 5504 上比 gcc 4.4.0 几乎提高了 2 倍。
icc 选项:-O2 -fno-alias
gcc 选项:-O3 -msse3 -mfpmath=sse -fargument-noalias-global
这些选项仅针对包含计算密集型代码的文件,我知道其中没有别名。具有 5 级嵌套循环的单线程代码。
尽管启用了自动向量化,但编译器都不会生成向量化代码(不是编译器的错)
更新 (2015/02/27):在优化一些地球物理代码(2013 年第二季度)以在 Sandy Bridge-E Xeons 上运行时,我有机会将 ICC 11.1 与 GCC 4.8.0 的性能进行比较,而 GCC 现在正在生成比ICC更快的代码。使用 AVX 内部函数的代码确实使用了 8 路向量化指令(由于某些数据布局要求,编译器都没有正确地自动向量化代码)。此外,GCC 的 LTO 实现(IR 内核嵌入在 .o 文件中)比 ICC 中的实现更容易管理。使用 LTO 的 GCC 的运行速度大约是没有 LTO 的 ICC 的 3 倍。我现在无法找到没有 LTO 的 GCC 的数字,但我记得它仍然比 ICC 快。这绝不是对 ICC 性能的一般性陈述,但结果足以让我们继续使用 GCC 4.8.*。
期待 GCC 5.0 ( http://www.phoronix.com/scan.php?page=article&item=gcc-50-broadwell )!
我们在我们的产品 (DB2)、Linux 和 Windows IA32/AMD64 以及 OS X(即除 SunAMD 之外的所有 Intel 平台端口)上使用 Intel 编译器。
我不知道数字,但性能足够好,我们:
- 我被告知为编译器付费非常昂贵。
- 忍受 2 倍慢的构建时间(主要是由于它在允许自己运行之前花费了获取许可证的时间)。
PHP - 从源代码编译,使用 ICC 而不是 GCC,应该可以提高 10% 到 20% 的速度 - http://www.papelipe.no/tags/ez_publish/benchmark_of_intel_compiled_icc_apache_php_and_apc
MySQL - 从源代码编译,使用 ICC 而不是 GCC,应该可以提高 25% 到 50% 的速度 - http://www.mysqlperformanceblog.com/files/presentations/LinuxWorld2005-Intel.pdf
我曾经在一个相当大的信号处理系统上工作,该系统在一个大型集群上运行。我们过去认为,对于繁重的数学运算,英特尔编译器给我们的 CPU 负载比 GCC 少了大约 10%。这非常不科学,但这是我们的经验(大约 18 个月前)。
有趣的是,如果我们也能够使用英特尔的数学库,从而更有效地使用他们的芯片组。
我在 openSUSE 12.2(内核 3.4.33-2.24-default x86_64)上使用了UnixBench (v. 5.1.3),先用 GCC 编译,然后用 Intel 的编译器编译。
使用 1 个并行副本,使用 Intel 编译的 UnixBench 比使用 GCC 编译的版本快 20%。然而,这隐藏了巨大的差异。使用英特尔编译器时,Dhrystone 的运行速度降低了约 25%,而 Whetstone 的运行速度提高了 2 倍。
在并行运行 4 个 UnixBench 副本的情况下,Intel 编译器相对于 GCC 的改进仅为 7%。再次,英特尔在 Whetstone 上要好得多(> 200%),而在 Dhrystone 上较慢(大约 20%)。
英特尔编译器通常执行的许多优化都需要特定的源语法和使用 gcc 的 -O3 -ffast-math。不幸的是,-ffast-math -O3 -march=native 的 -funsafe-math-optimizations 组件与 -fopenmp 不兼容,因此我必须将源文件拆分为使用 Makefile 中不同选项命名的组。今天我遇到了一个失败,使用 -O3 -ffast-math -fopenmp -march=native 的 g++ 构建能够写入屏幕但不能重定向到文件。在我看来,更令人震惊的差异之一是 icpc 仅对 std::max 和 min 进行了优化,其中 gcc/g++ 希望 fmax|min[f] 和 -ffast-math 改变它们的含义,使其偏离标准。