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

【知乎】龙芯3A5000:中国的最佳选择?

2023-10-30 02:35 作者:失传技术  | 我要投稿


龙芯3A5000:中国的最佳选择?


悲催的袜子


程序猿 飞蚊症 抑郁症患者

急招:①GPU编译器开发专家 ②GPU Architecture Modeling Expert ③显存技术主管

另有体系结构、编译原理、图形学大量工作&实习机会,应届生不要求相关经验,编程基础扎实即可,工作965,有大牛带

Loongson’s 3A5000: China’s Best Shot?chipsandcheese.com/2023/04/09/loongsons-3a5000-chinas-best-shot/

我们在Chips and Cheese上报道了两种中国CPU架构:兆芯基于x86开发的陆家嘴架构,该架构用在KX-6000系列的CPU中,以及飞腾基于ARM开发的FTC663架构,该架构用在D2000系列CPU中。兆芯成立于2013年,是威胜和上海市政府的合资企业。飞腾成立于2014年,其FTC663似乎是衍生于Cortex A72架构。因此,它们都是中国国内微处理器推进计划中相对较新的努力。

本文将介绍龙芯公司的最新产品——3A5000,这是中国自主CPU漫长发展历程中的最新一代。3A5000采用的LA464架构源自于GS464核心,该核心诞生于第十个五年计划,计划通过“863“等项目资助国内微处理器的研发。GS464的大部分开发工作都是在中国科学院计算技术研究所(ICT)的领导下进行的。ICT有着悠久的历史,可追溯至1956年,曾承担过众多国家级重大项目,如建设超级计算机和培养计算机研究人才等。

GS464在多年的发展中进行了许多改进。“十一五”期间,中国提出了推动国产高性能CPU和DSP的目标,并启动了“HGJ”项目。ICT通过大幅增加结构大小来应对这一计划,尽管内核仍然被称为GS464。在第十一个五年计划接近尾声时,该内核被传递给新成立的龙芯科技有限公司。然而,至少一些相同的人继续在GS464处理器系列上工作,因为相同的姓名出现在随后的研究出版物上(例如胡伟武)。

这为“十二五”计划制定了基础,该计划旨在促进“中国国产CPU和DSP的应用”[4]。在这些目标下,龙芯公司生产了一款100 MHz的抗辐射CPU,用于北斗卫星。当然,通用CPU也在计划中。GS464当时存在分支预测和内存性能不佳的问题。为了应对这些问题,龙芯开始着手开发GS464E架构,该架构借鉴了IBM POWER7、Intel Ivy Bridge和ARM Cortex A9的研究成果。目前,我们在3A5000中看到的LA464核心似乎正是基于GS464E架构发展而来。

3A500处理器的LA464核心已经从MIPS架构转变为龙芯自主研发的架构,通常被称为LoongISA或LoongArch。如今,龙芯希望3A5000能够应用于从个人电脑到服务器再到嵌入式的所有领域。我们将深入探讨该架构,并看看它如何尝试实现这一承诺。当然,我们也会将其与一些AMD、ARM和Intel架构进行比较。

我们的许多微基准测试依赖于汇编代码。编译器往往会做出不可预测的复杂操作,这使得从高级代码中观察架构特性会很困难。不幸的是,这意味着我们必须编写大量代码来研究龙芯公司的3A5000。编写汇编可能很困难,而为陌生的ISA(LoongArch64)编写汇编更是难上加难。探测微基的准代码也并不容易。通常,我们可以在具有已知特性的CPU上运行测试并确保结果合理来验证测试。但龙芯公司的3A5000是我们唯一拥有的LoongArch64 CPU,大多数细节也不公开。误差的可能性很高,请在整篇文章中记住这一点。

框图

LA464 是一个4路乱序处理器,具有大小适中的缓冲区,拥有许多现代处理器特性,例如物理寄存器文件和超宽的向量执行引擎,但并不是所有方面都是如此。总体来说,它的设计非常独特,具有一些其他内核所没有的设计决策。

前端:分支预测

CPU的流水线从分支预测器开始,分支预测器决定从哪里获取指令,对于实现高性能CPU至关重要。将流水线引向错误的目的地会导致工作的浪费,而确定跳转目标的时间过长可能会导致流水线饥饿。3A5000的分支预测的准确性似乎相当不错,在7-Zip中能与Zen 1和Ampere Altra并驾齐驱,在libx264中略有落后,但差距不是很大。

直接预测

GS464E使用锦标赛式分支预测器,其中元预测器选择是使用本地历史还是全局历史进行预测。本地历史指的是当前分支指令的历史执行情况,而全局历史指的是指令流中之前的分支指令的历史执行情况。GS464E的本地历史表、全局历史表和选择表都有16384个条目,与DEC的Alpha 21264实现的经典锦标赛预测器相比,它非常大。AMD的Bulldozer也使用了锦标赛预测器,其优化指南也暗示Bulldozer的全局历史表也有16384个条目。

LA464使用的可能也是类似的预测器。在随机模式下,当长度逐渐增加时,龙芯的表现很普通。它远远达不到当前英特尔和AMD CPU所能达到的水平。最近的英特尔和AMD CPU使用TAGE或感知器预测器,使用更少的存储空间就能实现更高的准确性。

如果没有出色的分支预测能力,CPU的性能将难以随着内核的增大而有效提升。增加缓冲区的大小可以保持更多的指令同时运行,但如果运行的都是错误预取的指令,那么增大缓冲区也不会有效提升性能。像 Bulldozer 或龙芯这样的预测器可能对具有 128 个 ROB 条目的内核来说足够了,但时代已经发生变化,龙芯需要更好的预测器来跟上步伐。

分支预测速度

分支预测器的终极目标是加速分支处理。预测分支的走向当然很重要,但是快速完成这个过程同样关键。如果分支预测器在引导前端方面花费太长时间,可能会导致流水线中的指令出现饥饿的情况。为了加快速度,Loongson使用了具有64个条目的BTB(分支目标缓存,分支目标的高速缓存)。如果分支目标来自于BTB,前端根本不需要停顿。

如果分支足迹溢出了64个条目的BTB,则CPU必须等待从L1i中获取分支,然后计算目标地址。此时,已执行的分支的延迟基本上是L1i延迟,对于LA464来说,这个延迟似乎是三个时钟周期。相比之下,即使处理成千上万个分支,最近的英特尔和AMD CPU的延迟也只有一到两个时钟周期。这种延迟尤其令人痛苦,因为3A5000的时钟频率远低于AMD或英特尔的芯片,因此分支延迟的实际时间非常高。

龙芯的方案避免了使用大型 L2 BTB 的面积成本,但会阻止分支预测器在 L1i 未命中后跟随指令流。英特尔、AMD 和 ARM 的 CPU 可以通过使用分支预测器从指令侧驱动预取来维持大型代码占用的高指令吞吐量。虽然这种技术在 Sandy Bridge 和 Bulldozer 时代是新的,但今天已是常识,甚至在低功耗架构上也实现了。在龙芯中没有看到这一点,真的像是从过去的时光中瞬间穿越回来。

间接分支预测

跳转到多个目标的分支会更加困难,因为分支预测器也必须在目标之间做出选择。这些复杂的分支也被称为间接分支,因为它们告诉CPU跳转到一个寄存器中的地址,而不是直接编码目标地址。对于单个间接分支,3A5000可以跟踪大约24个目标,否则可能会出现惩罚(可能是预测错误)。我们看到大约有512个总的间接目标被跟踪,其中有256个分支,每个分支两个目标。

这种间接分支处理能力水平还不错。这也很受欢迎,因为面向对象编程语言倾向于使用间接分支来处理方法调用。但它还是不如其他近期CPU那么强大。

值得一提的是 Neoverse N1,因为它也是一个性能目标适中的核心。但 ARM 能够实现与 Zen 3 和 Golden Cove 相差不远的间接分支预测能力。龙芯则明显落后。

return预测

返回指令通常出现在调用/返回对中,是间接分支的一种特殊情况。许多CPU都保留了返回地址的堆栈。函数调用发生时,CPU将一个地址推入堆栈,函数返回时,CPU会从堆栈中弹出一个地址。Loongson为3A5000提供了一个32个条目的返回堆栈,这应该足够大多数情况下使用。这是比GS464E显着改进的地方,后者只有一个16个条目的返回堆栈。

AMD的Zen 2也有一个类似大小的返回堆栈,并且通常能够实现超过99%的返回预测准确性。

前端: 指令获取

一旦分支预测器确定了跳转的目标地址,前端就必须将指令加载到核心中。这就是指令侧缓存体系的作用。首先,3A5000有一个64 KB 4路的大L1i,这很好,尤其是当AMD和英特尔的顶尖CPU还在使用32 KB的较小指令缓存时。

然而,L1i的大容量似乎是为了减轻Loongson从L2及更深层次的存储器中读取代码时的性能问题。Zen 1和Skylake都能够维持每时钟周期从L2中读取4条指令,并且即使不得不从L3读取代码时,也仍然有良好的表现。Loongson无法匹敌这一点,可能会受到前端带宽对于更大代码占用的限制。

奇怪的是,从L2读取代码的带宽比从L3还要差。我想知道是否是因为Loongson在处理指令缓存一致性时遇到了一些困难。如果做得正确,指令缓存一致性可以使JIT代码受益,并能够更好地推广到高核心数的CPU,但这并不容易。Loongson的L2是非包容性的,这意味着它无法作为探测器。也许来自指令侧的L2命中必须探测L1D以确保获取最新数据。但是,L3命中可能会从位于L3复合体中的单独一致性目录中受益,该目录可以指示是否可以在没有探测的情况下提供最新数据。

重命名

在指令被获取和解码后,重命名器必须给他们分配后端资源并跟踪它们。除了为了消除寄存器假依赖而进行的寄存器重命名之外,重命名器还可以使用某些技巧向执行引擎暴露更多的并行性。最近的英特尔和AMD CPU可以轻松处理寄存器到寄存器的移动和零化惯用语(zeroing idioms handled)。

据我所知,Loongson没有任何这方面的优化,重命名器的工作内容仅限于计算机科学课程讲解过的内容。

乱序执行

吸收掉cache和内存的延迟是保持高性能的关键,Loongson用一个相当大的乱序执行引擎来实现这一点。在芯片规模和设计动机方面,它看起来与Neoverse N1相当类似。两者都有128个条目的ROB,以及类似大小的寄存器文件。N1使用分布式调度器,而Loongson则配置了总条目数更少的统一调度队列。

StructureApplies if instruction…Loongson 3A5000 (LA464)GS464E**Neoverse N1Zen 1Reorder BufferExists128128128192Integer Register FileWrites to a scalar integer register~91 speculative + 32 architectural = ~123 entry128120 entry180 entryVector/FP Register FileWrites to a floating point/vector register~90 speculative + 32 architectural = ~122 entry256-bit entries, ~3.9 KB total capacity128 entry64-bit,1 KB total capacity128 entry128-bit entries, 2 KB total capacity160 entry128-bit, 2.5 KB total capacitySchedulerIs waiting to be executed32 entry INT32 entry FP32 entry memory16 entry INT24 entry FP32 entry memory16 entry branch3×16 entry INT2×16 entry FP2×12 entry memory4×14 entry INT36 entry FP + 64 entry NSQ2×14 entry memoryLoad QueueReads from memory64 entry64 entry?56 entry116 entry*Store QueueWrites to memory44 entryShared with loads?44 entry44 entryBranch Order BufferAffects control flow26 entry24 entry36 entry136 Not Taken32 Taken

*Zen的优化手册显示,负载队列有44个条目,但测试发现核心可以同时处理116个负载。为了保持一致性,使用了测量得出的数字116。

与较旧的GS464E相比,LA464保持了相同的ROB和寄存器文件大小,但加强了非常重要的调度器的大小。GS464E已经拥有了相当大的寄存器文件,这对于一个具有128条目ROB的CPU而言已经很不错了。LA464应该能够更好地利用其128个ROB条目。但是,近期的 AMD、英特尔甚至 ARM 处理器已经遥遥领先于龙芯。它们拥有更大的ROB,其他结构也得到增强,以保持核心的平衡。

Loongson选择保守地增加结构的大小,可能是为了提高时钟速度。需要在翻倍结构大小(如GS464E从GS464增加了结构大小)来增加IPC和提高时钟速度之间做出选择时,后者绝对是更好的选择。然而,西方公司能够在增加时钟速度的同时增加结构大小。

整数执行引擎

在之前的文章中,我们介绍了Loongson 3A5000的向量执行部分,如果您想了解更多有关FPU的信息,请阅读该文章。现在,让我们来看看Loongson 3A5000的标量整数部分。

跟GS464E相比,LA464的整形指令吞吐量大大提高了,它有四个ALU pipelines,GS464只有两个。基于GS464E的核心看起来有点奇怪,它们是4发射核心,但只有两个ALU。公平地说,Bulldozer也采用了这样的设计,模块中的每个核心都有4个发射端口和两个ALU,但这是为了增强多线程性能,所以使用了共享前端。

跟GS464E相比,LA464有了巨大的改进,但其在整数执行引擎方面仍有一些缺点。LA464每个周期只能解决一个分支,即使分支未被采用。这种能力相当于ARM的Neoverse N1或Intel的Sandy Bridge。但是,新的Intel和AMD CPU可以维持每个周期两个分支,通常提供至少其中一个不被采用。

Instruction3A5000 Throughput/LatencyGS464E Throughput/LatencyNeoverse N1 Throughput/LatencyZen 1 Throughput/Latency64b Integer Adds4 per cycle1 cycle latency2 per cycle3 per cycle1 cycle latency4 per cycle1 cycle latency64b Integer Multiplies2 per cycle4 cycle latency2 per cycle3 cycle latency1 per cycle2 cycle latency1 per cycle3 cycle latency64b Integer Divisions0.11 per cycle9 cycle latency0.05 per cycle20 cycle latency0.07 per cycle8 cycle latency

请注意,Neoverse N1不支持256位指令。

Loongson在整数乘法吞吐量方面确实具有优势。像Gracemont一样,3A5000每个周期可以执行两个标量整数乘法,而大多数其他核心只能执行一个。即使在3A5000的低时钟速度下,它的绝对吞吐量也可以超过2020年之前的ARM和x86竞争对手。然而,与最新的AMD和英特尔桌面核心相比,这种优势就很小了,后者的时钟速度超过3A5000的两倍以上。整数乘法的延迟为4个周期,这进一步降低了其优势,仅与AMD的Phenom和Intel的Core 2相同,后者已经超过二十年了,并且时钟速度还比3A5000高。任何来自英特尔和AMD的最新产品都具有更高的时钟速度和更低的延迟,使得它们遥遥领先于3A5000。

向量和浮点执行引擎

我们之前看过3A5000的向量和FP执行引擎的布局,并指出其能力比Zen 1和Skylake弱。更多细节请参阅那篇文章。总结起来,Loongson只有两个向量执行端口,并且FP执行延迟较高。无论向量宽度如何,浮点加、乘和融合乘加的延迟都为5个周期。这与AMD的RDNA 2图形架构相同,有趣的是RDNA 2也达到了类似的时钟频率。

向量整数操作更好一些,向量加法具有单周期延迟。尽管如此,四核Ampere Altra云实例在libx264视频编码方面略微领先于3A5000,这可能归因于更高的时钟频率和更广泛的专用指令集。与标量整数一样,3A5000在每个周期能够执行两个256位向量整数乘法,与Skylake相当,超越了Zen 1。但同样,低时钟速度意味着3A5000在实际中不太可能与两者匹敌。

与Intel和AMD的比较只是故事的一面。旧的GS464E内核具有64位FP单元,将其置于x87和MMX时代。当ICT管理Godson的开发时,他们创建了GS464V,这是GS464的变种,用于超级计算机中具有强大的向量单元。我怀疑GS464V构成了LA464向量实现的基础。根据IEEE的一篇论文,GS464V“在核心中集成了两个256位宽的向量单元”,“向量ALU模块使用两次”[1]。

地址生成

访存操作从地址生成开始,AGU(address generation unit)计算load或store操作要访问的内存地址,并将其传递给load/store单元。LA464核心具有两个AGU,每个时钟周期可以执行两个内存操作。这两个操作可以都是load操作,也可以一个是store操作。这使得它在性能上大致与Neoverse N1、Zen 1和Sandy Bridge相当。

然而,它已经落后于英特尔的Haswell架构及其后续产品,这些处理器可以在同一周期内执行两次load和一次store操作。最近的AMD和英特尔的CPU都大幅扩展了访存能力。例如,Golden Cove每个周期可以执行两次load和两次store操作,而Zen 4每个周期可以执行三个访存操作,其中两个可以是store。龙芯开发GS464E处理器时,参考了英特尔的Ivy Bridge架构,当时两个AGU单元的设计是非常合理的。但时代已经发生变化,现在看来这种设计已经相当过时。

Load/Store单元

一旦生成了虚拟地址,它们会被传递到load/store单元。该单元确保内存依赖关系得到遵守,并将虚拟地址转换为物理地址。为了加快速度,龙芯处理器可以在地址未知的情况下预测性地执行load操作。

如果一个load操作从之前的store操作中提取数据,龙芯处理器可以使用7个周期的延迟来做数据转发,只要加load作位于store操作范围内且两者之间的访问没有跨越64B的缓存行边界。然而,对于2.5 GHz的CPU来说,7个周期的延迟并非最佳表现。Zen 1虽然具有相同的延迟,但时钟速度更高,而Skylake则可以在5个周期内转发存储数据,仅比未争用的load操作多1个周期的延迟。

Loongson与Skylake相似,都采用粗粒度检查。Loongson以8B的粒度执行此操作,而Skylake以4B的粒度执行(即比较一个额外的位)。这意味着如果一个load和一个store都命中了Loongson上相同的8字节块,即使它们实际上没有重叠,它们也不能并行执行。这种8B重叠惩罚也适用于16 KB页面。如果load和store在不同的16 KB页面中以相同偏移量触及相同的8B块,则还会产生误依赖。最后,如果load部分重叠store,则Loongson会受到14个时钟周期的惩罚。这种失败的store forwarding惩罚并不算严重,与其他CPU相当。

如果访问跨越64B缓存行,则load/store单元的工作会变得更加困难,因为这将涉及两个L1D访问。这些访问被称为“不对齐访问”,因为它们跨越L1D对齐边界。Loongson通过在两个周期内执行它们来处理不对齐的load,这并不算过分,尽管新的Intel和AMD CPU根本不会受到任何不对齐的load惩罚。对于Loongson来说,存储要糟糕得多,因为不对齐的存储需要10个时钟周期。早期的Intel Core 2时代的CPU也遇到了类似的惩罚,但是最近的CPU通常要好得多。考虑到CPU的低时钟频率,这10个时钟周期的惩罚相当大。

如果访问还跨越16K页面边界,除了两个L1D访问外,还需要两个TLB查找。Loongson在这种情况下表现相当好,具有相同的不对齐load惩罚,而不对齐store的惩罚则增加到15个时钟周期。Zen 1则要承受24个时钟周期的惩罚,如果Zen 1运行在4 GHz,则实际时间几乎相同。

地址翻译

在生成地址后,核心必须将虚拟地址(程序所见)转换为对应于DRAM中位置的物理地址。这种转换允许操作系统执行权限并为每个进程提供其自己的内存视图,确保一个行为不当的程序不会导致整个系统崩溃。然而,地址转换也会产生开销。TLB通过记忆这些地址转换来最小化开销。

龙芯默认以16KB块或页来转换地址。相比之下,x86和ARM CPU通常使用4KB页。龙芯更大的页意味着每个TLB条目具有更大的覆盖范围。LA464拥有64个条目的L1 DTLB,可以覆盖1MB,并由2048个条目的L2 TLB支持,总TLB覆盖范围为32MB。这些大的页大小应该使龙芯在与x86和ARM竞争中具有优势。

命中L2 TLB似乎会增加2.3纳秒的延迟,相当于5-6个周期的延迟。这与Zen 1相比较优,后者具有7-8个周期的L2 TLB延迟。然而,Zen 1的更高时钟频率意味着它拥有更好的实际延迟。

Cache and Memory

一旦load/store单元完成检查,就会向存储子系统请求数据。与许多现代CPU一样,龙芯配备了三级cache。今天所有高性能的CPU都依赖于cache,因为DRAM性能的提升跟不上CPU性能的提升。

L1D Cache

与先前的GS464系列一样,3A5000也拥有大小适中的64 KB L1D缓存。它是4路组相联的,以实现使用16 KB页面的虚拟索引和物理标记的寻址。延迟是其薄弱之处,虽然四个时钟周期听起来并不算糟糕,但考虑到3A5000低下的时钟速度,它应该有更好的表现。相比之下,AMD的K10在更高的时钟速度和更早期的工艺节点下,就实现了3个时钟周期的延迟。

loogarch与MIPS一样,缺乏带有缩放因子的索引寻址模式,因此实际的L1D延迟变得更糟糕了。编译器最终会生成额外的指令来计算数组元素的地址,从而显著增加了L1D延迟。相比之下,x86-64和aarch64都有带有缩放因子的索引寻址模式。使用该功能最多会带来1个时钟周期的惩罚。在龙芯上,GCC生成的数组索引代码的延迟为8个时钟周期,这在2.5 GHz时是非常严重的。


在带宽方面,Loongson的L1D能够处理256位的向量访存。使用未公开的LASX指令,我们能够在每个周期进行两次256位的load,或者一次256位的load和一次256位的store。因此,即使在AMD具有时钟速度优势的情况下,3A5000的L1D带宽仍优于Zen 1。然而,它无法与Skylake相抗衡。

L2 Cache

与现今的许多CPU一样,Loongson拥有一个L2中级缓存,它可以降低核心访问L3的延迟。作为受害者缓存,3A5000的L2缓存为256 KB,采用16路组相联的映射方式,延迟为14个时钟周期,性能中规中矩。过去的十年里,Intel一直使用256 KB L2缓存,延迟仅为12个时钟周期,并且时钟速度也更高。实际延迟方面,3A5000的5.6 ns还不如FX-8350的4.8 ns,而Zen 1比FX-8350更快容量也更大。

L2每个周期的平均带宽为21.3字节,表现一般。相较而言,Skylake每个周期的带宽超过28字节,Zen 1则超过24字节。再次强调,时钟速度的差异意味着AMD和Intel的旧CPU在实际L2带宽上具有显著优势。

L3 Cache

L3可以说是该CPU的最佳功能之一,它为四核心簇提供了16 MB的容量,带宽和延迟也相当不错。L3作为受害者缓存,由四个bank构成。根据3A5000的用户手册,L3和核心之间通过使用AXI协议的“5×5 frequency division switch”进行连接。CPU核心作为主设备连接到switch上,而L3缓存切片则作为从设备连接。switch的每个端口的每个周期可以提供32字节的读取带宽和16字节的写入带宽。

互连装置可能是从Godson 3时期延续下来的,当时ICT致力于用旧的GS464核心实现高核心数的CPU。即使后来该项目的所有权转为龙芯公司后,同一批人仍在继续工作,这也并不令人感到惊讶。但是,龙芯已将每个L3切片的读取带宽提高了两倍。

总共四个 L3 切片,每切片每周期可传输 32 字节数据,在 2.5 GHz 的频率下,L3 的理论带宽为 320 GB/s ,但实际上远远达不到这个值。可能是处理器核心无法跟踪足够多的L2 miss以吸收 L3 的延迟;或者是 5x5 switch内部存在争用;也可能是L3的时钟频率低于核心频率。毕竟,Godson-3B1500 的核心频率为 1.25 GHz,但 L3 的频率只有 1 GHz。

无论何种场景,AMD 和 Intel 的 L3 的带宽都有明显优势。Zen 1 和 Skylake 不但每个周期能从L3读取更多的字节而且时钟频率还高得多。Loongson确实拥有容量上的优势,但在面对更现代的AMD和Intel芯片时,这个优势也会消失。

值得肯定的是,龙芯处理器的L3缓存要比Bulldozer好得多,随着线程数的增加,L3带宽大致呈线性增长。当龙芯处理器核数超过四个时,L3带宽的扩展性应该也会很好,因为每个L3实例是专属于四核簇的。就像AMD的Epyc一样,随着添加更多的核心簇,L3带宽应该会线性扩展,除非出现某种夸张的错误。

L3具有约40个周期的延迟。在周期计数方面,这并不算太差,与Zen 2处理器相当。然而,对于运行在2.5 GHz上的CPU来说,16纳秒的绝对延迟相当不令人印象深刻,龙芯处理器应该缩短L3的pipeline。

3A5000的表现要好于之前的Godson-3B1500。据IEEE上的一篇论文显示,Godson 3的L3的延迟大约为50个周期,以1.25 GHz的时钟速度计算,为40ns。相比之下,16ns的延迟要好得多,因此龙芯处理器取得的进步值得赞扬。

下图是《An 8-Core MIPS-Compatible Processor in 32/28 nm Bulk CMOS》公布的Godson-3B1500 在核心频率为1.25GH且LLC频率为1 GHz 时的延迟数据。

如果3A5000处理器未命中L3缓存,则通过第二级的AXI switch访问DDR4内存控制器。

DRAM

从上图可见,Godson-3B1500的内存延迟约为160-170个周期,相当于128-136纳秒。对于双通道DDR3-1066并且配置了RDIMMs的处理器而言,这个延迟并不算太差。不幸的是,龙芯在升级到DDR4时失误了。我们使用DDR4-2666进行测试,测得内存延迟为144纳秒。看来,Loongson的内存控制器质量很差,似乎是从http://Wish.com上买来的垃圾货。

我们使用了插满两个插槽的DDR4-2666进行测试。3A5000拥有双通道内存控制器,理论带宽应该与五六年前的消费级芯片相当。这里“理论”是关键词,因为现实是不同的。

一颗单独的Loongson核心可以从DRAM中获得大约7 GB/s的带宽,然而四个核心的总带宽还不到14 GB/s。在全核工作负载下,每个核心只能使用3.37 GB/s的DRAM带宽,这使得带宽瓶颈成为可能。对于双通道DDR4而言,这是一种极差的性能,因为它甚至落后于DDR3。例如,安装了双通道DDR3-1333的i7-4770可以获得略高于19 GB/s的带宽。

购买低价内存控制器的后果也是视情况而定的。日常任务,如网页浏览或文字处理,可能没有问题。服务器程序、HPC工作负载、图像处理、视频编辑和并行代码编译可能会有问题。

我们还应该记住,这是一款运行在2.5 GHz上的四核芯片。随着Loongson尝试提高时钟速度或核心数量,内存瓶颈将会变得越来越严重,因为计算与带宽的比率将变得更糟。这也适用于延迟方面,144.5 ns在2.5 GHz时为361个时钟周期,但在4 GHz时为578个时钟周期。在某种程度上,3A5000的低时钟速度掩盖了其低下的内存性能。

结论

Loongson的3A5000是目前为止我们看到的最有前途的中国本土CPU。与兆芯KX-6640MA和飞腾D2000相比,3A5000具有更宽的发射单元更平衡的后端和更好的缓存层次结构。但与其他两个CPU一样,在成为通用CPU之前,需要解决一些基本问题。龙芯的LA464架构无法与近期的英特尔或AMD架构相媲美,其性能存在较大差距。与西方同行相比,LA464的架构更小,L2和L3缓存更差,DDR4内存控制器表现得令人尴尬。尽管Loongson已经将核心频率从1 GHz提升到2.5 GHz,但如今的桌面甚至笔记本电脑CPU的主频都不会如此之低。由于其主频的巨大劣势,龙芯无法提供与近期的桌面CPU相媲美的性能。它甚至难以与主频为3GHz的Neoverse N1竞争。

下图来自“An introduction to CPU and DSP design in China”,可以看出,GS464E的所有“关键参数”都与LA464相同。

龙芯的发展也并不乐观。从微基准测试来看,LA464的架构基本上就是GS464E的衍生产品,后者是早在2010年代初期就设计出来的核心,旨在在时钟对时钟性能上接近当时西方的核心。但是即使在当时,Sandy Bridge和Bulldozer的主频也比今天的LA464高得多。当然,Golden Cove和Zen 4已经领先于Sandy Bridge多少个世代了。

如今的龙芯与十年前相比与英特尔和AMD之间的差距并没有缩小。我也不认为他们有很好的机会能在性能上达到同一水平,除非他们迈出一些巨大的跨越。制造一款性能尚可的低功耗处理器要比制造顶级的CPU容易得多。追求高性能意味着需要解决一个又一个瓶颈,而随着CPU性能极限的不断提升,这些瓶颈的解决变得越来越复杂。

软件生态是另一个问题。具有讽刺意味的是,尽管3A5000比飞腾或兆芯更强,但其ISA使其在实际中更加无用。龙芯意识到了应用软件对MIPS的支持不佳,工具链也不如x86强大。但是创造一个新的、不兼容的指令集,并重用大部分MIPS工具链,是一个非常愚蠢的问题解决方式。此外,龙芯将LoongArch ABI分为“旧世界”和“新世界”,这两者不兼容。这只会让软件生态更加混乱和荒谬。

截至2022年7月18日,所有商业化的LoongArch发行版都与社区发行版不兼容。基于社区发行版构建的所有二进制软件以及一些高级语言编写的软件(如Python或Java编写的软件),不能在商业化发行版上运行,反之亦然。所有来自ISV(独立软件开发商)的闭源软件,如WPS Office,都是基于商业化发行版构建的,因此它们极不可能在社区发行版上按原样工作。

这就是所谓的旧世界和新世界之间的兼容性问题。由于龙芯公司在向开源社区公布LoongArch之前完成了所有商业化的步骤,因此开源的LoongArch生态系统是新世界;相比之下,所有商业化发行版及其关联的生态系统组成了旧世界。这两个世界最终将会合并,但现在它们是两个平行的宇宙;而使这两个世界相互兼容的技术难度是巨大的。

https://blog.xen0n.name/en/posts/tinkering/loongarch-faq/#why-cant-i-run-closed-source-software-like-wps-office-on-community-distributions-aka-whats-this-so-called-old-world-and-new-world

龙芯的ISA确实有用于ARM、MIPS和x86的二进制翻译扩展,这是一个非常复杂的解决方案,用以规避未使用更加常见的ISA的问题。我们在龙芯的Loongnix(一个基于Debian的系统)上使用二进制翻译并没有太多乐趣。x86-64 Geekbench马上就会崩溃。减少二进制翻译的性能损失确实不错,但无法正常工作是不好玩了。公正地说,32位x86版本在二进制翻译下是工作的。但如今,大量的程序都是64位的,所以确实需要x86-64翻译正常工作。即使它能正常工作,二进制翻译也会使得本来就性能低下的龙芯CPU更加雪上加霜。

最后,LA464是一个有趣的低功耗、低性能架构。Loongson/ICT团队确实一直在努力追求他们的目标。但他们的创新步伐落后于AMD和Intel,这两个公司一直在不懈地推动CPU性能的增长。但是,从LA464到Zen 4或Golden Cove的比较,可以看出AMD和Intel在推动CPU性能极限方面的成就是多么令人印象深刻。这也表明西方公司的持续进步使得中国的CPU制造商很难追赶。

参考文献

  1. Weiwu Hu et al, An 8-Core MIPS-Compatible Processor in 32/28 nm Bulk CMOS, IEEE Journal of Solid State Circuits, Vol. 49, No. 1, January
    2014

  2. Weiwu Hu et al, Microarchitecture of the Godson-2 Processor

  3. Weiwu Hu et al, Godson-3: A Scalable Multicore RISC Processor with x86 Emulation, IEEE Micro, December 2019

  4. Weiwu Hu, Yifu Zhang, Jie Fu, An Introduction to CPU and DSP Design in China, Science China Information Sciences, October 2015

发布于 2023-04-21 13:51


发布于 2023-04-21 13:51

发布一条带图评论吧


21 条评论

默认

最新

guee

翻译得很专业,原作者也很专业。

04-24 · IP 属地重庆

madao

不管怎么说龙芯依旧是中国最好的芯片设计公司,落后也没事,早晚都会追上的

04-22 · IP 属地山东

喜鹊

这条路必须有人走

04-22 · IP 属地湖南

流浪大叔

落后没有关系,怕的是做都不敢做,我自己有3a5000的电脑,日常使用足够,期待3a6000。

04-30 · IP 属地广西

明天会更6

顶陆家嘴架构,下次出一个徐家汇架构


04-22 · IP 属地上海

21世纪米客

还有五角场提篮桥

04-23 · IP 属地上海

薪程

21世纪米客

提篮桥有点厉害

07-13 · IP 属地上海

21世纪米客

能和红蓝厂的CPU比都算是一种胜利了。

04-23 · IP 属地上海

Lavender

分支预测这个图和CSAPP 3rd的封面好像啊

04-22 · IP 属地美国

jamesr

和zen4比怎么都有点飘了,zen1都还比不了

04-23 · IP 属地浙江

Lavender

翻译的很好……可惜没怎么学体系结构,看起来半懂不懂的

04-22 · IP 属地美国

芯片物理设计精英

分析的挺客观的,目前比国际主流性能低也很正常,道路是正确的,但很艰辛

04-26 · IP 属地北京


【知乎】龙芯3A5000:中国的最佳选择?的评论 (共 条)

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