如何在使用GCC时禁用矢量化?

Pha*_*omM 8 gcc vectorization

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

gcc -O3 -ftree-vectorizer-verbose=6 -msse4.1 -ffast-math 
Run Code Online (Sandbox Code Playgroud)

有了这个,所有的优化都被启用了.

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

Mat*_*Mat 11

大多数GCC交换机可以使用 no前缀来禁用它们的行为.尝试-fno-tree-vectorize(在-O3命令行之后).

  • 我尝试了这个,仍然发现 xmm0 在我的代码中注册并调用 __ieee754_exp_avx。@马特?欢迎任何帮助。 (2认同)
  • @Hugo,您必须区分自动矢量化和 SIMD 指令的使用。您可以尝试“-mno-sse”、“-mno-avx”和类似选项来告诉编译器避免发出任何 SIMD 代码。 (2认同)

jta*_*lor 5

您还可以使用optimize函数属性或pragma选择性地启用和禁用矢量化

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];
}
Run Code Online (Sandbox Code Playgroud)