欢迎光临散文网 会员登陆 & 注册

【转】用性能计数器预览中国的龙芯3A5000(机器翻译)

2023-03-22 15:47 作者:失传技术电磁所  | 我要投稿

用性能计数器预览中国的龙芯3A5000

本质上是CV22560291的机翻

2023 年 1 月 29 日 蛤蜊浓汤 发表评论

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

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

为了进行比较,我们将使用 AMD 的 Zen 1 架构,因为一些网站认为 3A5000 可能与 Zen 1 相当。Titanic 已经设置了带有双通道 DDR4-2400 的 Ryzen 7 1800X 系统。Ampere Altra 以来自 Oracle 云的免费四核实例的形式出现,也将在这里展示。Neoverse N1 内核可能与 3A5000 中的内核更具可比性,因为它们同样不会达到高时钟速度。

高级性能

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

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

视频编码

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


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

不幸的是,性能并不出色。依赖纯 C 代码通常会导致性能降低一个数量级。值得庆幸的是,龙芯避免了这一点。但 3A5000 的性能明显低于 Zen 1。它也无法与四核 Ampere Altra 匹敌。考虑到这两种芯片都有 128 位执行单元,这是一个糟糕的表现。至少在支持 AVX2 的 x86 芯片上,该测试中执行的指令中超过 10% 是 256 位的。Zen 1 确实支持 AVX2,但将 256 位指令解码为两个微操作。Ampere 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 的预测准确度都非常相似。当加载两个 SMT 线程时,即使 Zen 1 也不会受到太大影响。然而,3A5000 在每条指令中遭受更多的错误预测,这意味着它比这里的其他 CPU 更频繁地招致错误预测惩罚。虽然它的分支预测器似乎做得不错,但 17.7% 的 Loongarch 指令流由分支组成,而在 x86-64 上为 15.1%,在 64 位 ARM 上为 16.1%。

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

前端:指令获取

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 Hitrate

这里测试的三款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 未命中的影响较小,因为内核因必须处理更多数学指令而受阻。禅的情况正好相反。

L2 和 L3 缓存

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

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 需求填充的事件。在龙芯上,我使用的是 perf 中定义的 LLC-load-misses 事件。龙芯没有记录 3A5000 的性能监控事件,所以我不知道该性能事件是否包括预取未命中。

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

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

第一印象(建筑和性能)

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

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

David B. Papworth,调整 Pentium Pro 微架构,IEEE Micro

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

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

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

放大来看,中国国内的芯片努力处于一个有点滑稽的位置。兆芯的 KX-6640MA 和飞腾的 D2000 的单核性能都很差。3A5000 更好,代表了迄今为止我们从中国看到的最强大的 CPU 成果。但它不会享受强大的 x86 或 ARM 软件生态系统,如果你不能让它运行你的软件,CPU 的性能就没有多大意义。

最后老外的评价还真是人间清醒了,电动轮椅跑的再快也没人拿它上高速,打铁还需自身硬,自己生态建立不行就不要总想着碰瓷其他同行

【转】用性能计数器预览中国的龙芯3A5000(机器翻译)的评论 (共 条)

分享到微博请遵守国家法律