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

时间:2013-11-29 10:08:22

标签: c simd powerpc altivec

在gcc 4.1.2中,vec_ld()在CPU MPC74XX上无法正常工作。

float temp[4];
__vector float Src;
Src = (__vector float)vec_ld(0, temp);

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

float temp[4] __attribute__((aligned(16)));

这是设计吗?

2 个答案:

答案 0 :(得分:4)

是的,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));

答案 1 :(得分:2)

顺便说一下,在Power8中,他们最终添加了对未对齐的加载/存储矢量访问的支持。有关详细信息,请参阅" 7.6 VSX指令集"部分中的lxvd2x / lxvw4xstxvd2x / stxvw4x说明。 Power ISA 2.07文件。

有权访问IBM XL C/C++ Compiler的人可以使用vec_xld2() / vec_xlw4()vec_xstd2() / vec_xstw4()内在函数。

从版本&#34; g ++(GCC)4.10.0 20140419(实验)&#34;,我不知道GCC等价物,但我相信,GCC的用户可以通过指针解除引用访问未对齐的内存:< / p>

signed int *data;
// ...
vector signed int r = *(vector signed int *)&(data[i]);