黑科技?龙芯3A4000公开代码分析

根据各路消息,龙芯3A4000已成功流片,但除了部分代码现身于龙芯开源社区cgit之外其他鲜有信息泄露,本文将基于这些公开代码分析一下龙芯3A4000可能引入的“黑科技”。

另外,在此希望龙芯gkd gkd,敲碗等指令集手册以及真机中。

Binutils

Binutils是GNU工具链的基础构建之一,提供基础的gas(汇编器),bfd/gold(汇编器)等组件,一些新增的代码可以反映指令上的变化。 下面将列出一些新增代码里提到的指令。

Loongson SPW

spw.jpg SPW的含义我暂时不是很明确,但是指令的意义非常明确,对页表项的PTE和DIR进行索引并读写,加快TLB Refill异常的处理速度,MIPS的TLB Refill是软件处理的按传统方法检索缺页填充非常慢,这两条指令可以一定程度上加快Refill过程。其实这些指令在3A3000的用户手册中也有提到,内核中也有使用,这里猜测只是补上之前binutils的缺漏。

Loongson AMO

amo.jpg AMO,顾名思义Atomic Memory Operations,原子内存操作。作为Weak Memory Ordering的架构(虽然部分MIPS处理器有Strong Ordering的实现,但MIPS默认还是Weak的。龙芯也是Weak的),MIPS本身有LL/SC指令进行原子操作,但在大规模并行程序下,专有的原子读写指令相较于LL/SC的确可以提供一定的性能改善。龙芯的AMO指令大致上学习自RISC-V,不过多出了_sync指令,具体含义不是很明确,猜测是为了避免可能的一致性问题加上强制sync功能?还是等到时候指令集手册发布再说吧。 附上RISC-V标准对原子指令的定义:

We provided fetch-and-op style atomic primitives as they scale to highly parallel systems better than LR/SC or CAS. A simple microarchitecture can implement AMOs using the LR/SC primitives. More complex implementations might also implement AMOs at memory controllers, and can optimize away fetching the original value when the destination is x0. The set of AMOs was chosen to support the C11/C++11 atomic memory operations efficiently, and also to support parallel reductions in memory. Another use of AMOs is to provide atomic updates to memory-mapped device registers (e..g, setting, clearing, or toggling bits) in the I/O space

Loongson EXT3

ext3.jpg Loongson EXT3主要是一些杂七杂八的扩展指令,前两条在3A3000的用户手册里也有提到,估计只是补漏,后面则是"multh"系列运算指令,不过我对“h”的含义并不是很清楚,等手册发布了看看吧。

然后是条是真正让人感兴趣的,第一条gsldpc,猜测是将当前的PC(Program Counter)载入通用寄存器,方便做PC Relative寻址,也就是说可以摆脱MIPS之前因为硬件不能很好支持PC Relative寻址而做所谓的abicalls影响性能的曲线救国这个火坑了。当然,按照龙芯一贯软件不给力的作风,这个功能什么时候软件能好好用上就是个问题了。

最后一条GSDAUI,猜测和MIPSr6引入的DAUI一个功能, Doubleword Add Upper Immediate

DAUI: GPR[rt] -> GPR[rs] + sign_extend(immediate « 16)

Loongson CSR

csr.jpg CSR目测这里指Control and Status Register,新增的一组寄存器。不过MIPS已经有CP0,HWR(用RDHWR读)两种硬件寄存器机制了,这里还新增一种有多此一举的感觉?个人认为可能是为了解决用户态硬件寄存器权鉴的问题,CP0仅限内核态读写,而HWR在权鉴方面MIPS的标准也不是很完美。新增的指令主要是cpucfg和其他CSR读写指令。cpucfg主要实现和x86的CPUID类似的CPU Topology功能,用以标识可用的CPU指令集Feature,方便用户态软件动态调整。个人感觉CSR可能想实现和x86的CPUID/MSR类似的功能。 另外CSR还包含一系列time指令,有线索表明这是一组类似于x86下constant tsc的计时器。龙芯叫他Stable Counter,不受cpufreq调频的影响,并且保证核间一致性,弥补MIPS perf count的缺憾。 CSR目前还提供了其他的一些寄存器,见之后对内核代码的分析。

Kernel

cgit上的内核中也出现了很多关于3A4000的修改,参见: kernel-overview.png 我挑一些重要的来分析一下。

CPU_LOONGSON3_COMP

其中,第一个关于3A4000的Commit就是 Add loongson3 compatibility option support,其Commit Message是

Loonson3 compatibility option is named “CPU_LOONGSON3_COMP”. It uses to support the new cpu (e.g. 3A4000) which has some feature that can not be distinguished by prid or cp0 register. This patch provides some basic support,and more support of these features will be added later.

根据代码,其中的野心也很明显,龙芯将不再通过MIPS的CP0 PRID机制来区分CPU型号,所有的CPU都将使用CPU_LOONGSON3_COMP这个PRID,然后其中的功能将通过CSR-cpucfg来区分CPU的型号以及功能,更进一步的,龙芯希望内核可以有向后兼容性,即先前发布的操作系统都可以支持之后发布的CPU,就像x86一样。

MSA/LSX

另一个Commit是 MIPS: add support for MSA/LSX for 3A4000,进一步证明了之前的小道消息,即龙芯3A4000的256-bit向量源自MIPS的MSA指令集。

IPI_CSR

接下来的几个Commit加入了IPI_CSR。IPI指的是inter-processor interrupt即核间中断,包括核间中断触发和清除寄存器以及用于传递信息的mailbox。之前龙芯的IPI是一组地址空间中的寄存器,现在做成CSR指令下的寄存器应该可以一定程度上提高SMP调度性能。

Temperature CSR

3A4000把芯片温度传感器的寄存器也变成了CSR寄存器。大概是模仿x86的MSR吧,之前也是地址空间里的寄存器。

Extended IO Interrupt CSR

龙芯3A4000上实现了类似x86上IOAPIC的中断控制器以实现自由的中断路由,也通过一组CSR控制,不像之前的IO中断控制器一样仅能将核内IO中断控制器上的中断路由到指定核,为了分发外部中断还不得不通过IPI传递给其他核EOI。极大的提升了中断处理性能。

Stable Counter CSR

一组计时器,取代cevt_4k/csrc_r4k,类似于X86的Constant TSC,提供Node内一致的时钟,弥补之前没有高精度时钟源的缺憾。

UNCACHED_ACCELERATED

UNCACHED_ACCELERATED加速算是龙芯从2F一贯以来的功能了,类似于Write Combine的访存加速机制,这个Commit主要是针对3A4000加入对7A显存的UNCACHED_ACCELERATED处理。但是为什么不用内核自带的ioremap_wc机制呢?我暂且蒙在鼓里。

Licensed under CC BY 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy