FP 值上的 Shuffle / blend 不被视为 FLOP。它们只是在不纯粹的“垂直”问题上使用 SIMD 的开销,或者对于您使用混合无分支进行的分支问题。
FP AND/OR/XOR 也不是。andps
您可以尝试使用( )来证明计算 FP 绝对值的合理性_mm_and_ps
,但通常不计算在内。FP abs 不需要查看指数/有效数,或标准化结果,或任何使 FP 执行单元变得昂贵的事情。绝对 (AND) / 符号翻转 (XOR) 或负数 (OR) 是微不足道的按位运算。
FMA 通常被计为两个浮点运算(mul 和 add),即使它是与 SIMD FP add 或 mul 具有相同(或相似)性能的单个指令。raw 的瓶颈最重要的问题FLOP/s
是 matmul,它确实需要 mul 和 add 的相等混合,并且可以完美地利用 FMA。
所以 Haswell 核心的 FLOP/s 是
- 它的 SIMD 向量宽度(
float
每个向量 8 个元素)
- 每个时钟乘以 SIMD FMA (2)
- 每个 FMA 的 FLOP 倍数 (2)
- 倍时钟速度(在最大化两个 FMA 单元的同时它可以维持的最大单核涡轮增压;长期取决于冷却,短期仅取决于功率限制)。
对于整个 CPU,而不仅仅是单个内核:乘以内核数量并使用所有内核繁忙时的最大持续时钟速度,通常低于完全具有 Turbo 的 CPU 上的单核 turbo。)
英特尔和其他 CPU 供应商没有考虑到他们的 CPU 还可以支持每个时钟vandps
并行 2vfma132ps
条指令的事实,因为 FP abs 并不是一个困难的操作。
另请参阅如何实现每个周期 4 次 FLOP 的理论最大值?. (在现代 CPU 上实际上超过 4 个:P)
如果您有很多其他开销占用前端带宽或造成其他瓶颈,则无法实现峰值 FLOPS(每秒 FP 操作数或 FLOP/s)。该指标只是您在直线运行时可以做的原始数学量,而不是针对任何特定的实际问题。
尽管人们会认为如果理论上的峰值触发器比仔细手动调整的 matmul 或 Mandelbrot 所能达到的高得多,即使对于编译时间恒定的问题大小也是如此。例如,如果前端无法跟上任何存储以及 FMA 的速度。例如,如果 Haswell 有四个 FMA 执行单元,那么如果实际上每条指令都是 FMA,它只能维持最大 FLOP。内存源操作数可以为负载进行微融合,但在不影响吞吐量的情况下没有存储空间。
英特尔甚至没有 3 个 FMA 单元的原因是大多数实际代码很难使 2 个 FMA 单元饱和,尤其是只有 2 个加载端口和 1 个存储端口。它们几乎一直都被浪费了,而 256 位 FMA 单元需要大量晶体管。
(Ice Lake 将管道的发布/重命名阶段扩大到 5 uop/时钟,但也使用 AVX-512 将 SIMD 执行单元扩大到 512 位,而不是添加第三个 256 位 FMA 单元。它有 2 个/时钟负载和2 个/clock 存储,尽管存储吞吐量仅对 32 字节或更窄存储的 L1d 缓存可持续,而不是 64 字节。)