Android neon内在函数中“加法”和“成对加法”之间的区别?

Posted

技术标签:

【中文标题】Android neon内在函数中“加法”和“成对加法”之间的区别?【英文标题】:Difference between 'addition' and 'pairwise addition' in Android neon intrinsics? 【发布时间】:2013-08-08 18:43:40 【问题描述】:

我在 android JNI 上使用 Neon 实现了一个算法。当我想将向量相加时,我注意到有两种类型的方法,但我看不出区别。

// pairwise addition
int8x8_t vpadd_s8(int8x8_t a, int8x8_t b); // VPADD.I8 d0,d0,d0

// addition
int8x8_t vadd_s8(int8x8_t a, int8x8_t b);  // VADD.I8 d0,d0,d0 

第二个符合您的预期。它获取 a 中的第 i 个 int8 并将其添加到 b 中的第 i 个 int8 中。为什么是这两种方法?

【问题讨论】:

感谢您的精彩评论,但我发现这没有定论。成对加法:这些内在函数提供成对加法运算。加法:这些内在函数添加向量。结果中的每条车道都是在每个操作数向量中的相应车道上执行加法的结果。 【参考方案1】:

在ARM's Information Center 可以找到很好的信息。该参考用于汇编指令,但名称与内在函数非常相似。尽管如果您要使用 NEON,直接跳到组装阶段会获得更好的性能。它比使用内部函数更容易编写。

总而言之,成对加法将元素对添加到同一向量中,然后将结果连接到单个向量中。一个插图(为了便于绘制,我使用了 4 元素向量):

vector 'a'   vector 'b'
+-+-+-+-+    +-+-+-+-+
|0|1|2|3|    |4|5|6|7|
+-+-+-+-+    +-+-+-+-+
 \+/ \+/      \+/ \+/
  1   5        9   13
   \   \      /   /
      +-+-+-+--+
      |1|5|9|13|  result
      +-+-+-+--+

这与常规的加法指令不同,后者将两个向量的对应元素相加,给出结果

+-+-+-+--+
|4|6|8|10|
+-+-+-+--+

对于上图中的ab

【讨论】:

以上是关于Android neon内在函数中“加法”和“成对加法”之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ARM Neon 内在函数对 IF 块进行矢量化?

Neon 在 Intrinsics 中的校验和代码实现

使用NEON内在函数除以浮点数

在 iOS 上使用 NEON 乘积

使用内在函数测试 128 位 NEON 寄存器的值为 0 的最快方法?

如何在 Neon 内在函数中使用 if 条件进行并行操作?