内置融合乘加指令:能否将同一变量用作输入与输出?
关于_mm256_fmadd_ps复用寄存器作为累加器的问题
这种用法是完全合法且安全的,不会触发未定义行为,原因如下:
硬件指令层面支持:
_mm256_fmadd_ps对应的AVX硬件指令VFMADDPS,设计时就允许目标寄存器与源操作数寄存器重叠。指令执行流程是原子性的:先读取所有源操作数(包括作为第三个参数的_res旧值),完成融合乘加计算后,再将结果写入目标寄存器,不存在“同时读写同一寄存器”的冲突。C语言编译器处理:在你的代码中,
_res = _mm256_fmadd_ps(Ax, Bx, _res)这种赋值语句,编译器会正确解析为“读取当前_res的值作为输入,计算后覆盖_res”,不会产生未定义行为。
这种写法是AVX/FMA向量编程中非常常见的累加模式,比如实现向量点积、矩阵乘法中的累加操作时,都会这么写。相比分开执行乘法和加法,FMA指令不仅减少了指令数量,还能提升计算精度和性能,复用寄存器的方式也是编译器推荐的高效实践,不会产生冗余的寄存器拷贝。
你的代码示例完全符合规范:
__m256 A1, B1; __m256 A2, B2; __m256 A3, B3; /* 初始化所有A和B变量 */ __m256 _res = {}; _res = _mm256_fmadd_ps(A1, B1, _res); // _res 累加 A1 * B1 的结果 _res = _mm256_fmadd_ps(A2, B2, _res); // _res 累加 A2 * B2 的结果 _res = _mm256_fmadd_ps(A3, B3, _res); // _res 累加 A3 * B3 的结果
内容的提问来源于stack exchange,提问作者rafoo
相关产品推荐
相关产品推荐

