MSVC多年来一直支持AVX/AVX2指令,根据这篇msdn博客文章,它可以自动生成融合乘法加法(FMA)指令.
然而,以下两个函数都没有编译为FMA指令:
float func1(float x, float y, float z) { return x * y + z; } float func2(float x, float y, float z) { return std::fma(x,y,z); }
更糟糕的是,std :: fma没有实现为单个FMA指令,它执行速度非常快,比平原慢得多x * y + z
(如果实现不依赖于FMA指令,则预期std :: fma的性能很差).
我用/arch:AVX2 /O2 /Qvec
旗帜编译.也尝试过/fp:fast
,没有成功.
所以问题是MSVC如何被迫自动发出FMA指令?
UPDATE
有一个#pragma fp_contract (on|off)
,(看起来像)什么都不做.