代码之家  ›  专栏  ›  技术社区  ›  Cedric H.

带g的Optmization标志++

  •  1
  • Cedric H.  · 技术社区  · 16 年前

    我用G++编译C++代码;一个科学的仿真软件。

    目前我正在使用 -O3 -funroll-loops 旗帜。我可以注意到 -O0 , -O1 , -O2 ,和 -臭氧 ,几乎没有区别 -funroll循环

    您有什么建议可以帮助我增加优化或技巧,我可以使用,以获得更好的性能?

    谢谢!

    编辑,如评论中所建议的: -臭氧 . 代码中计算密集的部分处理对 blitz::array 在巨大的环中。

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

    3 回复  |  直到 16 年前
        1
  •  4
  •   Alex B    16 年前

    在没有看到代码的情况下,我们只能给出适用于广泛问题的通用建议。

    1. 尝试GCC的配置文件指导优化。编译插入指令的代码 -fprofile-generate ,使用实际工作负载执行一些测试运行,然后在构建最终二进制文件时使用测试运行的输出( -fprofile-use ). 然后GCC可以更好地猜测哪些分支被采用,并更好地优化代码。
    2. 如果可以的话,试着并行化你的代码。你提到过你在大数据项上有循环,如果你的工作项是独立的并且你可以对它们进行分区,这可能会起作用。例如,有一个工作队列,其工作线程池的大小等于CPU的数量,并将工作分派到队列中,而不是按顺序处理,然后池线程将从队列中获取工作项并并行处理它们。
    3. 查看您的代码使用的数据单元的大小,并尝试将它们放入尽可能少的一级缓存线(通常是64字节)。例如,如果您有66个字节的数据项,并且缓存线大小为64字节,则应该打包该结构,或者压缩它以适应64字节的大小。
        2
  •  2
  •   slacker    16 年前

    作为一般建议,请尝试指定 -march -fomit-frame-pointer -ffast-math . 最后一个可能会给你带来巨大的加速,但在某些情况下,它会带来错误的结果。分析代码以确保其安全。

        3
  •  2
  •   bbadour    16 年前

    我没有足够的魔咒来评论或编辑亚历克斯B的答案,所以我会回答。

    在您打开概要文件并按照alexb的答案运行应用程序之后,实际上可以查看概要文件信息,以查找应用程序大部分时间所用的热点。如果你找到了,看看代码,看看你能做些什么让它们不那么热。

    适当的算法替换通常比任何自动优化都有很大的优势。