我在 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 相加。为什么是这两种方法?
最佳答案
在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|
+-+-+-+--+
对于上图中的a
和b
。
关于android - Android neon 内在函数中 'addition' 和 'pairwise addition' 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18133690/