60

我对使用 Sandy-Bridge 和 Haswell 可以在每个核心每个周期完成多少次触发器感到困惑。据我了解,对于 SSE,对于 SSE,每个内核每个周期应该有 4 个触发器,对于 AVX/AVX2,每个内核每个周期应该是 8 个触发器。

这似乎在这里得到验证, 如何实现每个周期 4 次 FLOP 的理论最大值? ,这里是 Sandy-Bridge CPU 规范

然而,下面的链接似乎表明 Sandy-bridge 每个内核每个周期可以执行 16 次触发器,Haswell 每个内核每个周期可以执行 32 次触发器 http://www.extremetech.com/computing/136219-intels-haswell-is-an-unprecedented -威胁到 nvidia-amd

谁可以给我解释一下这个?

编辑:我现在明白为什么我感到困惑了。我认为术语 FLOP 仅指单浮点 (SP)。我现在看到如何实现每个周期 4 次 FLOP 的理论最大值的测试?实际上是在双浮点 (DP) 上,因此它们实现了 SSE 的 4 DP FLOP/周期和 AVX 的 8 DP FLOP/周期。在 SP 上重做这些测试会很有趣。

4

2 回答 2

121

以下是一些最新处理器微架构的理论最大 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 数据的原因是这些内核在每个内核运行多个线程时具有更高的指令发出率。

于 2013-03-27T11:31:13.600 回答
21

Haswell 的加法吞吐量低于乘法和 FMA。有两个乘法/FMA 单元,但只有一个 fp 加法单元。如果您的代码主要包含加法,那么您必须将加法替换为 FMA 指令,乘数为 1.0 以获得最大吞吐量。

Haswell 上 FMA 指令的延迟为 5,吞吐量为每时钟 2。这意味着您必须保持 10 个并行操作才能获得最大吞吐量。例如,如果您想添加一个很长的 fp 编号列表,则必须将其分成十个部分并使用十个累加器寄存器。

这确实是可能的,但是谁会为一个特定的处理器做出如此奇怪的优化呢?

于 2013-07-24T13:35:59.530 回答