对于 32 位精度的 fp,Zen 4 内核每个周期有 48 个触发器吗?

问题描述 投票:0回答:1

由于 amd zen 4 对矢量数据只有 256 位宽的操作,下图来自 chipsandcheese 的 Zen 4 文章 显示了 6 个 FP 流水线(4 个 ALU 和 2 个内存):

每个 FMA 做 1 次乘法和 1 次加法,而 fadd 只做 1 次加法。那么这是否意味着理论上它总共可以进行 2 次乘法和 4 次加法 = 6 次 256 位运算?

假设所有 4adds 和 2 muls 可以在同一周期内发出,这是否意味着每个周期计算 256 位(或仅 8 个 32 位精度的浮点数)x 6 = 48 个元素(或每 GHz 48 gflops/s)?

假设所有操作数都在寄存器中,应该有足够的带宽将数据传输到 fpu(L1 带宽表示每个周期 2x256 位用于读取只够每个周期 8 个触发器,但寄存器必须快得多),但 fpu 吞吐量没有清楚地显示出来。

这与英特尔 11/12/13 代相比如何?例如,一些工作站 xeons 有 2x fpu,每个 512 位,但没有专用的“添加”?比较具有不同比率的 muls 和 adds 的 cpu 是否公平?看起来 amd 更好:

d += a * b + c;
// or
d += a * b;
e += c;

虽然英特尔在以下方面更好:

d = a * b + c;
// or
d+=a*b;

每 gflops。英特尔的触发器值看起来更适合矩阵乘法和混合。对于链式矩阵加法和乘法以及带有浮点累加器和矩阵乘法的某些循环,AMD 的触发器值看起来更好。

那么在进行矩阵乘法时,zen 4 是否有效地每个周期 32 个触发器?

performance x86-64 cpu-architecture avx2 amd-processor
1个回答
1
投票

是的,如果您在同一循环中使用 adds 和 FMA,Zen 4 上的理论最大吞吐量为 48 FLOP / cycle。


AFAIK,Zen 4 可以让 FMA 和两个 FP-ADD 单元同时忙碌,所以是的,每个周期有 2 个向量 FMA 和 2 个向量

vaddps
。所以这是 6 倍矢量宽度的 FLOP。但是,将其称为在同一周期内发出(并分派给执行单元)的“4adds 和 2 muls”是没有意义的,因为 CPU 将它们视为 2 个 FMA 和 2 个 ADD 操作,而不是 6 个单独的 uops。

那么在进行矩阵乘法时,zen 4 是否有效地每个周期 32 个触发器?

是的,标准的 matmal 是所有 FMA,对于额外的 FP-add 吞吐量几乎没有用处。

也许一些使用 Strassen 算法 的大型矩阵乘法会导致每次乘法加法超过 1 次的工作负载,如果您可以安排它使得加法工作与乘法重叠。

或者可能在同一物理核心上运行另一个线程来执行添加工作,如果您可以安排它而不会通过竞争 L1d 缓存占用空间和带宽而使事情变得更糟。由于这个原因,HPC 工作负载有时会因 SMT / 超线程而产生负面影响,但部分原因是经过良好调优的单线程可以使用来自单核的所有 FP 吞吐量。但如果 Zen 4 不是这种情况,那么理论上还有一些收益空间。

但是,这将要求您的 FMA 代码每个 FMA 需要少于 1 次加载,否则如果子矩阵添加线程尝试加载+加载+添加+存储,则加载/存储 uops 将成为瓶颈-乘法线程每个时钟执行 2 个负载 + 2 个 FMA。


例如,一些工作站 xeons 有 2x fpu,每个 512 位,但没有专用的“添加”?

是的,如果您足够好地优化您的代码(例如,在加载+存储或 FMA 延迟方面没有瓶颈),具有第二个 512 位 FMA 单元的英特尔 CPU(如某些至强可扩展处理器)可以维持每个时钟 2x 512 位 FMA,这样就可以得到 2x 16 单精度 FMA = 64 FLOP/周期。

Alder Lake / Sapphire Rapids 为 FP-add 重新添加了单独的执行单元,但它们与 FMA 单元位于相同的ports 上,因此好处是对于单独

vaddps
延迟瓶颈的事物的延迟较低/
vaddpd
,就像在 Haswell 中一样。 (但不像 Haswell,有两个,所以吞吐量还是 2/clock。)

© www.soinside.com 2019 - 2024. All rights reserved.