C 使用另一个编译器编写更快的代码

C 使用另一个编译器编写更快的代码,c,performance,gcc,compiler-construction,C,Performance,Gcc,Compiler Construction,我在用C语言开发数学软件时使用标准的gcc编译器。我对编译器或编译器选项了解不多,我只是想知道,使用另一个编译器或选择更好的选项是否可以生成更快的可执行文件?默认的Makefile设置选项-ffast math和-O3,我认为这两个选项都会对总体计算时间产生一定影响。我的软件非常广泛地使用内存,所以我想一些与内存管理相关的选项可能会起作用 有什么想法吗?如果您有特定的硬件,您的代码可以针对特定的硬件,那么(硬件)公司通常会发布针对该硬件优化的付费编译器 例如: 用于Solaris的CC 这

我在用C语言开发数学软件时使用标准的
gcc
编译器。我对编译器或编译器选项了解不多,我只是想知道,使用另一个编译器或选择更好的选项是否可以生成更快的可执行文件?默认的Makefile设置选项
-ffast math
-O3
,我认为这两个选项都会对总体计算时间产生一定影响。我的软件非常广泛地使用内存,所以我想一些与内存管理相关的选项可能会起作用


有什么想法吗?

如果您有特定的硬件,您的代码可以针对特定的硬件,那么(硬件)公司通常会发布针对该硬件优化的付费编译器

例如:

  • 用于Solaris的CC

这些编译器通常会产生更好的代码优化效果。

如果您在x86上运行Linux,则or编译器通常会使您的可执行文件执行速度显著加快


缺点是有更多的旋钮需要调整,而且价格昂贵

正如您所说,您的程序内存很重,您可以测试使用不同于您平台上标准库中的malloc实现。
例如,您可以尝试jemalloc()。

以下是一些关于gcc性能的提示: 使用-Os、-O2和-O3进行基准测试。有时-O2会更快,因为它会生成更短的代码。既然你说你使用了很多内存,那么也可以尝试使用-Os并进行测量

还要检查客户端计算机上的-march=native选项(如果您正在为具有类似处理器的计算机创建可执行文件,则认为使用该选项是安全的)。有时,它会对性能产生相当大的影响。如果您需要列出gcc在本机上使用的选项列表,下面介绍如何操作:
制作一个名为test.C的小C程序,然后

$ touch test.c
$ gcc -march=native -fverbose-asm -S test.c
$ cat test.s
代码转到Gentoo论坛用户的信用。 它应该打印出gcc使用的所有优化的列表。请注意,如果您使用的是i7,GCC4.5会将其检测为Atom,因此您需要手动设置-march和-mtune

同时阅读本文档,它将对您有所帮助(根据我在Gentoo的经验,-march=native更好)


您可以尝试在4.4晚期和4.5早期版本中使用新选项,例如-flto和-fwhole程序。这些应该有助于提高性能,但在使用它们进行实验时,我的系统不稳定。在任何情况下,也请阅读本文档,它将帮助您了解GCC的一些优化选项

在尝试不同的编译器或随机、任意的微优化之前,您确实需要获得一个像样的分析器和评测您的代码,以准确找出性能瓶颈。真实的画面可能与你想象的大不相同。一旦你有了一个配置文件,你就可以开始考虑什么可能是有用的优化。例如,如果您受到内存带宽的限制,更改编译器对您没有帮助。

请记住,更改编译器或设置所带来的大多数改进只会使您获得成比例的加速,而在调整算法时,您有时可以在程序的
O()
中获得改进。在对设置进行大量调整之前,请确保将其耗尽

据我所知,gcc非常擅长优化代码的性能;如果你阅读gcc的信息页面,优化选项,你会看到有很多优化选项-On只是普通形式的一个缩写。那么,让它变得更好的唯一方法就是编写更好的代码:更好的算法和更少的内存访问(用户说它大量使用内存)。值得注意的是,“英特尔编译器”仅在英特尔CPU上提高性能。@高性能标记:同意手动调整的成本,但让代码“缓慢”运行这通常是完全可以接受的。这取决于代码是什么,它在做什么,它的使用频率,以及它是否接近CPU限制,等等。+1评测和了解程序大部分时间花在哪里,对于生成第一个更好的代码来说总是一件更好的事情(然后在我们确定使用了最好的算法和代码之后,只依赖编译器的优化…)一个项目(2006年或2007年)我们检查了一个较旧版本的GCC与Sun C++编译器,我们的快速评估显示Sun编译器的计算速度是我们计算的两倍。不幸的是,与Oracle OCI的不兼容使我们无法使用它,以及GCC的一个更新近版本。em,或者这是一个理论问题?我做蒙特卡罗模拟,所以性能是主要问题。如果我能使程序更快(通过更智能的编程或更好的编译器设置),则在同一时间段内将得到更精确的结果。有时,当我确实需要较低的不确定性时,我们群集上的并行计算可能需要数周时间。但即使它们需要数小时,尽早获得它们仍然很好。除C编译器外,您还可以考虑更改其他一些内容。特别是对于numerical应用程序,研究如何在指针上使用C99
restrict
限定符-这可以让编译器更积极地优化(即消除内部循环中的冗余负载)。如果您严重依赖
math.h
中的函数,还可以研究如何获得更快的标准数学库。