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

Posted

技术标签:

【中文标题】AltiVec vec_ld() 是不是仅适用于 16 字节对齐的变量?【英文标题】:Does the AltiVec vec_ld() work only with 16-byte aligned variables?AltiVec vec_ld() 是否仅适用于 16 字节对齐的变量? 【发布时间】:2013-11-29 10:08:22 【问题描述】:

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

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

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

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

这是设计的吗?

【问题讨论】:

【参考方案1】:

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

【讨论】:

有什么理由不使用src2 = vec_ld(15, temp);?看起来它应该做同样的事情,同时如果temp 对齐避免潜在的页面错误(访问堆时更多的问题)。 如果 temp 是一个 16 字节的数组。如果温度在页面末尾。不会崩溃吗? @sunmoon:是的,这在某些情况下是可能的——大多数情况下你可以侥幸逃脱,因为在感兴趣的数据之后通常有有效的内存,因此读取额外的字节不会导致问题,但一般情况下你应该确保第二次读取不会失败。 @PaulR - 如果你有时间可以看看SHA-Intrinsics 中的 POWER8 代码。我们没有看到我们希望的 SHA 性能/改进。任何加快速度的建议都将受到欢迎。 @jww:我希望能帮上忙,但我对 SHA 的东西几乎一无所知——我更像是一个图像处理专家。【参考方案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]);

【讨论】:

“Power8 他们终于添加了对未对齐加载/存储的支持...” - 我相信是 POWER7,而不是 POWER8。另见vec_xld2,见vec_xlw4 和朋友。

以上是关于AltiVec vec_ld() 是不是仅适用于 16 字节对齐的变量?的主要内容,如果未能解决你的问题,请参考以下文章

绑定是不是仅适用于 DependencyProperty?

setPointerCapture 是不是仅适用于 pointerDown 事件?

Java中的“switch”语句是不是仅适用于整数? [复制]

C++ memset 是不是仅适用于 0 和 -1? [关闭]

PyAssimp 是不是仅适用于 STL 文件格式?

ES2017 Async/await 函数 - 它们是不是仅适用于 Promise?