【问题标题】:SSE SSE2 and SSE3 for GNU C++ [closed]适用于 GNU C++ 的 SSE SSE2 和 SSE3
【发布时间】:2010-10-14 06:20:32
【问题描述】:

是否有一个简单的教程让我在 GNU C++ 中快速掌握 SSE、SSE2 和 SSE3?如何在 SSE 中进行代码优化?

【问题讨论】:

标签: c++ c optimization


【解决方案1】:

查看 -mtune 和 -march 选项,当然还有 -msse* 和 -mfpmath。所有这些都使 GCC 能够进行特定于 SSE 的优化。

恐怕其他的都是汇编程序的领域。

GCC Online Manual - i386 and x86_64 Options

【讨论】:

  • 不需要汇编程序。 GCC 具有扩展以支持特殊数据类型和使用 MMX/SSE 的“函数调用”。
  • 诚然,这些只是伪装成程序集的包装器,因此如果您不能在 asm 中对 SSE 进行编程,那么这些扩展对您没有多大帮助。
  • 实际上,内在函数不仅仅是组装的包装器。它们允许编译器重新排列您的代码以获得最佳性能。但您确实需要充分了解 SIMD 的工作原理。
  • 我意识到,当我读到你的回答时,Zan。不知道 GCC 提供了它们,所以感谢您的提示。 (虽然我实际上不需要 SSE 来做任何事情,但我喜欢收集晦涩的知识。:-D)
  • 当使用内在函数时,编译器也会为你注册分配,这是一个很大的缓解。
【解决方案2】:

一个简单的教程?我不知道。

但是关于使用 MMX 或任何版本的 SSE 的任何信息都将有助于学习,无论是对于 GCC 还是对于 ICC 或 VC。

要了解 GCC 的向量扩展,请输入“info gcc”并转到节点:向量扩展。

【讨论】:

    【解决方案3】:

    抱歉不知道教程。

    您最好的选择(恕我直言)是通过英特尔提供的“内在”功能来使用 SSE,以包装(通常)单个 SSE 指令。 这些是通过一组名为 *mmintrin.h 的包含文件提供的,例如 xmmintrin.h 是原始 SSE 指令集。

    开始熟悉英特尔优化Reference Manual 的内容是个好主意(有关内部函数的示例,请参见第 4.3.1.2 节),SIMD 部分是必不可少的阅读材料。指令集参考手册也很有帮助,因为每条指令的文档都包含它对应的“内在”功能。

    不要花一些时间检查编译器从内在函数生成的汇编器(你会学到很多东西)和分析/性能测量(你会避免浪费时间 SSE-ing 代码努力回报)。

    2011-05-31 更新: 在 Agner Fog 的 optimization PDFs (thanks) 中有一些关于内在函数和矢量化的非常好的报道,尽管它有点传播(例如第 12 节) first onesecond one 的第 5 部分)。这些并不完全是教程材料(实际上有一个“这些手册不适合初学者”警告),但它们确实正确地将 SIMD(无论是通过 asm、内在函数还是编译器矢量化使用)视为更大的优化工具箱的一部分。

    2012-10-04 更新:这里值得一提的是关于 gcc 向量内在函数的 nice little Linux Journal article。比 SSE 更通用(也包括 PPC 和 ARM 扩展)。 last page 上有很多参考资料,这让我注意到了英特尔的 "intrinsics manual"

    【讨论】:

      【解决方案4】:

      使用最简单的优化是允许 gcc 发出 SSE 代码。

      标志:-msse、-msse2、-msse3、-march=、-mfpmath=sse

      有关 386 个选项的更简洁列表,请参阅 http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options ,您的特定编译器版本的更准确文档位于:http://gcc.gnu.org/onlinedocs/

      对于优化,请始终查看 Agner Fog 的:http://agner.org/optimize/。我认为他没有关于内在函数的 SSE 教程,但他有一些非常巧妙的 std-c++ 技巧,并且还提供了很多关于编码 SSE 程序集的信息(通常可以转录为内在函数)。

      【讨论】:

      • -mftree-vectorize 也会输出 SSE。
      • 不一定。来自手册:“在树上执行循环矢量化。默认情况下,该标志在 -O3 处启用。”因此该标志本身并未提及特定平台(也可能在标准 32 位寄存器中处理多个字节)。
      【解决方案5】:

      MSDN 对 SSE 编译器内置插件有很好的描述(这些内置插件是事实上的标准,它们甚至可以在 clang/XCode 中使用)。

      该引用的好处是它显示了等效的伪代码,例如你可以了解到ADDPD的指令是:

      r0 := a0 + b0
      r1 := a1 + b1
      

      这里有一个神秘的随机播放指令的很好的描述:http://www.songho.ca/misc/sse/sse.html

      【讨论】:

        猜你喜欢
        • 2011-10-27
        • 2012-07-19
        • 2010-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-08
        • 2013-02-28
        • 2010-12-28
        相关资源
        最近更新 更多