了解 FMA 指令性能
Understanding FMA instructions performance
我想了解如何最大限度地利用 CPU 进行的操作。我正在做一个简单的矩阵乘法程序,我有一个 Skylake 处理器。我在维基百科页面上查看有关此架构的失败信息,但我很难理解它。
据我了解,FMA 指令允许 3 路 FP 输入,对吗?并允许在它们之间混合加法和乘法。但是当我只添加两个浮点数时会发生什么?它只是简单地乘以一吗?我可以在 1 个循环中添加 3 个浮点数,还是将其拆分?我看到 skylake 有 32 FLOPs/cycle 用于单精度输入,但是“两个 8 宽 FMA 指令”是什么意思?
提前感谢您的解释
FMA 在一次运算中计算出 ± a*b ± c,并带有一个舍入误差。这就是它的作用,没有别的。不能使用 FMA 指令计算 a + b + c;为此,您需要两个相关的 ADD 操作。
根据编译器的不同,您可能必须打开一个编译器选项以允许使用 FMA 指令,因为它们给出的结果与先乘后加的结果不同。在某些情况下你可能不得不重新安排你的代码,例如 ab + cd + e 将被计算为 x = ab; y = FMA (c, d, x), z = y + e 但 e + ab + c*d 将计算为 x = FMA (a, b, e); z = FMA (c, d, x)。 FFT 的基本运算计算可以用八个浮点运算来执行,并且可以使用四个 FMA 和两个其他运算重写为 10 个运算。
"Two 8-wide FMA instructions" 表示它可以使用两个 256 位向量寄存器执行 FMA 指令,每个寄存器包含 8 个浮点数,并且其中两个在同一周期中。
我想了解如何最大限度地利用 CPU 进行的操作。我正在做一个简单的矩阵乘法程序,我有一个 Skylake 处理器。我在维基百科页面上查看有关此架构的失败信息,但我很难理解它。
据我了解,FMA 指令允许 3 路 FP 输入,对吗?并允许在它们之间混合加法和乘法。但是当我只添加两个浮点数时会发生什么?它只是简单地乘以一吗?我可以在 1 个循环中添加 3 个浮点数,还是将其拆分?我看到 skylake 有 32 FLOPs/cycle 用于单精度输入,但是“两个 8 宽 FMA 指令”是什么意思?
提前感谢您的解释
FMA 在一次运算中计算出 ± a*b ± c,并带有一个舍入误差。这就是它的作用,没有别的。不能使用 FMA 指令计算 a + b + c;为此,您需要两个相关的 ADD 操作。
根据编译器的不同,您可能必须打开一个编译器选项以允许使用 FMA 指令,因为它们给出的结果与先乘后加的结果不同。在某些情况下你可能不得不重新安排你的代码,例如 ab + cd + e 将被计算为 x = ab; y = FMA (c, d, x), z = y + e 但 e + ab + c*d 将计算为 x = FMA (a, b, e); z = FMA (c, d, x)。 FFT 的基本运算计算可以用八个浮点运算来执行,并且可以使用四个 FMA 和两个其他运算重写为 10 个运算。
"Two 8-wide FMA instructions" 表示它可以使用两个 256 位向量寄存器执行 FMA 指令,每个寄存器包含 8 个浮点数,并且其中两个在同一周期中。