1

在 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)));

这是设计使然吗?

4

2 回答 2

6

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

然而,与 SSE 等其他 SIMD 架构不同,请注意,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));
于 2013-11-29T11:34:46.940 回答
2

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

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

从版本“g++ (GCC) 4.10.0 20140419 (experimental)”开始,我不知道 GCC 等价物,但我相信 GCC 的用户可以通过指针取消引用来访问未对齐的内存:

signed int *data;
// ...
vector signed int r = *(vector signed int *)&(data[i]);
于 2014-06-10T06:42:36.183 回答