我注意到 Zen2 上的一些 AVX 指令与它们的英特尔对应物相比,其 μops 成本极高。根据 μops 表:
VPGATHERDD | Skylake | Zen3 |
---|---|---|
延迟(时钟数) | [0;22] | [0;28] |
倒数 TP(测得) | 5.00 | 8.00 |
μops(测得) | 5 | 39 |
这些数字看起来像是可能影响聚集性能的因素。这个问题类似于一些旧的标量 vs 聚集问题,但那些问题更多地关注了英特尔,没有讨论到挖掘机 / Zen μops 聚集成本。也许是因为当时 AMD CPU 并不流行,但今天它更相关了。我找到的唯一解释这样一个巨大的差异的方法是一些随机评论声称 AMD CPU 中的聚集被微码化了。我在 Agner Fog 和 AMD 编程指南中都没有找到任何额外的解释。
我试图在 Zen3、Skylake 和 Broadwell 处理器上进行一些基准测试,以查看标量负载与聚集的比较情况。
Broadwell | Skylake | Zen3 |
---|---|---|
1x | 1x | 1x |
1.5-2.1x | 3.1-6x | 1x |
吞吐量差异应该使得英特尔方面的差异约为1.6倍(8/5)。有多少可以归因于μops的差异?
当与真实代码混合时,大μops成本会损害乱序执行吗?或者这是极不可能的,因为Zen处理器具有大μops缓存?是否有更好的基准测试?
*最初的基准测试是错误的;链接和表中的数字现已修正。
vmovdqu32 (m256, k, ymm)
,但由于某种原因,AVX1/2 的微码vmaskmovps/pd
和vpmaskmovd/q
仍然需要大量的 uops。不仅仅是将其与内部临时掩码进行比较并使用硬件支持。在看到vmaskmovps
的数字后,我认为可能没有有效的掩码存储的硬件支持。 - Peter Cordesvphaddd
需要4个uops,而vhaddps
只需要3个uops。在英特尔上,“hadd *”指令始终为3个uops,除非有一个内存源。(可能需要2个洗牌来提供垂直加法。) - Peter Cordes