中国龙芯3A5000与性能计数器评测

处理器/DSP

891人已加入

描述

  龙芯的3A5000代表了中国国内的另一项CPU努力。它实现了四个 LA464 内核,面向从台式机到服务器再到嵌入式应用程序的所有应用。就像我们之前介绍的兆信KX-6640MA和Phytium D2000一样,龙芯的芯片以低时钟速度运行。但与其他中国芯片不同的是,龙芯使用的是基于MIPS的ISA。之前的龙芯芯片兼容MIPS64,但该公司改用名为Loongarch的ISA。Loongarch共享MIPS的大部分语义,但使用不同的指令编码。龙芯还扩展了ISA以支持256位矢量执行。

  我们将在这里做一些简短的基准测试。这样做的目的不是测试大量应用程序以提供全面的性能图。Phoronix已经有一些结果,以防您想知道CPU通常位于何处。相反,我们正在运行几个测试,并使用我们可用的少量性能计数器来分析它们。我们将使用这些数据来帮助我们分析龙芯的架构。

  为了进行比较,我们将使用AMD的Zen 1架构,因为一些网站认为3A5000可能与Zen 1相当。泰坦尼克号友好地设置了具有双通道DDR7-1800的Ryzen 4X系统2400-1。Ampere Altra,以来自Oracle云的免费四核实例的形式,也将在这里展示。Neoverse N3内核可能与5000A《》中的内核更具可比性,因为它们同样不会达到高时钟速度。

  高级性能

  7-Zip是一个高效的压缩程序,我们看到压缩从分析Firefox编译中生成的巨大文件需要多长时间。执行的指令流几乎完全由标量整数运算组成。此处的结果无法与此站点上以前的结果直接比较,因为我们这次指定了 16 个线程。尽管我们将其限制为四个内核,但运行更多线程可以提高利用率和性能。

  龙芯处理器

  3A5000在绝对性能上无法与Zen 1相提并论。但是,如果我们不让 Zen 1 在一个内核中使用两个 SMT 线程,则每个时钟的性能具有竞争力。龙芯的实际性能更接近四核安培Altra设置。但即使在那里,它的表现也大大优于。同样,每个时钟的性能很接近,但 2.5 GHz 是一个非常低的时钟速度,即使对于不优先考虑单线程性能的服务器芯片也是如此。

  视频编码

  libx264 是一个用于处理 H264 编解码器的免费软件库。尽管H264相当古老,但由于广泛的硬件解码支持和H265等较新编解码器的许可问题,H《》仍然很受欢迎。在这里,我们正在转码《守望先锋》游戏玩法的短片,使用“非常慢”预设来优先考虑质量。毕竟,如果您不关心质量并且想要最快的编码,您只需使用 GPU 的硬件编码器。

龙芯处理器

  一些从Loongarch libx264中反汇编的代码,显示了使用“xr”256位LASX矢量寄存器,以及“vr”256位LSX寄存器

  此测试中执行的指令流包含高百分比的向量指令。Loongson使用内部函数在其libx264的分布式版本中添加了LSX和LASX支持。这非常好,因为尝试仅使用编译器生成的代码进行视频编码或其他计算繁重的任务将导致性能极差。

  

龙芯处理器

  不幸的是,性能并不出色。依赖纯 C 代码通常会导致性能降低一个数量级。值得庆幸的是,龙芯避免了这种情况。但3A5000与Zen 1相比表现不佳。它也无法与四核安培Altra相匹配。考虑到这两个芯片都有128位执行单元,这是一个糟糕的表现。至少在支持 AVX2 的 x86 芯片上,此测试中执行的指令中有 10% 以上是 256 位的。Zen 1确实支持AVX2,但将256位指令解码为两个微操作。安培Altra当然仅限于128位NEON指令。Zen 1和Neoverse N1都不以强大的矢量性能而闻名,但都击败了3A5000。

  指令计数和 IPC

  性能计数器让我们跟踪很多事件,其中最重要的事件之一是停用指令的数量。在无序执行的 CPU 中,指令停用是指内核提交指令的结果并使其可见(换句话说,已完成执行并通过所有必需的检查)。我们在这里不是使用熟悉的 ISA 测试 CPU。如果ISA有影响,一个迹象是指令计数的巨大差异。

  

龙芯处理器

  使用 7-Zip,指令数差异小于 5%。很好。没有人会执行更多的指令来完成工作。

  

龙芯处理器

  IPC方面,龙芯做得相当不错。IPC 与每时钟性能不同,尤其是在使用不同的 ISA 或 ISA 扩展时。但在此压缩基准测试中,指令计数具有可比性,因此 IPC 与每个时钟的性能密切相关。在这种情况下,3A5000的主要弱点归结为其非常低的时钟速度。

  

龙芯处理器

  libx264 是一个不同的故事。尽管有 LAVX 支持,但 3A5000 必须处理 12% 到 23% 的指令才能完成相同的工作。ISA 不仅仅是扩展,而不仅仅是矢量宽度。也许LAVX缺少NEON和AVX2的一些专业指令。我们没有完整的LVX和LAVX指令列表,所以这只是一个猜测。

  

龙芯处理器

  同样,龙芯的IPC相当不错。但与 7-Zip 机箱不同的是,3A5000 执行了更多指令来完成工作。这意味着每个时钟的性能明显低于 Zen。

  前端:分支预测

  分支预测的准确性很重要。

  

龙芯处理器

  所有三个测试的 CPU 的预测准确性非常相似。即使是 Zen 1 在加载两个 SMT 线程时也不会受到太大影响。但是,3A5000 每条指令遭受的误预测更多,这意味着它比这里的其他 CPU 更容易遭受错误预测处罚。虽然它的分支预测器似乎做得很好,但 Loongarch 指令流的 17.7% 由分支组成,而 x15-1 为 86.64%,16 位 ARM 为 1.64%。

  

龙芯处理器

  在视频编码测试中,龙芯稍稍落后。Zen 1和Neoverse N1的分支预测因子在此测试中表现更好,尽管差距并不大。在精度方面,当AMD的核心必须处理两个线程时,3A5000接近Zen 1。龙芯确实有相当的每条指令的错误预测率,但这有点红鲱鱼。3A5000执行的指令比Zen 1多得多,以完成工作。所以,这意味着龙芯正在处理分支之间的更多指令。所有三个CPU的执行分支计数相差不到10%(尽管有趣的是,龙芯的执行分支数最高,为1.2万亿,而Zen 1和Ampere Altra分别为1.1和16.1万亿)。

  前端:指令提取

  3A5000 具有 64 KB、4 路设置关联 L1 指令缓存,有助于加快指令交付速度。Neoverse N1和Zen 1也有不错的64 KB L1指令缓存。在7-Zip上,它足以容纳“热”指令足迹。事实上,在此测试中,Zen 1 的微操作缓存提供了管道微操作的 85% 以上,这表明 7-Zip 的指令占用空间非常小。

  龙芯处理器

  在所有三个经过测试的 CPU 中,每条指令的未命中数都非常低。对于龙芯来说,它特别低,这很好,因为3A5000在必须从L2获取代码时就没有那么好了。但是对于每个人低于 1 MPKI 的人来说,这无论如何都不是一个很大的因素。

龙芯处理器

  libx264 也有很高的 L1i 命中率,尽管我们看到所有三个 CPU 上的 L1i 未命中率更高。龙芯现在遭受的痛苦更大,尽管2 MPKI仍然不是特别令人担忧。

  后端:L1D 命中率

  这里测试的三个CPU在数据方面有更多的差异。AMD 的 Zen 架构具有相对较小的 32 KB、8 路集关联 L1D。龙芯的3A5000和Neoverse N1都具有更大的64 KB,4路L1D。在7-Zip中,龙芯的L1D表现出人意料地差。根据性能计数器,L1D 命中率要低得多。Neoverse N1 具有最佳的 L1D 命中率,即使具有类似的缓存几何形状。N1 也击败了 Zen 1 的 L1D 命中率,因此关联性较小的 L1D 应该更好。也许龙芯没有一个好的替换策略,或者经常积极地预取和踢出有用的数据。

  

龙芯处理器

  对于 7-Zip,每条指令的未命中数在很大程度上讲述了同样的故事,因为执行的指令计数相似。

  龙芯的L1D遭遇了很多失误。在libx264中,龙芯的表现稍好一些。L1D命中率仍然不是它应该考虑其容量优势的地方,它仍然无法赶上Zen。但是,这也不太远。

  

龙芯处理器

  按照指令,龙松没有遭受太多的失误。但这主要是CPU在此工作负载中执行更多与计算相关的指令的迹象,这意味着内存访问代表较少的已执行指令流。这也意味着L1D失误的影响较小,因为内核必须通过更多的数学指令来阻碍。禅宗的情况正好相反。

  二级和三级缓存

  通常,CPU 为其 L1 缓存中的绝大多数访问提供服务。但是DRAM访问非常慢,以至于他们需要较低级别的缓存。最后一级缓存 (L3) 的容量在兆字节范围内,因此速度足够慢,以至于中级缓存 (L2) 可以带来性能优势。龙芯有一个256 KB的二级缓存和一个不错的2 MB三级缓存。Zen 在四核集群中具有较大的 16 KB L3,但较小的 512 MB L2。Ampere Altra 每个内核使用非常好的 8 MB 二级缓存,但在 3 个内核之间共享 1 MB 三级缓存。

  L3 缓存的性能计数器在 Ampere Altra 上似乎无法正常工作。它们显示的 L3 补充比对 L3 的请求多,这意味着 L3 的命中率为负。这没有意义,所以我们从0%开始图形比例,根本不会谈论Ampere Altra的L3。

  

龙芯处理器

  在7-Zip中,龙芯的16 MB L3具有相当不错的命中率,并且可能在3A5000的每时钟性能中发挥作用。龙芯也看到了非常好的L2命中率,特别是考虑到它的小尺寸。但这不一定是一件好事。L2命中率很高,主要是因为L1D遭受的失误比应有的多。

  

龙芯处理器

  查看每条指令的缓存未命中数可以证明这一点。正如预期的那样,龙芯的 256 KB L2 每条指令的失误次数比 Zen 的 512 KB L2 多。我们还可以将高 L3 命中率归因于大量的 L2 未命中。龙芯似乎确实比Zen遭受了更多的L3失误,但这可能是因为我在Zen上使用了L1D需求填充的事件。在 Loongson 上,我使用的是 perf 中定义的 LLC-load-misses 事件。Loongson 没有记录 3A5000 的性能监控事件,因此我不知道该性能事件是否包括预取的未命中。

  

龙芯处理器

  libx264 似乎具有更大的数据占用空间。我们已经看到 L1D 缓存遭受了更多的失误,而较低级别的缓存同样不如 7-Zip 有效。Neoverse N1的大L1绝对有助于它。Zen 1的L2有助于缓冲处理在单个内核中运行的两个线程的数据占用空间的打击,但命中率并不是很高。查看每条指令的失误就很好地说明了这一点。Zen 1 在两个 SMT 线程都处于活动状态的情况下遭受更多的 L2 未命中,但 L1D 遭受的损失更大,L2 最终捕获了很多这些访问。

  

龙芯处理器

  Loongson的L2似乎在这个指标上做得很好,但这只是因为它执行了更多的指令,以至于内存层次结构的影响较小。在绝对计数中,它实际上遭受了这里测试的任何CPU中最多的L2失误(超过244亿次,而加载182个SMT线程的Zen 176和Ampere Altra分别为1和1)。这同样适用于 L3 未命中,尽管差距较小。同样,对这些绝对计数持保留态度,因为我们并不确切知道龙芯的性能事件正在测量什么。

  第一印象(架构和性能)

  龙芯的3A5000似乎相当称职。与植酸D2000和兆信KX-6640MA不同,3A5000具有由大型缓存支持的均衡核心架构。每个时钟的性能在精细压缩方面是不错的,尽管它远远落后于英特尔和AMD最先进的CPU。但是每个时钟的体面性能并不意味着可接受的性能。龙芯落后的地方在于时钟速度。按照今天的标准,2.5 GHz 非常低。即使是高内核数的服务器 CPU 在时钟远高于 3 GHz 时也没有问题。到目前为止,这似乎是龙芯最大的弱点。

  术语“架构效率”或“同一时钟的性能”有时被视为衡量良好程度的指标。也许这是为低时钟速率道歉的一种方式,或者当微电流“有一天”达到该设计实际上无法获得的时钟速率时,这是一种暗示更高性能的方式。。。。。。

  David B. Papworth,《Tuning the Pentium Pro Microarchitecture》,IEEE Micro

  我们目前正在对 3A5000 进行微基准测试,以了解有关其架构的更多信息。我们最初的印象是,该核心的ROB容量与Phytium的D2000相似,但其他无序缓冲器的尺寸要好得多。最终我们将有一篇完整的文章,但分析这个CPU有点困难,因为我们的大多数基准测试都依赖于汇编代码。编译器倾向于做不可预测和复杂的事情,这使得很难从高级代码中观察体系结构特征。

  不幸的是,这意味着我们必须编写大量代码来研究龙芯的3A5000。编写汇编可能很困难,为不熟悉的ISA(LoongArch64)编写汇编将难度带到了另一个层次。测试微基准代码也不容易。通常,我们可以通过在具有已知特征的 CPU 上运行测试并确保结果合理来验证测试。但在这种情况下,龙芯的 3A5000 是我们唯一的龙 Arch64 CPU,大部分细节都没有公开。我们几乎是盲目飞行。每个测试都需要更长的时间来编写,并且出错的可能性很高。

  这就引出了另一个大问题:软件生态系统支持。如前所述,3A5000运行龙芯专有的ISA,Loongarch。Loongarch与MIPS共享许多约定和语义,尽管使用了不兼容的编码。一方面,这意味着龙芯能够复制和粘贴大量现有的MIPS代码来开始使用。另一方面,MIPS软件生态系统无法与x86或ARM相提并论。我预计龙芯在他们的软件生态系统中会遇到很多初期问题。

  回过头来看,中国国内的芯片努力有点滑稽。兆信的KX-6640MA和植树的D2000每核性能都很差。3A5000更好,代表了我们迄今为止在中国看到的最强大的CPU努力。但它不会享受强大的x86或ARM软件生态系统,如果你不能让它运行你的软件,CPU的性能就没有多大意义。

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

全部0条评论

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

×
20
完善资料,
赚取积分