AMD逆袭的新武器:Zen 2核心详解

2019-07-11 06:11发布

来源:本文由公众号半导体行业观察(ID:icbank)翻译自「wikichip」,作者David Schor,谢谢。

在过去的一个月里,AMD发布了许多公告。AMD正在准备推出他们的第三代Ryzen台式机处理器。这些处理器将利用AMD最新的微架构Zen 2,采用台积电领先的7nm工艺制造。

我们先来看看核心的微架构改进。

Zen 2

新芯片的核心是Zen 2。这一核心将用于AMD的移动APU、高性能台式机处理器和数据中心芯片。

Zen 2是继Zen之后的下一个主要微架构。随着Zen 2的推出,AMD承诺分别基于Cinebench 1T和Spec2006进行13-15%的IPC改进。要了解他们如何能够提取IPC的收益,我们需要仔细研究基础微架构的变化。

前端

前端的很大一部分已经进行了重新设计。在没有标识分支的典型情况下,从下一个64B块的地址开始从第一级高速缓存提取指令。Zen最初提供了一个64 KiB L1缓存。它由4路256组(4 ways of 256 sets)组成。Zen 2对L1进行了大改。关联性已经变为8路64组(8 ways of 64 sets),缓存大小减半到32 KiB。如果没有AMD的更多细节,我们很难描述其他变化,更高的关联性也应该降低未命中率。AMD指出,通过减小指令缓存的大小,并利用该区域来增加一些其他组件,特别是BPU和OC,它们能够从每单位面积的硅中获得更好的性能。顺便说一下,从组织的角度来看,Zen 2现在和英特尔的Skylake和Sunny Cove是一样的。值得注意的是,一级指令高速缓存转换后备缓冲区保持不变。它仍然是完全关联的64条目深度缓冲区,能够存储4 KiB、2 MIB和1 GiB页面。

高速缓存线保持64字节,每个周期可以获取32个字节。在不太常见的高速缓存未命中的情况下,L1将为包含未命中地址的线生成填充请求。每个周期最多32个字节可以从共享L2传输到指令高速缓存。

除了由提取生成的填充请求外,分支预测器和预提取器还可以发出额外的请求。这一点很重要,因为预取器能够利用空间局部性以避免停顿。这是AMD花了很多努力改进的另一个领域。

最好的预测器会赢吗?

分支预测单元的目标是预测条件分支的下一个地址。换句话说,猜测它是否被占用了。这里的基本思想是猜测指令流的路径,而不是通过停止流水线直到最终知道路径来浪费周期。然而,这必须明智地进行,因为糟糕的预测会直接导致工作的浪费。当发生分支时,将其存储在分支目标缓冲区中,以便可以更容易地确定和采用(或不采用)后续分支。诸如Zen之类的现代微处理器通过不仅将最后一个分支的历史而是最后几个分支的历史存储在全局历史寄存器(GHR)中,以便提取分支之间的相关性(例如,如果采用较早的分支,则可能也将采用下一个分支),从而进一步实现这一点。

Zen上的BTB是一个三级缓存——每个缓存都具有更高的容量,但代价是更长的延迟。Zen 2保持结构不变,但几乎将第二级和第三级BTB中的条目数量增加了一倍,分别从256和4K增加到512和7K条目。

顺便说一句,在Zen中,第一级(L0)BTB中的查找是零延迟查找,而L1和L2 BTB中的后续表查找分别导致一个和四个冒泡。目前还不清楚Zen 2是否改变了这些成本。

Zen采用了一种称为散列感知器的动态预测器。利用人工智能的大肆宣传,营销人员喜欢将其称为神经网络预测器。感知器是最简单的机器学习形式,与其他一些机器学习算法相比,感知器本身更易于实现硬件。它们往往也比gshare之类的预测器更准确,但它们的实现确实更复杂。Zen上的实际实现尚不清楚,但我们至少可以描述一个简单的实现是什么样子的。当处理器遇到条件分支时,它的地址用于从感知器表中获取感知器。对于我们来说,感知器只不过是权重向量。这些权重表示历史分支的结果与预测的分支之间的相关性。例如,考虑以下三种模式:“TTN”、“NTN”和“NNN”。如果这三个模式都导致下一个分支没被采用,那么或许我们可以说前两个分支之间没有相关性,并为它们分配很小的权重。先前分支的结果是从全局历史寄存器中获取的。寄存器中的各个位用作输入。输出值是计算出的权重和先前分支历史的点积。在这种情况下,负输出可能意味着“不采取”,而其他值可能被预测为“采取”。值得一提的是,分支历史之外的其他输入也可以用于推理相关性,尽管不知道是否有现实世界的实现利用了这一想法。Zen的实现可能要复杂得多,或许是对不同类型的历史进行采样。尽管如此,它的工作方式仍然是一样的。

鉴于Zen流水线的长度和宽度,错误的预测可能导致超过100个槽被刷新。这直接导致性能的损失。Zen 2保留了散列感知器预测器,但增加了第二层新的TAGE预测器。这个预测器是由Andre Seznec在2006年首次提出的,它是对Michaud的PPM类预测器的改进。TAGE预报器赢得了上一届分支预测(CBP)大赛(2006-2016)的全部四项冠军。TAGE的理念是,程序中的不同分支需要不同的历史长度。换句话说,对于某些分支,非常小的历史记录效果最好。例如1位预测器:如果某一分支以前采用过,它将再次采用。不同的分支可能依赖于先前的分支,因此需要更长的多位历史以充分预测它是否将被采用。标记几何历史长度(TAGE)预测器由多个全局历史表组成,这些表使用不同长度的全局历史寄存器索引,以便涵盖所有这些情况。寄存器使用的长度形成了几何级数,因此得名。

使用TAGE预测器的想法是,它试图找出哪个分支的历史数量最适合哪个分支,将最长的历史优先于较短的历史。

这种多预测器方案类似于分支目标缓冲区的分层。第一级预测器是感知器,用于快速查找(例如,单周期分辨率)。第二级TAGE预测器是一个复杂的预测器,需要很多周期才能完成,因此必须在简单预测器之上分层。换句话说,L2预测器速度较慢,但更好,因此用于对较快和较不准确预测器的结果进行双重检查。如果L2预测器与L1预测器不同,则当TAGE预测器覆盖感知器预测器时,会发生少量刷新,提取返回并使用L2预测,因为L2预测器被认为是更准确的预测。

除了使用TAGE预测器以外,AMD没有透露更多的内容。值得指出的是,至少就字面而言,TAGE预测器不再被认为是最好的预测器。之后,Seznec在TAGE预测器上进行了改进,增加了统计校正器(TAGE-SC),后来又增加了循环预测器(TAGE-SC-L)。替代方案包括BATAGE预测器。尽管如此,我们得到的结论是,有更多的机会找到更好的分支预测器,这是一个非常活跃的研究领域。

AMD表示,与之前的感知器相比,新的分支预测单元显示出的误预测率目标低30%。因为现代微处理器的精确度高达90%。与在Zen中的实现相比,这种错误预测率的大幅降低将直接转化为更高的IPC。事实上,如此大的改进可以单独占据Zen 2声称的性能提升的很大一部分。

改变现状

关于AMD的这一代芯片,我们注意到的一件事是现状的变化。从历史上看,英特尔在设计最先进、性能最高的预测器方面投入了大量资源。另一方面,AMD往往落后于一个“足够好”的更保守的预测器。随着Zen的成功,Zen 2的情况变得有所不同。虽然AMD正在摘取所有唾手可得的成果,但它们现在正直接瞄准英特尔,而英特尔一直拥有无可争辩的领先优势。换句话说,AMD似乎对他们目前的核心设计充满信心,可以腾出更多的资源来解决次要的缺陷。

OC模式改进

Zen 2和Zen一样,有两种主要的操作模式:IC(指令缓存)模式和OC(op缓存)模式。对于熟悉英特尔术语的人来说,这些术语类似于英特尔的DSB和MITE路径。在Zen 2中,IC模式路径本身基本保持不变,本文不再讨论。另一方面,OC模式得到了增强。

当指令被解码时,它们被存储在Op缓存中。与L1I缓存一样,OC也对64字节的缓存行进行操作。这使你能够在每个条目中存储多达8个宏操作(不用说,64b imm/etc将占用两个槽)。在Zen中,OC被组织为8路32组(8 ways with 32 sets),这意味着总容量可达2048 MOP。在Zen 2中,AMD将容量翻了一番,达到4096 MOP。据推测,这是通过将组的数量增加一倍来实现的。顺便说一下,启用SMT后,每个线程的容量只有原来的一半。这意味着在Zen 2上,每个线程的有效容量都等于Zen 1的整个OP缓存。

一旦在OC模式下操作,流水线将保持在这种模式,直到读取地址发生未命中为止。在OC模式下,前端的其余部分为时钟门控。假设所有其他条件都相同,较大的OC应允许Zen 2保持在OC模式以获得更长的指令流,从而提高IPC吞吐量,同时降低前端的功耗。与Zen一样,OC模式能够在每个周期向后端发送多达8条指令,是IC模式带宽的两倍。值得注意的是,由于重新排序缓冲区仍然只能处理每个周期最多6个MOP,因此OP缓存上的更高吞吐量仅有助于确保op队列保持填充状态。

后端

从调度中,宏操作被发送到整数集群或浮点单元。退出控制单元(RCU;在其他设计中也称为ROB)负责跟踪所有未完成的操作。在Zen和Zen 2中,RCU都执行完整的宏操作,每个周期最多可以重命名6个MOP,可以退出8个MOP。Zen上的重新排序缓冲区能够跟踪正在进行的192个宏操作。这在Zen 2上增加了大约15%,达到了224个。这与Skylake上的重新排序缓冲区大小相同。

与Bulldozer一样,Zen和Zen 2都有三种指令分类类型:FastPath Single、FastPath Double和VectorPath(又名Microcode)。FastPath Single表示一条指令由一个宏操作组成,而FastPath Double表示一条指令由两个宏操作组成。VectorPath意味着两个以上的宏操作(例如REP MOV)。当宏操作到达调度器时,在重命名/映射之后,宏操作被分解为微操作。一般来说,自Zen以来,大多数指令都是转化为FastPath Single密集宏操作。随着AVX2的变化,这一点看起来更加真实。

作者注:自从引入Zen以来,AMD不再努力消除x86指令、宏操作和微操作之间的歧义。此外,再加上充满错误的手册,这使得正确描述流水线变得极其困难。尽管如此,WikiChip仍然坚持描述尽可能精确的实现模型。

整数

从调度开始,每个周期最多可以将6个MOPS调度到整数执行集群。在这里,MOP被分解为组成它们的微操作。例如,FastPath Single指令(例如从内存做加法reg,[mem])将被分解为2个微操作:加载和加法。一般来说,μops可以分为ALU和加载/存储两种类型。μops将根据其类别发送到适当的调度程序。像Zen一样,Zen 2有4个ALU调度器。这些调度器现在有两个更深的条目,这意味着它们可以略微更深地排队进入无序窗口。理论上,从早期操作数可用性中提取一些额外并行性的可能性很小。加载/存储μops将在AGU调度程序中排队。在Zen中,有两个AGU调度器,每个调度器的深度为14个条目。在Zen 2中,这些调度器被合并成一个包含28个条目的大型调度器。如你所见,尽管他们选择添加另一个AGU,但条目总数并没有改变。

调度器将μops排队,同时跟踪相关性和操作数可用性。一旦准备就绪,就会发送μops以供执行。每个调度器每个周期每个流水线可以发送一个μop。就像在Zen中一样,有4个ALU。Zen 2引入了另一个AGU,所以现在有3个。我们将在后面的一节中对此进行详细讨论。

浮点

从调度开始,每个周期最多可以向浮点单元发送4个MOP。这里MOP被分解为组成它们的微操作,这些微操作在非调度等待缓冲器处排队,该缓冲器可以提前启动存储器请求。最后,μops在36条目调度队列中排队等待执行。大多数浮点集群都没有改变,包括调度器、它们的大小和执行流水线。此外还有4个执行流水线。

Zen 2最大的变化是流水线的宽度。Zen、Zen+和Zen 2都支持FMA和AVX2。在Zen 2之前,256位指令被解码为FastPath Double,产生两个MOP,每个最终都被分解成两个μop。这不仅消耗了额外的资源,而且意味着256位向量的吞吐量是128位向量的吞吐量的一半。Zen 2拓宽了整个FPU数据路径。现在每个流水线都是256位宽。这大概意味着所有那些256位指令都将解码为FastPath Single,生成单个MOP并提高整个有效吞吐量。熟悉英特尔AVX2的人会知道,对于AVX2繁重的工作负载,当处于turbo模式时,由于功耗较高,AVX2偏移将会启动。Zen 2本身没有类似的偏移,但你可能会注意到,作为AMD Precision Boost 2的一部分的节流,它控制着温度和电流,并确保平台功率不会过高。

值得一提的是,现在两个FMA单元都是256位宽,每个Zen 2内核的总FLOP是16个双精度FLOP /周期。这意味着他们已经与Haswell、Broadwell,以及所有英特尔主流客户端处理器达到了同等水平。但是,Cascade Lake每个周期能够进行32次双精度浮点运算。

请注意,目前AMD不支持AVX512。然而,AMD扩展整个浮点单元为方便地支持AVX512作为FastPath Double铺平了道路,就像他们最初对AVX2所做的那样。虽然并非所有这些都是微不足道的补充,但是期望第一个实现使用较窄的流水线(例如256位)实现并非不合理。就像在Zen和Zen+上实现AVX2一样,以一半的吞吐量运行。

内存子系统

内存子系统在Zen 2上得到了增强。L2数据TLB现在增加了512个条目,并且通过2M页面粉碎(2M page smashing)对1G页面有了新的支持。AMD表示,他们能够从L2 TLB访问中节省一些周期。

在整数集群方面,AMD增加了一个新的AGU单元。与其他两个单元不同的是,这个单元专门用于存储。换句话说,加载μops可以在AGU0和AGU1上执行,而存储可以发送到三个单元中的任何一个。

更重要的是,为了适应FPU单元的扩展,数据高速缓存的内存带宽也增加了一倍。Zen有一个双端口数据缓存。它能够执行两次读取或每个周期执行一次读取和一次写入。以前,两个端口都是128位的。Zen 2现在能够执行完整的256位存储和加载。将带宽加倍到64字节将对依赖于AVX2或复制/流任务的一类工作负载产生积极影响。请注意,L2带宽仍为32B,L3也是如此。

稍微超出核心的话题是三级缓存。L3支持L2缓存的32B/周期带宽。此缓存是牺牲缓存。它由来自CCX的4个核心中的任何一个的L2牺牲线填充,L2标签在L3中被复制。在Zen 2中,AMD将L3的大小增加了一倍,达到每个内核16 MiB-4 MiB缓存分片(cache slice)。这对AMD的影响更明显,原因在于他们的chiplet设计。对于这一点,我们会在未来的文章中讨论。

**点击文末阅读原文,可阅读英文原文。

*免责声明:本文由作者原创。文章内容系作者个人观点,半导体行业观察转载仅为了传达一种不同的观点,不代表半导体行业观察对该观点赞同或支持,如果有任何异议,欢迎联系半导体行业观察。

今天是《半导体行业观察》为您分享的第2001期内容,欢迎关注

半导体第一垂直媒体

实时 专业 原创 深度

文章来源: https://www.toutiao.com/group/6711837101492535811/