关于Zen 2核心性能分析和应用

电子说

1.3w人已加入

描述

在过去的一个月里,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 KB L1缓存。它由4路256组(4 ways of 256 sets)组成。Zen 2对L1进行了大改。组关联结构已经变为8路64组(8 ways of 64 sets),缓存大小减小到32 KB。如果没有AMD的更多细节,我们很难描述其他变化,更高的关联性也应该降低未命中率。AMD指出,通过减小指令缓存的大小,并利用节省下来的cache部分来实现一些其他组件,特别是BPU和OC,它们能够使得整体CPU从同等面积下的电路获得更高性能。顺便说一下,从处理器架构组成的角度来看,Zen 2现在和英特尔的Skylake和Sunny Cove是类似的。值得注意的是,一级指令高速缓存的TLB大小保持不变。它仍然是全相联型,深度为64条表项的buffer区,能够存储4 KB、2 MB和1 GB页面。

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

处理器

与取指操作产生的填充缓存行请求的同时,分支预测器和预取指器也可以发出其他操作的请求。这一点对于整个系统很重要,因为预取器能够利用指令的空间局部性以避免流水线停顿。这也是AMD在Zen2的另一努力改进之处。

处理器

也许是当下最好的预测器?

分支预测单元的作用是预测条件分支(跳转)的目标地址。换句话说,判断它是否跳转。这里的基本思想是通过对指令流路径的预判断执行,而不是停滞流水线直到跳转指令得到确切执行结果,所产生的长周期浪费。然而,这种预测必须得正确和巧妙地执行,错误的预测会导致更多的执行时间上浪费。当发生跳转时,将其跳转状态存储在BTB中,或不采用以便于对后续的分支指令进行跳或不跳的结果预测。诸如Zen之类的现代微处理器通过不仅将最后一个分支的历史状态而且是最后几个分支的历史状态存储在全局历史寄存器GHR中,以便分析跳转指令之间的相关性(例如,前一个分支指令发生跳转,那么下一个分支指令也很有可能发生跳转)。

处理器

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

另外,在Zen架构中,第一级L0 BTB中的查找是零延迟查找,而第一级产生的结果表在L1和L2 BTB中查找时会分别产生1个和4个时钟周期的流水线空泡操作。目前还不清楚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预测器的想法是,它试图找出哪个分支的历史数量最适合哪个分支,将最长的历史优先于较短的历史。

处理器

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

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

AMD表示,与之前的与前几代所采用的神经网络相比,新的分支预测单元显示出的预测的误差率比前几代产品下降30%。因为现代微处理器的预测精确度高达90%。与在Zen中的实现相比,这种错误预测率的大幅降低将直观得转化为IPC方面的提升。事实上,如此大的改进也是Zen2所宣称的重大改进的最主要体现。

处理器

改变现状

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

OC模式改进

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

当指令被解码时,它们被存储在Op缓存中。与L1缓存一样,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个宏指令。(ROB)这在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失调设置,avx指令集在跑分时会主动降频做的设置将会启动。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个核心中的任何一个的L2victim line填充,L2标签在L3中被复制。在Zen 2中,AMD将L3的大小增加了一倍,达到每个内核16 MiB-4 MB缓存分片(cache slice)。这对AMD的影响更明显,原因在于他们的chiplet设计。对于这一点,我们会在未来的文章中讨论。

处理器

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分