2

我在 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 中。为什么是这两种方法?

4

1 回答 1

11

ARM 的信息中心可以找到很好的信息。该参考用于汇编指令,但名称与内在函数非常相似。尽管如果您要使用 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|
+-+-+-+--+

a上图中b

于 2013-08-09T01:22:21.680 回答