受到这个答案的启发
sandy-bridge 和 haswell SSE2/AVX/AVX2 每个周期的 FLOPS
对于 Sandy/Ivy Bridge、Broad/Haswell、Sky/Kaby Lake,可以在核心上发出的仅加载/加载和存储的数量是多少?同样有趣的是 AMD Bulldozer、Jaguar 和 Zen 的数量。
PS - 我知道由于缓存/内存带宽的原因,这可能不是一个可持续的速率,我只是询问问题。
基于以下信息:
建筑 | 负载 | 商店 | 256 位算作 2? |
---|---|---|---|
桑迪/常春藤桥 | 1 | 1 | 是的 |
桑迪/常春藤桥 | 2 | 0 | 是的 |
哈斯韦尔/布罗德韦尔 | 2 | 1 | 没有 |
天湖/卡比湖 | 2 | 1 | 没有 |
冰/虎湖 | 2 | 2 | 否(仅针对同一高速缓存行维持 2 个存储/时钟) |
桤木湖/蓝宝石 | 3 | 1 | 不,但吞吐量可能“有点少” |
桤木湖/蓝宝石 | 2 | 2 | 不,但吞吐量可能“有点少” |
推土机 | 1 | 1 | 是的 |
推土机 | 2 | 0 | 是的 |
捷豹 | 1 | 1 | 是的 |
禅1 | 1 | 1 | 是的 |
禅1 | 2 | 0 | 是的 |
禅2 | 2 | 1 | 没有 |
禅宗3/4 | 3 | 2 | 整数寄存器 |
禅宗3/4 | 2 | 1 | 不,但是处理任意宽度向量的管道更少 |
Sandy/Ivy:每个周期,2 次加载,或 1 次加载和 1 次存储。 256 位加载和存储计数加倍,但仅限于加载或存储本身 - 它仍然只有一个地址,因此 AGU 在下一个周期再次可用。通过混合一些 256b 操作,您仍然可以获得每个周期 2x 128b 加载和 1x 128b 存储。
Haswell/Broadwell:2 次加载和 一个存储,以及 256 位加载/存储不要算双倍。端口 7(存储 AGU)只能处理简单地址计算(基址+const,无索引),复杂情况将转到 p2/p3 并与负载竞争,简单情况无论如何可能会竞争,但至少不会有到.
Sky/Kaby:与Broadwell相同
Ice/Tiger Lake:每个时钟 2 次加载和 2 次存储,每个时钟具有完全独立的执行单元(存储地址 uops 不在加载端口上运行。)仅当存储到相同的缓存行。即 1/时钟写入 L1d 缓存,但写入可以提交两个存储缓冲区条目(如果它们位于同一行)。出于内存排序的原因,两个存储缓冲区条目必须是两个最旧的条目,因此交替存储到两个单独的数组无法从中受益,除非您可以展开。
Alder Lake / Sapphire Rapids:3 个装载和 1 个商店,或 2 个装载和 2 个商店。 Agner Fog 报告了高达 128 位大小的吞吐量,但 256 和 512 位加载/存储的吞吐量“略低”。对 L1d 的承诺可能会像 Ice Lake 一样受到每个时钟超过 1 个商店的限制。
推土机:2 次装载,或 1 次装载和 1 次储存。 256 位加载和存储计数加倍。
Jaguar:1 次加载或 1 次存储,256 位加载和存储计数加倍。到目前为止,这个列表中最差的一个,因为它是列表中唯一的低功耗 µarch。
Zen 1(第一代 Ryzen):2 次加载,或 1 次加载和 1 次存储。 256 位加载和存储计数加倍。
Zen 2(大多数 Ryzen 3xxx 和 4xxx,但也有一些 3xxx 型号只有 Zen+ 而不是 Zen 2)。
3 个 AGU(2 个加载/存储,1 个仅存储)。每个周期最多两次 256 位加载操作和一次 256 位存储操作。
Zen 3:标量整数 GPR 的负载吞吐量从 2 增加到 3。
对于标量整数 GPR,存储吞吐量从 1 增加到 2。 (Wikichip 错误地将其表述为“如果不是 256 位”,但是 https://uops.info/ 测试 仅确认 1/clock 向量存储,即使使用 128 位
vmovaps [mem], xmm
。
Zen 4:与 Zen 3 相比没有变化。AVX-512 512 位操作是单微操作,但占用加载和存储数据单元各 2 个周期,就像 Sandy/Ivy Bridge 处理 256 位加载的方式一样/店铺。 (与 512 位 ALU uop 相同,单个 uop 与 Zen 1 处理 256 位的方式不同。)