AAch64 高级 SIMD 向量加法

Posted

技术标签:

【中文标题】AAch64 高级 SIMD 向量加法【英文标题】:AAch64 Advanced SIMD vector addition 【发布时间】:2016-02-03 19:22:21 【问题描述】:

我正在尝试在我的汇编代码中添加两个高级 SIMD 向量。在这里,我有两个向量v0v1,我想将v0 的上半部分与v1 的下半部分相加,并将结果放在v0 的上半部分。性能在我的代码中至关重要,因此我正在尝试找到一种方法,可以通过一条附加指令来做到这一点。我知道我可以将上半部分移到另一个寄存器中,只需使用UADDL 指令即可。 在 AArch32 NEON 指令集中,可以使用 Dn 而不是 Qn 来完成。例如,在我的情况下,它可以这样做: vqadd.u64 d1, d1, d2 有什么办法可以在 AArch64 高级 SIMD 指令中做到这一点?

【问题讨论】:

您必须重新排列代码以避免出现这种情况。您能否发布代码片段来说明您如何达到需要这样做的地步? 【参考方案1】:

正如@sh1 所指出的,您需要重新安排一些事情。

vqadd 的等效 AArch64 指令是 sqadd 或 uqadd。但是,他们会将 v0 中的 8 个单字节 0-7 添加到 v1 中的 8 个单字节 0-7;这不是你想要的。但是,如果您可以重新安排 v1 的加载指令,您就可以达到预期的目标。

.data
 array:        .ascii  "73167176531330624919225119674426574742355349194934"
...
ldr x20,=array // ptr
ld1 v0.16b, v1.16b, [x20] // load multiple 1-element structures to two consecutive elements
uqadd v0.8b,v1.8b,v0.8b

...
(gdb) p $v0.b.s
$14 = 7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 0, 6, 2
(gdb) p $v1.b.s
$15 = 4, 9, 1, 9, 2, 2, 5, 1, 1, 9, 6, 7, 4, 4, 2, 6
(gdb)
(gdb) p $v0.b.s
$26 = 11, 12, 2, 15, 9, 3, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0

【讨论】:

以上是关于AAch64 高级 SIMD 向量加法的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的向量 SIMD 类型

如何使用内部函数 C++ 将 3 个加法和 1 个乘法转换为矢量化 SIMD

动态分配 SIMD 向量数组是不是安全?

SIMD 零向量测试

带有 Altivec 的 SIMD:为啥将两个向量相乘比相加两个向量更快?

GCC SSE 手写与生成