如何将多个fma操作链接在一起以提高性能? 假设在某些C或C++代码中,我有一个函数,名为“代码> T fMA(t a,t b,t c)< /c>,执行1乘法和1加法,如SO (A*B)+C;我应该如何优化多个mul和add步骤
例如,我的算法需要用3个或4个fma操作链接并汇总在一起来实现,我如何编写这是一种有效的方法,我应该特别注意语法或语义的哪一部分 我还想得到一些关于关键部分的提示:避免更改CPU的舍入模式以避免刷新CPU管道。但是我很确定,在对如何将多个fma操作链接在一起以提高性能? 假设在某些C或C++代码中,我有一个函数,名为“代码> T fMA(t a,t b,t c)< /c>,执行1乘法和1加法,如SO (A*B)+C;我应该如何优化多个mul和add步骤,c++,c,floating-point,fma,C++,C,Floating Point,Fma,例如,我的算法需要用3个或4个fma操作链接并汇总在一起来实现,我如何编写这是一种有效的方法,我应该特别注意语法或语义的哪一部分 我还想得到一些关于关键部分的提示:避免更改CPU的舍入模式以避免刷新CPU管道。但是我很确定,在对fma的多次调用之间使用+操作不会改变这一点,我说的是“非常确定”,因为我没有太多的CPU来测试这一点,我只是遵循一些逻辑步骤 我的算法类似于多个fma调用的总和 fma ( triplet 1 ) + fma ( triplet 2 ) + fma ( triplet
fma
的多次调用之间使用+
操作不会改变这一点,我说的是“非常确定”,因为我没有太多的CPU来测试这一点,我只是遵循一些逻辑步骤
我的算法类似于多个fma调用的总和
fma ( triplet 1 ) + fma ( triplet 2 ) + fma ( triplet 3 )
最近,在2014年版中,Eric Brumer就这个话题做了一次非常精彩的演讲()。 谈话的底线是 到处使用融合乘法累加(又称FMA)会影响性能。 在英特尔CPU中,FMA指令需要5个周期。相反,进行乘法(5个周期)和加法(3个周期)需要8个周期。使用FMA,您将获得两次操作,一次奖励(见下图) 然而,FMA似乎并不是指令的圣杯。正如你在下图中所看到的,FMA在某些引用中可能会损害性能 同样,您的案例
fma(三重态1)+fma(三重态2)+fma(三重态3)
需要21个周期,而如果您在没有fma的情况下进行相同的操作,则需要30个周期。这在性能上增加了30%
在代码中使用FMA需要使用。尽管我是个拙劣的见解,但是FMA等不是你应该担心的,除非你是C++编译器程序员。如果不是,让编译器优化来处理这些技术细节。一般来说,在这种担忧下,所有邪恶的根源(即过早优化)都存在,换言之,其中一个伟大的根源(即Donald Knuth)。现在还不太清楚你在问什么。大概这完全取决于你的特定编译器选择做什么?@OliCharlesworth你能概括一下不清楚的部分吗?我刚才说的;)不清楚如何回答这个问题,因为(除非我遗漏了什么)这完全取决于您特定的编译器和硬件。我看不出这个问题的一般答案会是什么样子。@OliCharlesworth好的,
GCC4.9.0
和支持sse2
的CPU是我目前的最低目标。你是在谈论最近的AMD和英特尔(Haswell)CPU上发现的FMA指令吗?这是一个相当幼稚和误导性的例子。我有点震惊,它来自一个编译工程师。在性能关键型代码中,延迟很少是主要瓶颈。虽然ab+cd比fma(a、b、cd)具有更低的延迟,但它需要三个而不是两个µOp,这将其性能限制在更常见的吞吐量占主导地位的环境中的2/3。有人合理地反对这种转换,但它涉及的是*数字细节,而不是性能。