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

14

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

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

使用此选项将启用所有优化。

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

3个回答

19

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


2
我尝试了这个方法,但在我的代码中仍然发现了xmm0寄存器和对__ieee754_exp_avx的调用。@Mat?欢迎任何帮助。 - Hugo
2
@Hugo,你必须区分自动向量化和使用SIMD指令的区别。你可以尝试使用“-mno-sse”、“-mno-avx”等选项来告诉编译器避免生成任何SIMD代码。 - maxschlepzig
1
@maxschlepzig: 注意x86-64将XMM寄存器作为标量浮点/双精度调用约定的一部分。使用-mno-sse,您需要完全避免任何FP数学运算(至少在函数调用/返回中)。对于内核代码之类的东西,避免任何FP数学运算通常足以避免函数内的任何x87指令,并且即使没有SSE2,GCC也不会自动向量化MMX指令,因此通常不需要-mno-mmx - Peter Cordes

9

1

非常好,现在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以前可以完成任务,但现在通过删除__restrict无法阻止g++ 6.0进行向量化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接