gpt4 book ai didi

c++ - 如何将多个 fma 操作链接在一起以提高性能?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:28:58 33 4
gpt4 key购买 nike

假设在某些 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) 发表了精彩的演讲。谈话的底线是

Using Fused Multiply Accumulate (aka FMA) everywhere hurts performance.

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

enter image description here

但是,FMA 似乎并不是指令的 chalice 。正如您在下图中看到的那样,FMA 在某些引用中会损害性能。

enter image description here

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

在您的代码中使用 FMA 需要使用 compiler intrinsics .不过,以我的拙见,FMA 等不是您应该担心的事情,除非您是 C++ 编译器程序员。如果您不是,让编译器优化处理这些技术细节。一般来说,在这种担忧下是万恶之源(即过早优化),用其中一位伟大人物(即 Donald Knuth)的话说。

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

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