5

我想了解如何最大限度地利用我的 CPU 上的操作数。我正在做一个简单的矩阵乘法程序,并且我有一个 Skylake 处理器。我正在查看维基百科页面以获取有关此架构的失败信息,但我很难理解它。

据我了解,FMA 指令允许 3 路 FP 输入对吗?并允许在它们之间的加法和乘法之间混合。但是当我只添加两个浮点数时会发生什么?它只是将它乘以一吗?我可以在 1 个周期中添加 3 个浮点数,还是会拆分?我看到 skylake,单精度输入有 32 个 FLOPs/cycle,但是“两个 8 宽 FMA 指令”是什么意思?

预先感谢您的解释

4

1 回答 1

8

FMA 在单个操作中计算 ± a*b ± c,具有单个舍入误差。这就是它的作用,没有别的。使用 FMA 指令无法计算 a + b + c;为此,您需要两个相关的 ADD 操作。

根据编译器的不同,您可能必须打开编译器选项以允许使用 FMA 指令,因为它们不会给出与乘法后加法相同的结果。在某些情况下,您可能需要重新排列代码,例如 a b + c d + e 将计算为 x = a b; y = FMA (c, d, x), z = y + e 但 e + a b + c*d 将计算为 x = FMA (a, b, e);z = FMA (c, d, x)。FFT 的基本运算计算可以使用 8 个浮点运算来执行,并且可以使用 4 个 FMA 和两个其他运算重写为 10 个运算。

“两个 8 宽 FMA 指令”是指它可以使用两个 256 位向量寄存器执行 FMA 指令,每个寄存器包含 8 个浮点数,其中两个在同一个周期内。

于 2017-01-08T00:16:40.993 回答