FMA指令集的硬件支持有多丰富

how abundant is hardware support for FMA instruction set

Steam's hardware survey 非常有用,因为它概述了对 SSE 指令集的硬件支持。但是,我找不到任何关于 FMA 支持有多丰富的资源。某处有这方面的数据吗?或者是否有任何其他指令集与 FMA 或多或少相关,比如如果你有一个,你很可能有另一个,你可以根据它进行估计?

FMA3 {通常称为 FMA} 是 AVX2 指令集的一部分,从 Haswell 和 Piledriver 微体系结构开始可用。

AMD 有自己的 FMA4,我只看到它用过一次...

我不确定如何通过了解 AVX2 数字来估计 FMA 使用情况...基本上,这里有 2 点 - 编译器可能会在为 AVX2 编译时生成 FMA; FMA 只是 FP,我希望大部分 FP 代码已经在 client/gaming space 中卸载到 GPU。因此FMA可能并没有真正被使用。

但另一方面我知道它在 HPC 中很有用(比如 dgemm 和其他 LAPACK 和 MKL 函数)。

老实说,在为相当大的应用程序进行 AVX2 调优时,我只使用过一次 FMA。

FMA3 是 AVX2 的一部分,因此任何具有 AVX2 的芯片都应该支持 FMA3。也就是说,您可以而且应该独立检查 FMA3 支持。

Intel "Haswell"、AMD Excavator 和更高版本的处理器支持 AVX2。

FMA4 得到了 AMD "Bulldozer" 的支持,但他们已经回到支持 AMD "Piledriver" 的 FMA3。

鉴于所有这些芯片都是最近才出现的,因此并未广泛普及。 Valve Hardare Survey 尚未显示 AVX、FMA3 或 AVX2 数据,因此目前这绝对是一个猜测。

顺便说一句,Xbox One 和 PS4 AMD Jaguar CPU 不支持 FMA3,尽管它们支持 AVX 和 F16C。

参见DirectXMath: AVX2DirectXMath: F16C and FMA

FMA3 was introduced by AMD in Piledriver (May 2012). (Vishera FX CPU, Trinity & Richland APU). Piledriver has a serious performance bug with 256b (AVX ymm) store throughput (VMOVAPS/VMOVUPS: one per 17/20 cycles). (See Agner Fog's microarch doc 和其他来源。)要么在 Piledriver 上禁用 256b AVX 例程,要么编写一个使用 128b xmm FMA 的 Piledriver 特定版本。 (或者 FMA4,它也可以 运行 在 Bulldozer 上。)

继任者 Steamroller 仅在 Kaveri APU 中找到。 (FX CPU 仍然是 Piledriver。)Steamroller 修复了 256b 存储的 perf 错误,但是 256b 一切都需要两倍于 128b 版本的周期,所以你不会从 256b AVX 获得任何东西(除了循环开销的微小减少)。也就是说,如果 FMA4 可用,您也可以将代码写入 运行 128b FMA4 版本。

FMA3 由 Intel 在 Haswell(2013 年 6 月)中与 AVX2 同时推出。许多人还没有从 Sandybridge/IvyBridge 升级,因为只有很小的性能差异,除了可以充分利用 AVX2/FMA 的代码。 (即不是大多数东西。)

FMA3 是一个独立于 AVX2 的 CPUID 功能标志。说它是 AVX2 的一部分的错误答案是由于英特尔将它与 Haswell 一起引入。

所以总而言之,很多 AMD 用户可能确实支持 FMA,即使它只是 Bulldozer FMA4。至于英特尔,即使是 Nehalem CPU 对大多数人来说也足够快,所以没有太多升级的理由。不过我没有任何数字。