我正在使用 GCC 进行自动矢量化。由于客户要求,我无法使用内在函数或属性。(我无法获得用户输入来支持矢量化)
如果可以向量化的数组的对齐信息未知,则 GCC 调用“循环版本控制”的传递。在树上进行循环矢量化时将执行循环版本控制。当一个循环被确定为可向量化的,并且数据对齐或数据依赖的约束阻碍了它,(因为它们无法在编译时确定),那么将生成两个版本的循环。这些是循环的矢量化和非矢量化版本,以及运行时检查对齐或依赖性以控制执行哪个版本。
我的问题是我们必须如何强制对齐?如果我找到了一个可矢量化的循环,我不应该生成两个版本的循环,因为缺少对齐信息。
例如。考虑下面的代码
short a[15]; short b[15]; short c[15];
int i;
void foo()
{
for (i=0; i<15; i++)
{
a[i] = b[i] ;
}
}
树转储(选项:-fdump-tree-optimized -ftree-vectorize)
<SNIP>
vector short int * vect_pa.49;
vector short int * vect_pb.42;
vector short int * vect_pa.35;
vector short int * vect_pb.30;
bb 2>:
vect_pb.30 = (vector short int *) &b;
vect_pa.35 = (vector short int *) &a;
if (((signed char) vect_pa.35 | (signed char) vect_pb.30) & 3 == 0) ;; <== (A)
goto <bb 3>;
else
goto <bb 4>;
bb 3>:
</SNIP>
在“bb 3”版本的矢量化代码中生成。在“bb 4”处生成没有矢量化的代码。这些是通过检查对齐来完成的(语句“A”)。现在不使用内在函数和其他属性,我应该如何只获得矢量化代码(没有这个运行时对齐检查。)