AMD Ryzen 3000中令人惊讶的新功能

2020-08-28 20:17:09

我刚刚测试完AMD Zen2CPU。结果在我的微体系结构手册和我的指令表https://www.agner.org/optimize/#manuals.中。我发现Zen2有一个我们以前从未见过的新的令人惊讶的功能:它可以镜像CPU内部内存操作数的值,这样就可以零延迟地访问它。此汇编代码显示了一个示例:当CPU识别出所有三条指令中的地址[RSI]相同时,它会将此地址的值镜像到临时内部寄存器中。这三条指令仅在2个时钟周期内执行,否则将需要15个时钟周期。它甚至可以跟踪堆栈上的地址,同时补偿推送、弹出、调用和返回指令中堆栈指针的变化。这在32位模式下非常有用,在这种模式下,函数参数被推送到堆栈上。一个简单的函数可以读取其参数,而无需等待值存储在堆栈上并再次读回。如果堆栈指针被任何其他指令修改或复制到帧指针,则这不起作用。因此,它不适用于设置堆栈帧的函数。这个机制只有在某些条件下才能工作。它必须使用通用寄存器,并且操作数大小必须是32位或64位。内存操作数必须使用指针和索引(可选)。它不适用于绝对地址或RIP相对地址。似乎在计算地址之前,CPU会假设内存操作数是否具有相同的地址。在出现指针别名的情况下,这可能会导致问题。如果上例中的第二条指令具有相同值的不同指针寄存器,则存在指针别名问题。CPU假设地址不同,因此eax的值直接转发到ebx而不加5。需要40个时钟周期才能恢复错误并重做正确的计算。然而,这是一个相当令人惊叹的功能。想象一下在不增加任何延迟的情况下在硬件中实现这一点有多复杂。我想知道为什么在任何AMD文档或宣传材料中都没有提到这个功能。至少,我在任何地方都找不到任何关于这件事的提法。AMD有一种他们称之为超级转发的东西,但这一定是其他东西,因为它只适用于浮点寄存器。Zen 2的其他有趣结果是:矢量执行单元和数据路径都从128位扩展到256位。典型的256位AVX指令使用单个微操作执行,而Zen 1会将其拆分成两个128位微操作。现在,256位矢量指令的吞吐量高达每个时钟周期两次浮点矢量加法和两次乘法。还有一个额外的内存AGU,这样它可以在每个时钟周期执行两次256位内存读取和一次256位写入。对于适合微操作高速缓存的循环,整数和向量指令混合的最大总吞吐量是5条指令或每个时钟6个微操作。不适合微操作高速缓存的长循环受到高达16字节或每个时钟4条指令的提取速率的限制。英特尔处理器也有类似的限制,这很可能是CPU密集型代码的瓶颈。所有缓存都很大,时钟频率很高,最多可以获得64个内核。总而言之,只要您的软件不使用AVX512指令集,这就是一个很有竞争力的CPU。软件市场对新指令集的接受通常很慢,所以我想AMD在新指令集和更长的向量寄存器的竞争中落后于英特尔是有经济意义的。