MSVC 多年来一直支持 AVX/AVX2 指令,根据这篇 msdn 博客文章,它可以自动生成fused-multiply-add (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指令呢?
更新
有一个#pragma fp_contract (on|off)
,它(看起来)什么都不做。