【问题标题】:GCC optimization flags for Intel Atom [closed]英特尔凌动的 GCC 优化标志 [关闭]
【发布时间】:2010-09-11 18:14:05
【问题描述】:

我正在为英特尔凌动处理器开发性能关键型应用程序。

此 CPU 的最佳 gcc 优化标志是什么?

【问题讨论】:

  • 英特尔 C 编译器 (icc) 怎么样?至少在它附带的基准上,对 gcc 的统治是相当明显的......

标签: optimization gcc intel-atom


【解决方案1】:

有一个很酷的框架Acovea (Analysis of Compiler Options via Evolutionary Algorithm),由 GCC 黑客之一 Scott Rober Ladd 开发。它是一个遗传/进化算法框架,试图通过自然选择优化特定代码段的 GCC 优化标志。

它的工作原理是这样的:你编写一小段代表性能特征的基准代码(它真的必须很少,因为它会被重新编译和执行数千次)您要优化的较大程序。然后,Acovea 随机构建了几十个不同的 GCC 命令行,并使用它们中的每一个编译和运行您的基准测试。然后允许这些命令行中最好的“交配”和“繁殖”新的“孩子”,这些“孩子”(希望)从他们的“父母”那里继承最好的“基因”。这个过程会重复几十“代”,直到出现一组稳定的命令行标志。

【讨论】:

    【解决方案2】:

    我不知道 GCC 是否有任何特定于 Atom 的优化标志,但 Atom 内核应该与原始 Pentium 非常相似,并且非常重要地添加了 MMX/SSE/SSE2/SSE3/SSSE3指令集。当然,这些只有在您的代码是浮点数或 DSP 繁重的情况下才会产生显着差异。

    也许你可以试试:

    gcc -O2 -march=pentium -mmmx -msse -msse2 -msse3 -mssse3 -mfpmath=sse

    【讨论】:

    • 虽然 Atom 在有序架构上与 Pentium 相当,但流水线结构却大不相同,为 Pentium 调度指令可能对性能非常不利。跨度>
    • 同意,您确实希望将 -march=pentium 用于除真正的 Pentium 之外的任何东西。
    【解决方案3】:

    就像奔腾 4:

    -march=prescott -O2 -pipe -fomit-frame-pointer
    

    【讨论】:

    • 只有第一个参数甚至是相关的。
    【解决方案4】:

    嗯,Gentoo wiki 为 prescott 声明:

    http://en.gentoo-wiki.com/wiki/Safe_Cflags/Intel#Atom_N270

    CHOST="i686-pc-linux-gnu"

    CFLAGS="-march=prescott -O2 -pipe -fomit-frame-pointer"

    CXXFLAGS="${CFLAGS}"

    【讨论】:

    • 不再是:en.gentoo-wiki.com/wiki/Safe_Cflags/Intel#Atom_N270.2FN280(更新链接)现在推荐 CFLAGS="-O2 -march=core2 -mtune=generic -mssse3 -mfpmath=sse -fomit-frame-pointer -pipe"
    • ...和 ​​CFLAGS="-O2 -march=atom -mssse3 -mfpmath=sse -fomit-frame-pointer -pipe" 适用于 GCC 4.5
    【解决方案5】:

    我有一个脚本可以为您的 CPU 和编译器组合自动选择适当的标志。 我刚刚更新了它以支持 Intel Atom:

    http://www.pixelbeat.org/scripts/gcccpuopt

    更新: 我之前为 Atom 指定了 -march=prescott,但对它进行了更多研究 表明 Atom 符合 merom ISA,因此 -march=core2 更合适。 但是请注意,Atom 是有序内核,最后一个是原始的 pentium。 因此,-mtune=pentium 也可能更好。不幸的是我没有 一个要测试的 Atom。如果有人可以对以下之间的差异进行基准测试,我将不胜感激:

    -march=core2 -mfpmath=sse -O3
    -march=core2 -mtune=pentium -mfpmath=sse -O3
    

    更新: 这里有几篇关于 Atom 低级优化的好文章:

    【讨论】:

    • 我认为设置-march=core2-mtune=pentium 根本不起作用:我得到arg.c:1: error: CPU you selected does not support x86-64 instruction set
    • 有趣。你的 atom 支持 64 位吗?如果您尝试上面的脚本,它可能会告诉您还要添加 -m32
    • 是的,我的 atom 支持 64 位。
    • 那么更有趣的答案是 -m32 是否抑制错误消息,以及 gcccpuopt 是否为您的 cpu 输出 -m32
    • 在最小的 c 文件上执行 gcc44 -march=core2 -mtune=pentium -m32 -o lol lol.c 会退出,并出现关于无法找到 -lgcc 的错误。 gcccpuopt 告诉我 -m32 -march=core2 -mtune=pentium -mfpmath=sse 是最佳配置。
    【解决方案6】:

    这里有一些博客的交叉传播……我真正希望的是一个 Firefox 编译的原子基准测试……

    地址:http://ivoras.sharanet.org/blog/tree/2009-02-11.optimizing-for-atom.html

    “事实证明,gcc 在使用 -mtune=native 时似乎做得非常好,而且 mtune=generic 是可以接受的。最大的收益(在这个数学密集的基准测试中)来自使用 SSE 进行数学计算,但即使是它们也被 pentium4 的调优破坏了。

    “最快和最慢优化之间的差异是 21%。使用 March 而不是 mtune 的影响可以忽略不计(没有足够的差异来判断它是否有帮助)。

    "(我包含了 k6 仅供参考 - 我知道 Atom 没有 3dnow)

    “后期更新:针对 k8 进行调优(使用 SSE 和 O3)产生的最佳分数略高,为 182。”

    【讨论】:

      【解决方案7】:

      来自英特尔,Getting Started with MID

      使用 GCC 编译时,有几个推荐使用的标志:

      • -O2 或 -O1:O2 标志优化速度,而 -O1 标志优化大小
      • -msse3
      • -march=core2
      • -mfpmath=sse

      【讨论】:

        【解决方案8】:

        i686 最接近。不要选择 core2。

        GCC 4.1 -O3 -march=i686 GCC 4.3 -O3 -march=native

        GCC 4.1 -O4 -ffast-math GCC 4.3 -O4 -ffast-math

        http://macles.blogspot.com/2008/09/intel-cc-compiler-gcc-and-intel-atom.html

        【讨论】:

        【解决方案9】:

        GCC 4.5 将包含 -march=atom 和 -mtune=atom 选项。

        来源:http://gcc.gnu.org/gcc-4.5/changes.html

        【讨论】:

        猜你喜欢
        • 2010-12-19
        • 2021-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-14
        • 1970-01-01
        • 2013-11-07
        相关资源
        最近更新 更多