我正在使用以下命令编译我的代码:
gcc -O3 -ftree-vectorizer-verbose=6 -msse4.1 -ffast-math
有了这个,所有的优化都被启用了。
但我想在保持其他优化的同时禁用矢量化。
我正在使用以下命令编译我的代码:
gcc -O3 -ftree-vectorizer-verbose=6 -msse4.1 -ffast-math
有了这个,所有的优化都被启用了。
但我想在保持其他优化的同时禁用矢量化。
大多数 GCC 开关都可以使用 no
前缀来禁用它们的行为。尝试-fno-tree-vectorize
(在-O3
命令行之后)。
您还可以使用优化函数属性或编译指示选择性地启用和禁用矢量化
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];
}
太好了,现在 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
。