gpt4 book ai didi

c++ - MSVC中自动生成FMA指令

转载 作者:可可西里 更新时间:2023-11-01 17:50:18 25 4
gpt4 key购买 nike

MSVC 多年来一直支持 AVX/AVX2 指令,并且根据 this msdn blog post , 可以自动生成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 慢得多(std::fma 的糟糕性能是如果实现不依赖于 FMA 指令,这是预期的)。

我用 /arch:AVX2/O2/Qvec 标志编译。也用 /fp:fast 试过了,没有成功。

那么问题是 MSVC 如何强制自动发出 FMA 指令?

更新

有一个#pragma fp_contract (on|off) ,它(看起来)什么都不做。

最佳答案

我解决了这个长期存在的问题。

事实证明,标记 /fp:fast/arch:AVX2/O1(或高于 /O1 ) 不足以让 Visual Studio 2015 模式在 32 位模式下发出 FMA 指令。您还需要 "Whole Program Optimization"使用标记 /GL 打开。

然后 Visual Studio 2015 会生成一个 FMA 指令 vfmadd213ss for

float func1(float x, float y, float z)
{
return x * y + z;
}

关于std::fma,我开了一个bug at Microsoft Connect .他们确认了 std::fma 不会编译为 FMA 指令的行为,因为编译器不会将其视为内在指令。根据他们的回应,它将在未来的更新中得到修复,以获得尽可能最好的代码生成器。

关于c++ - MSVC中自动生成FMA指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34265982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com