在查看英特尔优化参考手册时,我注意到了以下部分:处理端口 5 压力。
它基本上表示 Sandy Bridge 微架构中的端口 5 包含混洗单元,这些单元经常成为进行大量混洗的代码中的性能瓶颈。
我的问题:这是否意味着端口 5 的 shuffle 瓶颈仅发生在 Sandy Bridge 上? Alder Lake 或其他架构怎么样?为什么只将shuffle执行单元调度到一个端口,这个单元有什么严格的限制吗?
此外,还有类似于 AVX2
vtbl1_s8
的 _mm256_shuffle_epi8
等 NEON shuffle 指令。 Neon for tbl 是否存在端口限制导致的性能瓶颈?
我认为 Neon 中存在一些端口瓶颈
tbl
。不过我没有找到相关文档。
自 Ice Lake 以来,英特尔在端口 1 上有另一个 shuffle 执行单元,可以处理一些(但不是全部)高达 256 位的 shuffle。 例如,它可以处理
shufps
,但不能处理 unpcklps
或 unpcklpd
,即使 unpcklpd
可以表示为具有右侧立即数的 shufps
。 (unpcklps
不能,除非两个输入都是同一个寄存器。)
AMD Zen 系列在多个端口上具有随机单元。 Zen 4 及更高版本的指令洗牌吞吐量通常与 Intel P 核相同或更好。 (Zen 1 将 256 位指令解码为至少 2 uops,而跨车道洗牌明显更差。出于某种原因,Zen 2 和 3 仍然将
vpermq ymm, ymm, i8
和 vpermd y,y,y
解码为 2 uops,但对于 vperm2i128
来说速度很快Zen 1 上是 8 uop。)
有关现代 x86 uarches 上的指令需要哪些端口的完整详细信息,请参阅 https://uops.info/,这些信息源自带有性能计数器的自动微基准测试(您可以通过单击表中的数字来查看) ;如果出现问题,您可以准确地看到指令序列以什么速度运行)。
https://agner.org/optimize/ 有一个微架构指南,描述了管道和指令表(手动编辑,因此偶尔会出现拼写错误,并且微基准测试不那么详尽,因此他不会显示不同输入的延迟差异到不同的输出)。
Cortex-A76。 我不知道有任何资源可以像 uops.info 对 x86 那样聚合该信息。
一些早期(且功耗较低)的 ARM Cortex 设计的tbl
吞吐量较低,但 Cortex-A76 对于 1 和 2 寄存器形式具有 2 个时钟吞吐量(具有 2 个周期延迟),在 V 管道上运行。 (3 个寄存器每 2 个周期吞吐量 1 个,4 个寄存器每 2/3 个周期吞吐量。)Cortex-A76 共有 8 个管道(执行端口):分支、3 个整数(包括 1 个可以处理多周期指令)、2 个 FP/ASIMD、2 个加载/存储。
https://chipsandcheese.com/p/arms-cortex-a53-tiny-but-important 看一下旧的 Cortex-A53,它用于许多 big.LITTLE 设计中的效率核心,并在低端 CPU 中单独使用。
https://chipsandcheese.com/p/arms-cortex-a710-having-by-default 有 Cortex-A710 的框图