【问题标题】:What does SSE instructions optimize in practice, and how does the compiler enables and use them?SSE 指令在实践中优化了什么,编译器如何启用和使用它们?
【发布时间】:2011-08-06 08:13:03
【问题描述】:

SSE 和/或 3D 现在!有矢量指令,但它们在实践中优化了什么?例如,8 位字符是 4 乘 4 而非 1 乘 1 处理的吗?是否对某些算术运算进行了优化?字长有影响吗(16位、32位、64位)?

是否所有编译器都在可用时使用它们?

真的必须了解汇编才能使用 SSE 指令吗?了解电子学和门逻辑有助于理解这一点吗?

【问题讨论】:

    标签: c++ c assembly sse


    【解决方案1】:

    其他问题的重复: Using SSE instructions

    简而言之,SSE 是 Streaming SIMD Extensions 的缩写,其中 SIMD = 单指令多数据。这对于一次对多个值执行单个数学或逻辑运算很有用,这通常用于矩阵或向量数学运算。

    编译器可以将此指令集作为其优化的一部分(研究您的 /O 选项),但是您通常必须重新构建代码并手动编写 SSE 代码,或者使用像 Intel Performance Primitives 这样的库才能真正利用它.

    【讨论】:

      【解决方案2】:

      背景:SSE 有向量和标量指令。 3D现在!已经死了。

      在没有程序员帮助的情况下,任何编译器都很少能从矢量化中获得有意义的好处。通过编程和实验,人们通常可以接近纯汇编的速度,而无需实际提及任何特定的向量指令。有关详细信息,请参阅编译器的矢量编程指南。

      涉及到一些可移植性权衡。如果您为 GCC 的矢量化程序编写代码,您可能可以使用非英特尔架构,例如 PowerPC 和 ARM,但不能使用其他编译器。如果您使用 Intel 内部函数使您的 C 代码更像汇编,那么您可以使用其他编译器,但不能使用其他架构。

      电子知识帮不了你。学习可用的说明将。

      【讨论】:

      • 这实际上并没有回答问题。 OP 想知道什么 SIMD 指令执行。 :)
      • @jalf:我同意这不是最好的答案。我想更多地关注“是否真的必须了解汇编才能使用 SSE 指令?” ——他似乎已经掌握了它的用途。
      • 也许我们的阅读方式不同。他关于“8 位字符被 4 x 4 处理”的问题似乎表明对它们的工作方式存在误解(例如,它在多个执行单元中拆分单个值,以便更有效地更新该值,而不是处理多个值并行)
      • @jalf:不知道。幸运的是,我们都回答了:v)。如果我能给你另一个赞成票,我会的。
      【解决方案3】:

      在一般情况下,您根本不能依赖编译器来使用向量化指令。有些会这样做(英特尔的 C++ 编译器在许多简单的情况下都可以做到这一点,而 GCC 也尝试这样做,但成败参半)

      但这个想法只是将相同的操作应用于 4 个 32 位字(或在某些情况下为 2 个 64 位值)。

      因此,您可以使用向量化加法,而不是传统的“add”指令将来自 2 个不同的 32 位宽寄存器的值相加,它使用包含 四个 的特殊 128 位宽寄存器> 32 位值,并将它们作为单个操作相加。

      【讨论】:

        【解决方案4】:

        如果您知道自己在做什么,您可能会获得巨大的性能提升。参见例如 here,这个人将他的算法性能提高了 6 倍。

        【讨论】:

          猜你喜欢
          • 2013-07-14
          • 1970-01-01
          • 2013-12-03
          • 2014-04-02
          • 2011-11-08
          • 1970-01-01
          • 2011-12-13
          • 1970-01-01
          • 2017-08-25
          相关资源
          最近更新 更多