使用g ++优化标志

时间:2010-08-26 07:41:34

标签: gcc g++

我使用g ++编译C ++代码;一个科学的模拟软件。

目前我正在使用-O3-funroll-loops标志。我注意到-O0-O1-O2-O3之间存在很大差异,与-funroll-loops几乎没有区别。

您是否有任何建议可以帮助我增加优化或技巧,以获得更好的表现?

谢谢!

编辑,如评论中所示: 我在这里问的是'纯'编译优化,即。有什么聪明的事情要做,而不仅仅是-O3。代码中计算密集的部分处理大型循环中blitz::array的操作。

Edit2:我实际上处理了很多fp(双倍)数学

3 个答案:

答案 0 :(得分:4)

如果没有看到代码,我们只能为您提供适用于各种问题的通用建议。

  1. 尝试GCC的配置文件引导优化。使用-fprofile-generate编译已检测的代码,使用实际工作负载执行一些测试运行,然后在构建最终二进制文件(-fprofile-use)时使用测试运行的输出。然后GCC可以更好地猜测采用哪些分支并更好地优化代码。
  2. 如果可以,请尝试并行化代码。你提到你有大数据项的循环,如果你的工作项是独立的,你可以分区它们。 E. g。有一个工作队列,工作队列的大小等于CPU的数量,并且调度工作到队列而不是顺序处理,然后池线程将从队列中获取工作项并并行处理它们。
  3. 查看代码使用的数据单元的大小,并尝试将它们放入少量L1缓存行(通常为64字节)。例如,如果您有66字节的数据项,并且您的缓存行大小为64字节,则可能值得打包该结构,或以其他方式将其压缩以适合64字节。

答案 1 :(得分:2)

如果不知道要加速的代码,很难说清楚。此外,了解代码可能允许我们对其进行改进,以使其更快。

作为一般建议,请尝试指定-march选项以告知GCC您要定位的CPU型号。如果进行许多函数调用(尤其是递归),可以尝试-fomit-frame-pointer。如果您使用大量浮点数学,并远离极端情况(例如NaN,FP异常),则可以尝试-ffast-math。最后一个可能会给你带来巨大的加速,但在某些情况下它会带来错误的结果。分析您的代码以确保它是安全的。

答案 2 :(得分:2)

我没有足够的评论来评论或编辑Alex B的回答,所以我会回答。

根据Alex B的回答打开配置文件并运行应用程序之后,实际查看配置文件信息以查找应用程序花费大部分时间的热点。如果您发现任何问题,请查看代码,看看您可以采取哪些措施来减少它们的热度。

适当的算法替换通常会大幅优于任何自动优化。