vfmlalq_low/high_f16内联函数未更新结果值的技术疑问
问题原因与解决方案
核心问题:你误解了NEON内联函数的调用逻辑——
vfmlalq_low_f16和vfmlalq_high_f16不会原地修改传入的float32x4_t寄存器,而是返回计算后的新向量值。你的代码仅调用了函数,但未将返回值赋值给l和h,因此原变量完全没有更新。正确用法:必须将函数返回的结果重新赋值给目标变量,才能得到累加后的结果。
修正后的代码
int main(void) { float32x4_t l = vdupq_n_f32(1); float32x4_t h = vdupq_n_f32(1); float16x8_t a = vdupq_n_f16(2); float16x8_t b = vdupq_n_f16(3); dump_f32("l", l); dump_f32("h", h); dump_f16("a", a); dump_f16("b", b); // 关键:将函数返回的计算结果赋值给原变量 l = vfmlalq_low_f16(l, a, b); h = vfmlalq_high_f16(h, a, b); dump_f32("l", l); dump_f32("h", h); }
预期运行结果
修正后,l的每个元素会计算为1 + 2*3 = 7,h的每个元素同理也会变为7,输出如下:
l = [ 1.000000 1.000000 1.000000 1.000000 ] h = [ 1.000000 1.000000 1.000000 1.000000 ] a = [ 2.000000 2.000000 2.000000 2.000000 2.000000 2.000000 2.000000 2.000000 ] b = [ 3.000000 3.000000 3.000000 3.000000 3.000000 3.000000 3.000000 3.000000 ] l = [ 7.000000 7.000000 7.000000 7.000000 ] h = [ 7.000000 7.000000 7.000000 7.000000 ]
补充说明
所有ARM NEON算术运算内联函数(如vaddq_f32、vmulq_f16等)均遵循纯函数设计:接收输入向量,计算后返回新向量,不会修改输入参数。这是因为NEON寄存器采用值传递,函数无法直接修改调用者的变量,必须通过返回值传递计算结果。
内容的提问来源于stack exchange,提问作者Thomas Lavergne
相关产品推荐
相关产品推荐

