GCC 12 (minGW 64):如何启用融合乘加代码生成

8 浏览
0 Comments

GCC 12 (minGW 64):如何启用融合乘加代码生成

如果对我的问题的答案很明显,我提前道歉,但请相信我,我已经整天在谷歌上搜索并在这里也进行了搜索,但没有找到任何相关的内容。\n我在我的x64 windows i7设置上使用GCC 12(minGW x64)。我似乎无法使GCC生成任何浮点乘加指令。\n最简单的情况:\n

float func(float a, float b, float c)
{
   return a*b+c;
}

\n生成的汇编代码如下:\n

mulss %xmm1, %xmm0
addss %xmm2, %xmm0
ret

\n没有融合的乘加指令!\n编辑:此输出是使用`-O3`选项生成的。\n我尝试了所有可能的优化和cpu目标选项,包括`-ffast-math`和`-march=corei7`,但都没有成功。\n编辑:对不起,我犯了个错误,在尝试`-mfma`时打了个错字,我以为它已经设置了,但实际上没有。对不起在我问题的第一个版本中错误地声明我尝试过它。\n我是缺少了什么基本的东西吗?我如何让GCC自动生成这些乘加指令?\n然后我想我必须显式地做到这一点,所以我尝试了fmaf()函数,但它只是结果是跳转到一个库函数,这甚至更糟糕!\n更新:看起来,除了`-O3`(我默认总是使用),我还必须设置`-mfma`或`-march=haswell`,才能生成fma指令,这(我可以通过一些基准测试来检查)确实在时间关键代码中带来了一些实质性的速度提升,在那里有一连串的求和和乘法。\n我不完全理解的是为什么简单地使用`-march=corei7`或`-march=corei7-avx`是不够的。如果fma生成被禁用是因为MinGW中的堆栈对齐错误(如有人在评论中提到的),那么即使指定了`-march=haswell`,它也应该被禁用...\n谢谢。

0