我使用g ++编译C ++代码;一个科学的模拟软件。
目前我正在使用-O3
和-funroll-loops
标志。我注意到-O0
,-O1
,-O2
和-O3
之间存在很大差异,与-funroll-loops
几乎没有区别。
您是否有任何建议可以帮助我增加优化或技巧,以获得更好的表现?
谢谢!
编辑,如评论中所示:
我在这里问的是'纯'编译优化,即。有什么聪明的事情要做,而不仅仅是-O3
。代码中计算密集的部分处理大型循环中blitz::array
的操作。
Edit2:我实际上处理了很多fp(双倍)数学
答案 0 :(得分:4)
如果没有看到代码,我们只能为您提供适用于各种问题的通用建议。
-fprofile-generate
编译已检测的代码,使用实际工作负载执行一些测试运行,然后在构建最终二进制文件(-fprofile-use
)时使用测试运行的输出。然后GCC可以更好地猜测采用哪些分支并更好地优化代码。答案 1 :(得分:2)
如果不知道要加速的代码,很难说清楚。此外,了解代码可能允许我们对其进行改进,以使其更快。
作为一般建议,请尝试指定-march
选项以告知GCC您要定位的CPU型号。如果进行许多函数调用(尤其是递归),可以尝试-fomit-frame-pointer
。如果您使用大量浮点数学,并远离极端情况(例如NaN,FP异常),则可以尝试-ffast-math
。最后一个可能会给你带来巨大的加速,但在某些情况下它会带来错误的结果。分析您的代码以确保它是安全的。
答案 2 :(得分:2)
我没有足够的评论来评论或编辑Alex B的回答,所以我会回答。
根据Alex B的回答打开配置文件并运行应用程序之后,实际查看配置文件信息以查找应用程序花费大部分时间的热点。如果您发现任何问题,请查看代码,看看您可以采取哪些措施来减少它们的热度。
适当的算法替换通常会大幅优于任何自动优化。