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

时间:2011-10-15 13:45:25

标签: gcc vectorization

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

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

这样就可以启用所有优化。

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

3 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:5)

您还可以使用optimize函数属性或pragma

选择性地启用和禁用矢量化

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

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

e.g。

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

答案 2 :(得分:0)

很好,现在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。