Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将多个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 - Fatal编程技术网

如何将多个fma操作链接在一起以提高性能? 假设在某些C或C++代码中,我有一个函数,名为“代码> T fMA(t a,t b,t c)< /c>,执行1乘法和1加法,如SO (A*B)+C;我应该如何优化多个mul和add步骤

如何将多个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

例如,我的算法需要用3个或4个fma操作链接并汇总在一起来实现,我如何编写这是一种有效的方法,我应该特别注意语法或语义的哪一部分

我还想得到一些关于关键部分的提示:避免更改CPU的舍入模式以避免刷新CPU管道。但是我很确定,在对
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。有人合理地反对这种转换,但它涉及的是*数字细节,而不是性能。