AltiVec vec_ld()仅适用于16字节对齐变量吗?

Bob*_*hus 1 c powerpc simd altivec

在gcc 4.1.2中,vec_ld()在CPU MPC74XX板上不能正常工作。

float temp[4];
__vector float Src;
Src = (__vector float)vec_ld(0, temp);
Run Code Online (Sandbox Code Playgroud)

但是,如果float变量对齐到16个字节,则它可以正常工作:

float temp[4] __attribute__((aligned(16)));
Run Code Online (Sandbox Code Playgroud)

这是设计使然吗?

Pau*_*l R 5

是的,AltiVec加载和存储需要16字节对齐。这在AltiVec手册中有很好的记录。

但是,与其他SIMD架构(例如SSE)不同,请注意,AltiVec会默默地将未对齐的地址截断到下一个最低的16个字节边界,而不是生成异常,因此您的代码不会崩溃,但是如果您尝试加载或存储,它将无法正确运行地址未对齐。

在无法避免未对齐载荷的情况下,可以加载两个相邻的对齐向量,然后使用vec_lvsl+ vec_perm创建所需的向量:

float temp[4];
__vector float sr1, src2, src;

src1 = vec_ld(0, temp);
src2 = vec_ld(16, temp);
src = vec_perm(src1, src2, vec_lvsl(0, temp));
Run Code Online (Sandbox Code Playgroud)