【问题标题】:How can I disable vectorization while using GCC?如何在使用 GCC 时禁用矢量化?
【发布时间】:2011-12-08 08:31:35
【问题描述】:

我正在使用以下命令编译我的代码:

gcc -O3 -ftree-vectorizer-verbose=6 -msse4.1 -ffast-math 

这样所有的优化都被启用了。

但我想在保留其他优化的同时禁用矢量化。

【问题讨论】:

    标签: gcc vectorization sse simd auto-vectorization


    【解决方案1】:

    大多数 GCC 开关都可以与 no 前缀一起使用来禁用它们的行为。尝试使用-fno-tree-vectorize(在命令行上的-O3 之后)。

    【讨论】:

    • 我试过了,但仍然在我的代码中找到了 xmm0 寄存器并调用了 __ieee754_exp_avx。 @马特?欢迎任何帮助。
    • @Hugo,您必须区分自动矢量化和 SIMD 指令的使用。您可以尝试-mno-sse-mno-avx 和类似选项来告诉编译器避免发出任何 SIMD 代码。
    • @maxschlepzig:请注意,x86-64 使用 XMM 寄存器作为标量浮点/双精度调用约定的一部分。使用-mno-sse,您需要完全避免任何 FP 数学运算(至少在函数调用/返回中)。对于内核代码或其他东西,避免任何 FP 数学通常足以避免任何 x87 指令 within 函数,即使 SSE2 不可用,GCC 也不会使用 MMX 指令自动矢量化,所以你通常不需要-mno-mmx
    【解决方案2】:

    您还可以使用优化函数属性或编译指示选择性地启用和禁用矢量化

    http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

    http://gcc.gnu.org/onlinedocs/gcc/Function-Specific-Option-Pragmas.html

    例如

    __attribute__((optimize("no-tree-vectorize")))
    void f(double * restrict a, double * restrict b)
    {
        for (int i = 0; i < 256; i++)
            a[i] += b[i];
    }
    

    【讨论】:

      【解决方案3】:

      太好了,现在 gcc 在矢量化方面变得更加积极,例如

      extern "C" __attribute__((optimize("no-tree-vectorize")))
      /* Subroutine */
      int s111_ (integer * ntimes, integer * ld, integer * n,
                 real * ctime, real * dtime,
                 real * __restrict a, real * b, real * c__, real * d__,
                 real * e, real * aa, real * bb, real * cc)
      {
          ....
          for (i__ = 2; i__ <= i__2; i__ += 2)
              a[i__] = a[i__ - 1] + b[i__];
          ....
      

      在上面发布的案例中,删除 restrict 用于完成这项工作,但现在 g++ 6.0 无法通过删除 __restrict 来停止矢量化。

      【讨论】:

        猜你喜欢
        • 2010-09-29
        • 2016-02-24
        • 2018-12-29
        • 2017-02-18
        • 2017-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-16
        相关资源
        最近更新 更多