假设在某些 C 或 C++ 代码中,我有一个名为 T fma( T a, T b, T c ) 的函数,它执行 1 次乘法和 1 次加法,就像 ( a * b ) + c ;我应该如何优化多个 mul & add 步骤?

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

我还想在关键部分提供一些提示:避免更改 CPU 的舍入模式以避免刷新 CPU 管道。但我很确定在多次调用 + 之间使用 fma 操作不应该改变这一点,我说“非常确定”,因为我没有太多的 CPU 来测试这个,我只是在关注一些逻辑步骤。

我的算法类似于多个 fma 调用的总和

fma ( triplet 1 ) + fma ( triplet 2 ) + fma ( triplet 3 )

最佳答案

最近,在 Build 2014 中,Eric Brumer 就这个主题 ( see here ) 发表了非常精彩的演讲。
谈话的底线是



在 Intel CPU 中,一条 FMA 指令需要 5 个周期。相反,进行乘法(5 个周期)和加法(3 个周期)需要 8 个周期。使用 FMA,您将获得两个操作的奖赏(见下图)。

然而,FMA 似乎不是指令的 chalice 。如下图所示,FMA 在某些引用中可能会损害性能。

以同样的方式,您的案例 fma(triplet1) + fma(triplet2) + fma(triplet 3) 花费 21 个周期,而如果您在没有 FMA 的情况下执行相同的操作将花费 30 个周期。这意味着性能提高了 30%。

在您的代码中使用 FMA 需要使用 compiler intrinsics 。不过,在我看来,FMA 等不是您应该担心的,除非您是 C++ 编译器程序员。如果你不是,让编译器优化来处理这些技术问题。一般来说,在这种担忧之下是万恶之源(即过早优化),用最伟大的人之一(即唐纳德·克努斯)来解释。

关于c++ - 如何将多个 fma 操作链接在一起以提高性能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23710356/

10-11 20:54