3.4 GHz 是最大 单核 turbo(也是 2 核),所以请注意,这不是 per-core GFLOPS,它是 单核 GFLOPS。
最大的全核 turbo 为 2.6 GHz on that CPU,并且可能无法长时间维持所有内核的 SIMD FP 执行单元。那是the most power-intensive thing x86 CPUs can do。所以如果你真的让所有核心都忙,它可能会回落到 2.4 GHz。
是的,您错过了两倍,因为 FMA 算作两次 FP 操作,而这正是您需要做的,以实现硬件的理论最大 FLOPS。 FLOPS per cycle for sandy-bridge and haswell SSE2/AVX/AVX2 。 (就最大吞吐量而言,您的 Broadwell 与 Haswell 相同。)
如果您只使用加法,那么每条指令的每个 SIMD 元素只有一个 FLOP,还有only 1/clock FP instruction throughput on a v4 (Broadwell) or earlier。
Haswell / Broadwell 有两个全流水线 SIMD FMA 单元(在端口 0 和 1 上)和一个全流水线 SIMD FP-add 单元(在端口 1 上),延迟低于 FMA。
FP-add 单元与 FMA 单元之一位于同一执行端口,因此它可以在每个时钟启动 2 个 FP uop,其中最多一个可以是纯加法。 (除非您将x+y 添加为fma(x, 1.0, y),否则以更高的延迟换取更高的吞吐量。)
IPC(每周期指令)= 2;
不,这是每个周期的最大 FP 数学 指令数,而不是每个时钟的总指令数。流水线的最窄点为 4 uops 宽,因此每个循环都有一点循环开销和一条存储指令以及两个 SIMD FP 操作的空间。
但是,是的,每个时钟启动 2 个 FP 操作,如果它们不是两个加法的话。
是否应该乘以 2(由于流水线技术使得加法和乘法可以并行进行)?
对于并行加法和乘法运算,您已经乘以 IPC=2。
如果您的意思是 FMA (Fused Multiply-Add),那么不,这实际上是将它们作为单个操作的一部分进行,而不是作为“管道技术”并行进行。这就是为什么它被称为“融合”。
在许多 CPU 中,FMA 与乘法具有相同的延迟,而不是先乘法再加法。 (尽管在 Broadwell 上,FMA 延迟 = 5 个周期,vmulpd 延迟 = 3 个周期,vaddpd 延迟 = 3 个周期。所有这些都是完全流水线的,吞吐量在本答案的其余部分讨论,因为理论上的最大吞吐量需要安排你的计算不会成为加法或乘法延迟的瓶颈。例如,使用多个累加器进行点积或其他减少。)无论如何,硬件 FMA 执行单元并不比 FP 乘法器或加法器复杂得多,你应该不要将其视为两个独立的操作。
如果您在源代码中写入 a*b + c,编译器可以将其收缩到 FMA 中,而不是在添加之前将 a*b 舍入为临时结果,具体取决于编译器选项(和默认值) ) 允许与否。
指令集扩展:AVX2,所以#SIMD = 256/64 = 8;
256/64 = 4,而不是 8。在 32 字节(256 位)SIMD 向量中,您可以容纳 4 个double-precision 元素。
每核心每时钟,Haswell/Broadwell 可以启动到:
- 两条 FP 数学指令 (FMA/MUL/ADD),最多可以添加一条。
- FMA 计为每个元素 2 个 FLOP,MUL/ADD 仅计为 1 个。
- 最多 32 字节宽的输入(例如 4 个双精度数或 8 个浮点数)