ARM Neon - 将点积累加到输出的索引
ARM Neon - Accumulate dot product to output's index
我想通过以下代码片段实现矢量点积,其中矢量 a
和 b
的点积可以添加到 c
的第一个位置,因此结果将是 [30, 0, 0, 0]
.
#include <arm_neon.h>
#include "utils.h"
int main() {
float a[4]{1, 2, 3, 4};
float b[4]{1, 2, 3, 4};
float c[4];
float32x4_t A = vld1q_f32(a);
float32x4_t B = vld1q_f32(b);
float32x4_t C = vmovq_n_f32(0);
// Computation
vst1q_f32(c, C);
print_vector(c, 4);
}
有没有一种惯用的方法可以用 Neon 做到这一点?
C = vmulq_f32(A, B);
float32x4_t zero = vmovq_n_f32(0);
vst1q_f32(c, zero);
float32x2_t D = vpadd_f32(vget_low_f32(C), vget_high_f32(C));
D = vpadd_f32(D, D);
vst1_lane_f32(c, D, 0);
我想通过以下代码片段实现矢量点积,其中矢量 a
和 b
的点积可以添加到 c
的第一个位置,因此结果将是 [30, 0, 0, 0]
.
#include <arm_neon.h>
#include "utils.h"
int main() {
float a[4]{1, 2, 3, 4};
float b[4]{1, 2, 3, 4};
float c[4];
float32x4_t A = vld1q_f32(a);
float32x4_t B = vld1q_f32(b);
float32x4_t C = vmovq_n_f32(0);
// Computation
vst1q_f32(c, C);
print_vector(c, 4);
}
有没有一种惯用的方法可以用 Neon 做到这一点?
C = vmulq_f32(A, B);
float32x4_t zero = vmovq_n_f32(0);
vst1q_f32(c, zero);
float32x2_t D = vpadd_f32(vget_low_f32(C), vget_high_f32(C));
D = vpadd_f32(D, D);
vst1_lane_f32(c, D, 0);