我正在做8bit定点工作,我有一个数组和B阵列都是Q7格式的,我想得到他们的和积 演示代码:如何使用arm霓虹灯8bit乘加总和到32位矢量中?
int8_t ra1[], ra2[], rb[];
int8x16_t va1, va2, vb;
int16x4_t vsum1, vsum2;
va1 = vld1q_s8(ra1);
va2 = vld1q_s8(ra2);
vb = vld1q_s8(rb);
vsum1 = vdup_n_s16(0);
vsum2 = vdup_n_s16(0);
for (......)
vsum1 = vmlal_s8(vsum1, vget_high_s8(va1), vget_high_s8(vb));
vsum1 = vmlal_s8(vsum1, vget_low_s8(va1), vget_low_s8(vb));
sum + = a * b;这个和是16位,它可以很容易溢出,因为a * b是Q7×Q7 16位可以表示Q15。另外,我不能移位到Q7xQ7的结果,我需要保持高精度。 如何使用霓虹灯,我想总和是32位a,b仍然是8位。我不想将a和b调到16位并使用vmlal_s16,它会很慢。我只需要一个可以进行乘加的指令一个指令时间。 霓虹灯c内在函数没有这个功能,也许霓虹灯汇编代码可以做到这一点。谁能帮助我?谢谢。 Here是vmla汇编代码信息。也许我可以使用它。请给出一些建议,我不熟悉汇编代码。
你确定*在乘法运算缓慢之前将a和b转换为16位(即你有没有测试过*)? AFAIR,至少有一些NEON实现需要两倍长的时间来执行'8位×8位'向量乘法,因为它们在硬件中具有16位乘法器。在这种情况下,这意味着在乘法之前加宽并不会增加成本。 – EOF