以下是一些最新处理器微架构的理论最大 FLOP 计数(每个内核)以及如何实现它们的说明。
通常,要计算此值,请查看 FMA 指令的吞吐量,例如在https://agner.org/optimize/或任何其他微基准测试结果上,然后乘以
(FMAs per clock) * (vector elements / instruction) * 2 (FLOPs / FMA)
。
请注意,在实际代码中实现这一点需要非常仔细的调整(如循环展开),缓存未命中率接近于零,并且在其他任何事情上都没有瓶颈。现代 CPU 具有如此高的 FMA 吞吐量,以至于其他指令没有太多空间来存储结果或向它们提供输入。例如,每个时钟 2 个 SIMD 负载也是大多数 x86 CPU 的限制,因此点积将成为每 1 个 FMA 2 个负载的瓶颈。不过,经过仔细调整的密集矩阵乘法可以接近实现这些数字。
如果您的工作负载包括任何不能被纳入 FMA 的 ADD/SUB 或 MUL,则理论上的最大数量不是适合您的工作负载的目标。Haswell/Broadwell 具有每时钟 2 个 SIMD FP 乘法(在 FMA 单元上),但每个时钟只有 1 个 SIMD FP add(在具有较低延迟的单独向量 FP add 单元上)。Skylake 放弃了单独的 SIMD FP 加法器,以 4c 延迟、每时钟 2 次吞吐量运行 add/mul/fma 相同的任何向量宽度。
英特尔
请注意,最近微架构的 Celeron/Pentium 版本不支持 AVX 或 FMA 指令,仅支持 SSE4.2。
英特尔酷睿 2 和 Nehalem (SSE/SSE2):
- 4 DP FLOPs/cycle:2-wide SSE2 加法 + 2-wide SSE2 乘法
- 8 SP FLOPs/cycle:4-wide SSE 加法 + 4-wide SSE 乘法
英特尔桑迪桥/常春藤桥 (AVX1):
- 8 DP FLOPs/cycle:4-wide AVX 加法 + 4-wide AVX 乘法
- 16 SP FLOPs/cycle:8 宽度 AVX 加法 + 8 宽度 AVX 乘法
英特尔 Haswell/Broadwell/Skylake/Kaby Lake/Coffee/... (AVX+FMA3):
- 16 DP FLOPs/cycle:两条 4-wide FMA(fused multiply-add)指令
- 32 SP FLOPs/cycle:两条 8-wide FMA(fused multiply-add)指令
- (使用 256 位向量指令会降低某些 CPU 的最大涡轮时钟速度。)
Intel Skylake-X/Skylake-EP/Cascade Lake/etc ( AVX512F ) 带1 个 FMA 单元:一些 Xeon Bronze/Silver
- 16 DP FLOPs/cycle:一条 8-wide FMA(fused multiply-add)指令
- 32 SP FLOPs/cycle:一条 16-wide FMA(fused multiply-add)指令
- 与更窄的 256 位指令的计算吞吐量相同,但对于更广泛的加载/存储、一些不在 FMA 单元上运行的向量操作(如按位操作)和更广泛的 shuffle,AVX512 仍然可以实现加速。
- (运行中的 512 位向量指令会关闭端口 1 上的向量 ALU。还会降低最大涡轮时钟速度,因此“周期”在性能计算中不是常数。)
英特尔 Skylake-X/Skylake-EP/Cascade Lake/etc ( AVX512F ) 带有2 个 FMA 单元:至强金/铂金和 i7/i9 高端台式机 (HEDT) 芯片。
- 32 DP FLOPs/cycle:两条 8-wide FMA(fused multiply-add)指令
- 64 SP FLOPs/cycle:两条 16-wide FMA(fused multiply-add)指令
- (运行中的 512 位向量指令会关闭端口 1 上的向量 ALU。还会降低最大涡轮时钟速度。)
未来:英特尔Cooper Lake(Cascade Lake 的继任者)预计将引入Brain Float,这是一种用于神经网络工作负载的 float16 格式,支持实际的 SIMD 计算,这与当前仅支持加载/存储的 F16C 扩展不同转换为 float32。这应该使 FLOP/cycle 吞吐量与相同硬件上的单精度相比翻倍。
当前的英特尔芯片仅在 iGPU 中的标准 float16 上直接进行实际计算。
AMD
AMD K10:
- 4 DP FLOPs/cycle:2-wide SSE2 加法 + 2-wide SSE2 乘法
- 8 SP FLOPs/cycle:4-wide SSE 加法 + 4-wide SSE 乘法
AMD 推土机/打桩机/压路机/挖掘机,每个模块(两个核心):
- 8 DP FLOPs/cycle:4-wide FMA
- 16 SP FLOPs/cycle: 8-wide FMA
AMD锐龙
- 8 DP FLOPs/cycle:4-wide FMA
- 16 SP FLOPs/cycle: 8-wide FMA
x86 低功耗
英特尔凌动(Bonnell/45nm、Saltwell/32nm、Silvermont/22nm):
- 1.5 DP FLOPs/cycle:标量 SSE2 加法 + 标量 SSE2 乘法每隔一个周期
- 6 SP FLOPs/cycle:4-wide SSE 加法 + 4-wide SSE 乘法每隔一个周期
AMD山猫:
- 1.5 DP FLOPs/cycle:标量 SSE2 加法 + 标量 SSE2 乘法每隔一个周期
- 4 SP FLOPs/cycle:每隔一个周期进行 4 次 SSE 加法 + 每隔一个周期进行 4 次 SSE 乘法
AMD捷豹:
- 3 DP FLOPs/cycle:4-wide AVX 加法每隔一个周期 + 4-wide AVX 乘法在四个周期内
- 8 SP FLOPs/cycle:每隔一个周期进行 8 次 AVX 加法 + 每隔一个周期进行 8 次 AVX 乘法
手臂
ARM Cortex-A9:
- 1.5 DP FLOPs/cycle:标量加法 + 标量乘法每隔一个周期
- 4 SP FLOPs/cycle:4-wide NEON 每隔一个周期加法 + 4-wide NEON 乘法每隔一个周期
ARM Cortex-A15:
- 2 DP FLOPs/cycle:标量 FMA 或标量乘加
- 8 SP FLOPs/cycle:4-wide NEONv2 FMA 或 4-wide NEON multiply-add
高通Krait:
- 2 DP FLOPs/cycle:标量 FMA 或标量乘加
- 8 SP FLOPs/cycle:4-wide NEONv2 FMA 或 4-wide NEON multiply-add
IBM 电源
IBM PowerPC A2(Blue Gene/Q),每个内核:
- 8 DP FLOPs/cycle:每个周期 4-wide QPX FMA
- SP 元素扩展到 DP 并在相同的单元上处理
IBM PowerPC A2(Blue Gene/Q),每个线程:
- 4 DP FLOPs/cycle:4-wide QPX FMA 每隔一个周期
- SP 元素扩展到 DP 并在相同的单元上处理
英特尔 MIC / 至强融核
Intel Xeon Phi (Knights Corner),每个核心:
- 16 DP FLOPs/cycle:每个周期 8-wide FMA
- 32 SP FLOPs/cycle:每个周期 16-wide FMA
Intel Xeon Phi (Knights Corner),每个线程:
- 8 DP FLOPs/cycle:8-wide FMA 每隔一个周期
- 16 SP FLOPs/cycle:16-wide FMA 每隔一个周期
Intel Xeon Phi (Knights Landing),每个核心:
- 32 DP FLOPs/cycle:每个周期两个 8-wide FMA
- 64 SP FLOPs/cycle:每个周期两个 16-wide FMA
IBM Blue Gene/Q 和 Intel Xeon Phi (Knights Corner) 有 per-thread 和 per-core 数据的原因是这些内核在每个内核运行多个线程时具有更高的指令发出率。