【问题标题】:FLOPS per cycle for sandy-bridge and haswell SSE2/AVX/AVX2沙桥和 haswell SSE2/AVX/AVX2 的每周期 FLOPS
【发布时间】:2013-03-17 08:32:46
【问题描述】:

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

这似乎在这里得到验证, How do I achieve the theoretical maximum of 4 FLOPs per cycle? ,和这里, Sandy-Bridge CPU specification.

但是下面的链接似乎表明 Sandy-bridge 每个内核每个周期可以执行 16 次翻转,而 Haswell 每个内核每个周期可以执行 32 次翻转 http://www.extremetech.com/computing/136219-intels-haswell-is-an-unprecedented-threat-to-nvidia-amd.

谁能给我解释一下?

编辑: 我现在明白为什么我会感到困惑了。我认为术语 FLOP 仅指单浮点 (SP)。我现在看到How do I achieve the theoretical maximum of 4 FLOPs per cycle? 的测试实际上是在双浮点 (DP) 上进行的,因此它们实现了 SSE 的 4 DP FLOP/周期和 AVX 的 8 DP FLOP/周期。在 SP 上重做这些测试会很有趣。

【问题讨论】:

  • 回应您的编辑:这些数字将是 DP 数字的两倍。这是因为 SIMD 指令的 SP 和 DP 版本的延迟和吞吐量是相同的。 (在某些情况下,SP 的延迟甚至更低。)
  • 我已根据我的理解将代码转换为使用 SP,并使用 Visual Studio 2012 对其进行编译。但是,我没有看到速度上的差异,并且总和报告了一个错误,所以我很可能需要更改更多代码。我必须回到这个话题。
  • 您需要将数字加倍,因为计数器假定为 DP。 (更改:48 * 1000 * iterations * tds * 248 * 1000 * iterations * tds * 4)此外,您需要更改重整化掩码以在 SP 上工作:uint64 iMASK = 0x800fffffffffffffull;
  • 4 由于每个 SSE 寄存器有四个 SP 浮点数。再次感谢。我还将重整化掩码更改为 unsigned int iMASK = 0x80fffffu。现在它起作用了,我像你说的那样得到了两次。

标签: cpu intel cpu-architecture avx flops


【解决方案1】:

以下是一些最新处理器微架构的理论最大 FLOP 计数(每个内核)以及如何实现它们的说明。

一般来说,要计算这一点,请查看 FMA 指令的吞吐量,例如在https://agner.org/optimize/ 或任何其他微基准测试结果上,乘以
(FMAs per clock) * (vector elements / instruction) * 2 (FLOPs / FMA).
请注意,在实际代码中实现这一点需要非常仔细的调整(如循环展开),缓存未命中率接近于零,并且在任何事情上都没有瓶颈else。现代 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 乘法

英特尔 Sandy Bridge/Ivy Bridge (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(融合乘加)指令
  • 32 SP FLOPs/cycle:两条 8 宽 FMA(融合乘加)指令
  • (使用 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 宽 FMA(融合乘加)指令
  • 与使用更窄的 256 位指令的计算吞吐量相同,但使用 AVX512 仍然可以提高速度,以实现更广泛的加载/存储、一些不在 FMA 单元上运行的向量操作(如按位操作)和更广泛的 shuffle。
  • (运行中的 512 位向量指令会关闭端口 1 上的向量 ALU。还 降低最大涡轮时钟速度,因此“周期”在性能计算中不是常数。 )

Intel Skylake-X/Skylake-EP/Cascade Lake/etc (AVX512F) 带有 2 个 FMA 单元:Xeon Gold/Platinum 和 i7/i9 高端桌面 (HEDT) 芯片。

  • 32 DP FLOPs/cycle:两条 8 宽 FMA(融合乘加)指令
  • 64 SP FLOPs/cycle:两条 16 宽 FMA(融合乘加)指令
  • (运行中的 512 位向量指令会关闭端口 1 上的向量 ALU。还会降低最大涡轮时钟速度。)

未来:英特尔Cooper Lake(Cascade Lake 的继任者)预计将引入Brain Float,这是一种用于神经网络工作负载的 float16 格式,支持实际的 SIMD 计算,这与当前仅支持的 F16C 扩展不同用于转换为 float32 的加载/存储。这应该会使 FLOP/周期吞吐量与相同硬件上的单精度相比翻倍。

当前的英特尔芯片仅在 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 Bulldozer/Piledriver/Steamroller/Excavator,每个模块(两个核心):

  • 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-wide AVX 加法每隔一个周期 + 8-wide AVX 乘法每隔一个周期


ARM

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 / 至强融核

英特尔至强融核(Knights Corner),每个内核:

  • 16 DP FLOPs/cycle:8-wide FMA per cycle
  • 32 SP FLOPs/cycle:每个周期 16-wide FMA

英特尔至强融核(Knights Corner),每个线程:

  • 8 DP FLOPs/cycle:8-wide FMA 每隔一个周期
  • 16 SP FLOPs/cycle:16-wide FMA 每隔一个周期

英特尔至强融核(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 数据的原因是这些内核在每个内核运行多个线程时具有更高的指令发出率。

【讨论】:

  • SSE2 中也添加了 DP 支持
  • Cortex-M0 和 M3 甚至没有 FPU,因此它们的 FLOPs/cycle 为零。即使在 M4 上,FPU 也是可选的。 Cortex-A8 可以使用 NEON 执行 2 SP FLOPs/cycle。双精度……嗯,VFP 在 A8 上没有流水线,所以它大约是 1/8 DP FLOPs/cycle。
  • @netvope 它们是每个模块的
  • 提供一些参考资料或说明如何获取此信息会有所帮助。
  • Skylake-X 配备 1 个或 2 个 AVX512 FMA 单元的配置...software.intel.com/en-us/forums/intel-isa-extensions/topic/…
【解决方案2】:

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

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

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

【讨论】:

  • 您不需要手动中断循环,一点编译器展开和乱序硬件(假设您没有依赖项)可以让您达到相当大的吞吐量瓶颈。再加上超线程,每个时钟 2 次操作变得非常必要。
  • @Leeor,也许您可​​以发布一些代码来显示这一点?使用 FMA 展开 10 次会给我最好的结果。在stackoverflow.com/questions/21090873/…查看我的回答
  • 大多数受计算约束(即受触发器约束)的 HPC 代码都会执行大量 FMA。根据我的经验,添加大量内容的地方受带宽限制,因此更多的添加吞吐量无济于事。
  • 最新一代的 Intel 具有更均衡的吞吐量。浮点加法、乘法和 FMA 的吞吐量均为每个时钟周期 2 条指令,延迟为 4。
猜你喜欢
  • 2021-09-21
  • 1970-01-01
  • 2017-08-31
  • 2019-03-15
  • 2020-02-29
  • 2021-01-14
  • 2014-06-23
  • 1970-01-01
相关资源
最近更新 更多