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

如何在使用GCC时禁用矢量化?,gcc,vectorization,sse,simd,auto-vectorization,Gcc,Vectorization,Sse,Simd,Auto Vectorization,我正在使用以下命令编译代码: gcc -O3 -ftree-vectorizer-verbose=6 -msse4.1 -ffast-math 有了这个,所有的优化都被启用了 但是我想在保持其他优化的同时禁用矢量化。大多数GCC开关都可以使用no前缀来禁用其行为。尝试使用-fno tree vectorize(在命令行上的-O3之后)。您还可以使用optimize function属性或pragmas有选择地启用和禁用矢量化 e、 g \uuuuuuuuuuuuuuuuuuuuuuuuu

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

gcc -O3 -ftree-vectorizer-verbose=6 -msse4.1 -ffast-math 
有了这个,所有的优化都被启用了


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

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

您还可以使用optimize function属性或pragmas有选择地启用和禁用矢量化

e、 g

\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
无效f(双*限制a,双*限制b)
{
对于(int i=0;i<256;i++)
a[i]+=b[i];
}

非常好,现在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__];
    ....
extern“C”\uuuuuu属性(优化(“无树向量化”))
/*子程序*/
int s111_(整数*n次,整数*ld,整数*n,
实时,实时,
实*限制a,实*b,实*c,实*d,
真实*e,真实*aa,真实*bb,真实*cc)
{
....

对于(i_uuu=2;i_uuuu我尝试了这个,但仍然在我的代码中找到了xmm0寄存器,并调用了uuu ieee754_exp_avx。@Mat?欢迎任何帮助。@Hugo,你必须区分自动矢量化和SIMD指令的使用。你可以尝试
-mno sse
-mno avx
和类似的选项来告诉编译器避免发出任何SIMD代码@maxschlepzig:请注意,x86-64使用XMM寄存器作为标量浮点/双精度调用约定的一部分。使用
-mno sse
您需要完全避免任何FP数学(至少在函数调用/返回中)。对于内核代码或其他东西,避免任何FP数学通常足以避免函数中的任何x87指令,并且GCC不会使用MMX指令自动矢量化,即使SSE2不可用,因此您通常不需要
-mno MMX
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__];
    ....