Gan*_*ian 5 gcc simd alignment vectorization
我正在与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] ;
}
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)
在'bb 3'版本的矢量化代码生成.在'bb 4'处生成没有矢量化的代码.这些是通过检查对齐(语句'A')来完成的.现在不使用内在函数和其他属性,我应该如何只获得矢量化代码(没有这个运行时对齐检查.)
如果相关数据是静态分配的,那么您可以使用__align__
GCC 支持的属性来指定它应该与必要的边界对齐。如果要动态分配这些数组,则可以按对齐值进行过度分配,然后将返回的指针向上提升到所需的对齐方式。
posix_memalign()
如果您使用的系统支持该功能,您也可以使用该功能。最后,请注意,malloc()
分配的内存始终与最大内置类型的大小对齐,通常为 double 的 8 个字节。如果您不需要比这更好的东西,那么malloc
就足够了。
编辑:如果您修改分配代码以强制该检查为真(即过度分配,如上所述),则编译器应该不条件化循环代码。如果您需要对齐 8 字节边界(看起来如此),那就类似于a = (a + 7) & ~3;
.
归档时间: |
|
查看次数: |
1673 次 |
最近记录: |