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

时间:2013-08-08 18:43:41

标签: android java-native-interface neon

我在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中的ith int8并将其添加到b中的ith int8。为什么这两种方法?

1 个答案:

答案 0 :(得分:8)

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