【问题标题】:Faster code with another compiler使用另一个编译器更快的代码
【发布时间】:2010-06-03 09:29:49
【问题描述】:

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

有什么想法吗?

【问题讨论】:

  • 您确定性能可能是一个问题,还是这是一个理论问题?
  • 我做蒙特卡洛模拟,所以性能是主要问题。如果我可以使程序更快(通过更智能的编程或更好的编译器设置),那么在同一时间段内将获得更准确的结果。有时,当我真的需要低不确定性时,我们集群上的并行计算可能需要数周时间。但即使它们需要几个小时,早点得到它们仍然很好。
  • 除了 C 编译器之外,您还可以考虑更改其他一些内容。特别是对于数值应用程序,请考虑在指针上使用 C99 restrict 限定符 - 这可以允许编译器更积极地优化(即消除内部循环的冗余负载)。如果您严重依赖 math.h 中的函数,还可以考虑获得更快的标准数学库。

标签: c performance gcc compiler-construction


【解决方案1】:

在尝试不同的编译器或随机的、任意的微优化之前,您确实需要获得一个体面的分析器并分析您的代码,以准确找出性能瓶颈是什么。实际图片可能与您想象的大不相同。一旦你有了一个配置文件,你就可以开始考虑什么可能是有用的优化。例如。如果您受到内存带宽的限制,更改编译器将无济于事。

【讨论】:

  • +1 分析和了解您的程序大部分时间都花在哪里总是更好的事情之一,以产生第一个更好的代码(然后在我们完成之后只依赖编译器的优化)确保我们使用的是最好的算法和代码...)
【解决方案2】:

以下是有关 gcc 性能的一些提示: 使用 -Os、-O2 和 -O3 进行基准测试。有时 -O2 会更快,因为它使代码更短。既然您说您使用了大量内存,请尝试使用 -Os 并进行测量。

还要检查客户端计算机上的 -march=native 选项(如果您要为具有类似处理器的计算机制作可执行文件,则认为它可以安全使用)。有时它会对性能产生相当大的影响。如果您需要列出 gcc 与 native 一起使用的选项,请按以下步骤操作:
制作一个名为 test.c 的小 C 程序,然后

$ touch test.c
$ gcc -march=native -fverbose-asm -S test.c
$ cat test.s

代码转到 Gentoo 论坛用户的积分。 它应该打印出所有 gcc 使用的优化列表。请注意,如果您使用的是 i7,gcc 4.5 会将其检测为 Atom,因此您需要手动设置 -march 和 -mtune。

还请阅读此文档,它会对您有所帮助(不过,根据我在 Gentoo 上的经验,-march=native 效果更好)http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html

您可以尝试使用 4.4 后期和 4.5 早期版本中的新选项,例如 -flto 和 -fwhole-program。这些应该有助于提高性能,但是在试验它们时,我的系统不稳定。无论如何,也请阅读此文档,它将帮助您了解 GCC 的一些优化选项http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

【讨论】:

    【解决方案3】:

    如果您在 x86 上运行 Linux,那么通常 IntelPGI 编译器会显着提高可执行文件的执行速度。

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

    【讨论】:

    • 据我所知 gcc 非常擅长优化代码以提高性能;如果您阅读 gcc 的信息页面,优化选项,您会看到有很多优化选项; -On 只是常见的缩写形式。那么让它变得更好的唯一方法就是编写更好的代码:更好的算法和更少的内存访问(用户说它广泛使用内存)
    • 值得注意的是,英特尔编译器仅在英特尔 CPU 上提高了性能。
    • @High Performance Mark:同意手动调优的成本,但让代码“缓慢”运行通常是完全可以接受的。这取决于代码是什么、它在做什么、它的使用频率以及它是否接近 CPU 密集型等等。
    【解决方案4】:

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

    例如:

    这些编译器通常会在优化方面产生更好的代码。

    【讨论】:

    • 一个项目(在 2006 年或 2007 年),我们对比了旧版本的 gcc 与 Sun C++ 编译器,我们的快速评估表明 Sun 编译器的计算速度大约是我们计算的两倍。不幸的是,由于与 Oracle 的 OCCI 不兼容,我们无法使用它以及更新版本的 gcc。
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      请记住,通过更改编译器或设置获得的大多数改进只会让您获得成比例的加速,而在调整算法时,您有时可以在程序的O() 中获得改进。在您投入大量工作来调整设置之前,请务必将其耗尽。

      【讨论】:

        猜你喜欢
        • 2021-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多