搬运下昨天写在知乎的文章:https://zhuanlan.zhihu.com/p/684810781
一、概述
龙芯在去年11月份发布了3A6000,这个CPU发布后部分人开始兴奋,因为它的IPC性能可以对标12、13代酷睿,于是很多人都说龙芯的设计性能直逼Intel。对于频率问题这些人认为“龙芯因为穷,没钱大规模流片,导致频率无法上去”,这种说法真的成立吗?通过查阅了一些资料,我们来看下这个逻辑是否成立。
高IPC:
在CPU设计领域,如何实现高性能CPU一直分为两个派系,“头脑家(brainiac,高IPC)”与“速度魔(speed-demon高频)”,虽然这个论调最早是1993年提出的,但是截至到今日仍然成立,国际上前者以苹果、ARM为代表(高IPC,相对低一点的频率),后者以Intel、AMD为代表(高频,相对低一点的IPC)。
国内龙芯走的就是“头脑家(brainiac,高IPC)”路线(特征:短流水线,相对较高的IPC),此路线典型的特点就是IPC性能相对较高,同时具备省电的特点。直接简单粗暴的用IPC性能去对比头脑家和速度魔的设计能力是错误的,因为大家真正的目标是设计出真正的高性能CPU(IPC*频率),实际CPU性能才是两者真实的设计水平的体现。所以直接用IPC性能去对标频率高一倍的Intel是不合适的。
频率:
这个更多是设计决策导致的,因为龙芯目前设计侧的决策是采用短流水线(3a5000为12级流水线)、高IPC的设计思路,这种设计模式下同工艺下无法做到长流水线架构CPU的频率的(龙芯如果不改当前流水线深度,即使上7nm,也很难将频率提升到3.5Ghz以上)。
二、流水线
CPU内部实际上是一堆门电路的组合逻辑,如果没有流水线,那么CPU需要在一个Tick(频率的倒数,也叫周期)内走完单个指令的所有逻辑门,而一般我们把单个Tick能跑多快影响最大,最长的那条路径叫做“关键路径”。
关键路径的长度越长,他需要经过的逻辑门个数就越多,那么信号在这个路径上传输的延迟就越大,当频率快到一定程度,可能出先出前一个信号还在逻辑门里面跑,后一个信号又输入进了逻辑门,这会导致CPU无法正常工作。而这个临界频率就是当前CPU的最大频率,如果没有流水线,CPU的频率是非常容易到瓶颈的。
所以就需要引入流水线的概念,流水线实际上是将CPU内部这个很大的逻辑组合门电路切割成多个组合逻辑(一般业界叫),不同的组合逻辑之间通过锁存器(流水线寄存器)的方式进行隔离,寄存器可以保存上一个组合逻辑的结果。
这就意味着一个Tick(周期)电信号只需要走完单个组合逻辑+锁存器即可,最多会同时有N个指令同时在跑(N为流水线深度,这里的“最多”仅为理论假设,实际因为受限指令上下文、分支跳转等原因会少一点),可以发现这样最显著的好处就是“关键路径”变短,CPU频率可以大幅提升。
现代处理器致力于控制逻辑门的数量以减少每个流水线阶段的延迟,但是大多数处理器都有非常深的流水线。
将CPU内部单条指令的逻辑组合拆分成若干个逻辑组合,并用寄存器保存上阶段的结果数据
比如最简单的5级流水线:
取指:指令取指(InstrucTIon Fetch)是指将指令从存储器中读取出来的过程。
译码:指令译码(InstrucTIon Decode)是指将存储器中取出的指令进行翻译的过程。经过译码之后得到指令需要的操作数寄存器索引,可以使用此索引从通用寄存器组(Register File,Regfile)中将操作数读出。
执行:指令译码之后所需要进行的计算类型都已得知,并且已经从通用寄存器组中读取出了所需的操作数,那么接下来便进行指令执行(InstrucTIon Execute)。指令执行是指对指令进行真正运算的过程。譬如,如果指令是一条加法运算指令,则对操作数进行加法操作;如果是减法运算指令,则进行减法操作。
访存:存储器访问指令往往是指令集中最重要的指令类型之一,访存(Memory Access)是指存储器访问指令将数据从存储器中读出,或者写入存储器的过程。
写回:写回(Write-Back)是指将指令执行的结果写回通用寄存器组的过程。如果是普通运算指令,该结果值来自于“执行”阶段计算的结果;如果是存储器读指令,该结果来自于“访存”阶段从存储器中读取出来的数据。
当然现代处理器为了更高性能,拥有非常深度的流水线。比如龙芯的3A5000,LA464的12级流水线为:PC、取指、预译码、译码I、译码II、寄存器重命名、调度、发射、读寄存器、执行、提交I、提交II(3A6000的LA664暂未看到相关数据)。
三、如何提升CPU频率
3.1、流水线拆分
多级流水线带来的直接好处就是将一整个组合逻辑拆分成多个,如果是10级流水线,那么流水线单个子组合逻辑门电路数量可以降低为原来的1/10左右(实际上因为流水线寄存器等原因,会增加少量门电路,另外流水线实际在划分的时候不可能均匀分布);如果是20级流水线,单个子组合逻辑门电路数量降低为原来的1/20左右,可以显著提升CPU频率。
流水线拆分,带来最直接的好处就是“关键路径”变短,延迟降低,意味着同工艺下频率可以大幅提升。
左边电路,是一个纯组合电路,它的路径延迟为23.0 ns。对这个电路进行流水线拆分优化后,得到右边所示的电路。将一个逻辑组合拆分为三个逻辑组合,降低电路延迟。
需要注意的是,流水线划需要在前端设计时就考虑,如中间的寄存器,需要在RTL代码中预置好。同时流水线拆分过细会带来IPC下降等负面作用,原因主要是:
1、流水线寄存器写入数据也是有延迟的,流水线过长会导致单条指令处理时间过长。以流水线章节那张图举例,如果我们不断加深流水线,这些操作占整个指令的执行时间的比例就会不断增加。最后,我们的性能瓶颈就会出现在这些overhead上。
如我们指令的执行有3纳秒,也就是3000皮秒。我们需要20级的流水线,那流水线寄存器的写入就需要花费400皮秒,占了超过10%。如果我们需要50级流水线,就要多花费1纳秒在流水线寄存器上,占到25%。这也就意味着,单纯地增加流水线级数,不仅不能提升性能,反而会有更多的overhead的开销。所以,设计合理的流水线级数也是现代CPU中非常重要的一点。
2、硬件电路上流水线带来的触发器延迟(输出延迟、建立时间)线性增加。对于大部分数字电路来说,逻辑可以粗略地大概分为两部分,即组合逻辑和触发器。触发器负责在时钟有效边沿到来的时候将数据采集下来,在时钟有效边沿没有到来的时候将数据保持住。于是乎,数据就一个周期一个周期地向后传递。传递过程中,数据流过组合逻辑,被组合逻辑进行运算、处理,然后再被下一级触发器采集到。 因此,大多数数字电路都可以简化为“前级触发器~组合逻辑~后级触发器”的结构。
在电路中,主要涉及到以下几种参数(只列出了和时钟频率有关的参数)
触发器:
输出延迟(Tc2q):时钟有效边沿到来后,数据从触发器输入被采集到输出所用的时间
建立时间(Tsetup):时钟有效边沿来之前,数据至少应该保持稳定的时间
组合逻辑:
组合逻辑延迟(Tcl)组合逻辑输入变化后,输出稳定到正确值所需要的时间
只考虑最理想情况,即组合逻辑延迟被n等分(即拆分未N个等分的流水线,当然实际情况不可能做到等分),同时假设电路工作在最高频率。因此,最小时钟周期就是:
Tmin=Tc2q+Tsetup+Tcl/n
由于电路处理时间由单周期变成了n周期,因此处理完一个数据(指令)所需要的时间就变成了:
n*Tmin=n(Tc2q+Tsetup)+Tcl
由此可见,在各自的极限频率下,打流水线后处理一笔数据(指令)所需要的时间不仅没有变短,还多了(n-1)(Tc2q+Tsetup)。
3、更长的流水线意味着分支预测失败带来的惩罚将更重,同时流水线过深会导致流水线停顿和冒险(某硬件不支持同时钟周期被多个资源访问,数据依赖或逻辑关系不被满足的情况、存在上下依赖的指令、跳转指令等),从而降低处理器的性能。
3.2、后端设计优化
后端通过后端设计优化(逻辑简化、门级重构、时序优化等)等方式优化CPU电路设计,甚至对于部分关键电路,可以通过手工布线方式优化整体延迟。
在CPU设计中,部分复杂的逻辑运算模块,它包含多个逻辑门和复杂的连接关系。在进行等效电路优化时,设计师可能会发现某些逻辑门是冗余的,或者某些连接关系可以简化。通过去除这些冗余的逻辑门或简化连接关系,可以减少整个模块的复杂性和延迟,提高CPU的性能和效率。
有兴趣可以参考文章:https://blog.csdn.net/weixin_43249158/article/details/123888942
例子一:重新排序运算符号(Reordering Operators):
RTL代码包含有电路的拓扑结构。HDL编译器从左到右解析表示式。括号的优先级更高。DC 中DesignWare 以这个次序作为排序的开始。
例如:表达式 S U M < = A ∗ B + C ∗ D + E + F + G SUM<= A*B+C*D+E+F+GSUM<=A∗B+C∗D+E+F+G,在DC中的综合的结构如下图所示:
电路的总延迟等于一个乘法器的延迟加上4个加法器的延迟。为了使电路的延迟减少,我们可以改变表达式的次序或用括号强制电路用不同的拓扑结构。如:
S U M < = E + F + G + C ∗ D + A ∗ B 或 S U M < = ( A ∗ B ) + ( ( C ∗ D ) + ( ( E + F ) + G ) ) SUM<=E+F+G+C*D+A*B\\ 或\\ SUM<=(A*B)+((C*D)+((E+F)+G))\\SUM<=E+F+G+C∗D+A∗B或SUM<=(A∗B)+((C∗D)+((E+F)+G))
这时得到的综合结构为:
电路的总延迟等于一个乘法器的延迟加上2个加法器的延迟,比原来的电路少了2个加法器的延迟。
例子二:边界优化
举例如下,对于下面的电路,既包含有组合逻辑电路又包含有寄存器(两个流水线组合逻辑):
后级的寄存器与寄存器之间的时序路径延迟为10.2 ns,而时钟周期为10 ns,因此,这条路径时序违规。但是前级的寄存器与寄存器之间的时序路径延迟为7.5 ns,有时间的冗余。使用optimize_registers命令,可以将后级的部分组合逻辑移到前级,使所有的寄存器与寄存器之间的时序路径延迟都小于时钟周期,满足寄存器建立时间的要求。需要注意的是这种优化一般是对时序的违规(timing violation)在时钟周期的25%以下时使用,如果超过25%一般需要重新修改前端RTL代码。
例子三:展平优化
把组合逻辑路径减少为两级,变为乘积之和(sum-of-products,简称SOP)的电路,即先与(and)后或(or)的电路,如下图所示:
展平优化后,组合逻辑关键路径由三级减少为两级,降低了延迟
3.3、工艺优化
CPU内部由无数晶体管组成,限制频率的本质原因是因为物理电路存在延迟,为什么会存证延迟,主要是因为晶体管存在寄生电容,而晶体管实现0-1开关翻转的时候必然涉及到电容的充放电,而这个充放电实际上是需要时间的,这个时间就是延迟产生的根本原因。
怎么样让寄生电容充电时间变短,一个是增加电压,另外一个就是降低电容容量。
前者我们再超频的时候就经常遇到,超频频率上不去的时候可以通过加电压,继续提升频率(比如有人一直很好奇为什么3a6000超频的时候明明功率还不是很高,超频的人却要加电压,本质就是因为这个原因)。
后者就是工艺改进,通过使用更先进的工艺,减少晶体管体积,从而降低电容容量。也因为寄生电容降低了,所以充放电需要的能量也降低,对外直观的另外一个表现先进工艺下功耗更低。
通过先进工艺降低硬件电路延迟,提升频率,这个大家在手机soc、Intel、AMD历代处理器中应该深有体会,不再赘述。
四、各种优化方式对频率的影响
4.1、流水线设计对频率以及IPC的影响
1、Intel将Northwood20级流水线架构(最高频率为3.06Ghz P4 90nm),设计调整为Prescott采用31级超长流水线,频率从3.06Ghz提升到3.8Ghz(P4 670 90nm);20级流水线和31级流水线情况下频率提升24%,后者称为高频低能的代表;
(这里会发现一个问题,当流水线过深后,继续增加流水线实际上带来频率的提升会变小,主要原因一个是寄存器、触发器的开销延迟,另外一个是流水线组合逻辑没法做到理论上的平均拆分)
2、Intel在2006年的奔4和酷睿两个处理器,奔4(Prescott核心)采用31级超长流水线,在65nm工艺下,最高频率做到3.8Ghz(P4 671,95W),但是后出来的酷睿E6800(Conroe核心),采用相对14级流水线设计,频率降低接近1/4,只有2.93Ghz(Core 2 Duo E6800,65W),IPC性能提升近一倍。这是一个非常典型的同工艺不同微架构设计的案例,缩短流水线长度,提升IPC,降低功耗;31级流水线和14级流水线情况下频率降低近30%,但是采用14级流水线的酷睿拥有比前者高80%的IPC性能;
3、均使用台积电的工艺,苹果M1、M2频率相对较低,采用12级短流水线设计,使用台积电5nm工艺的情况下最高频率只有3.5Ghz,但是AMD的Zen3频率就明显高的多,zen3采用18级流水线设计,比如采用台积电7nm工艺的5950X频率达到4.9Ghz;可以看到工艺落后一代的情况下,采用长流水线的Zen3频率比M2要高40%,当然IPC性能要低得多;
4、Intel 2-5代酷睿拥有14 - 19 级流水线,11代酷睿SunnyCove流水线深度为19级,12代酷睿大核一般认为是20级左右流水线,Intel CPU都拥有极高的频率,这和长流水线设计是分不开的;
5、龙芯的技术粉丝实际上也推测过龙芯流水线的设计,将12级流水线改为15级流水线,频率提升24%,参考:
注意:这里仅仅为推测,并不代表6000实际是这样实现的,纯粹是站在技术角度分析
技术性粉丝预测将LA464的12级流水线重新划分为15级,频率将提升24%左右
4.1、前后端设计小优化对频率的影响
需要注意的是,在工艺不变的情况下,对于成熟设计公司来说,3.2能带来的优化是比较有限的,我们可以通过观察Intel历史的挤牙膏来看一下,在工艺不迭代的情况下Intel如何艰难的提升频率:
从Intel公开的资料来看,Intel的14nm工艺有三代,分别是14nm、14nm+、14nm++工艺,对于桌面主流级处理器来说,使用初代14nm工艺的有Broadwell与Skylake(6700K 4.2Ghz),使用14nm+工艺的有Kaby Lake(7700K 4.5Ghz),而使用14nm++的则有Coffee Lake(8700K的4.7Ghz)、Coffee Lake Refresh(9900K 5.0Ghz)、Comet Lake(10900K 5.3Ghz)和Rocket Lake(11900K 5.3Ghz)。
可以看到Intel14nm++倒腾3年左右,工艺基本不变,Intel通过前后端设计优化,提升13%左右频率,将8700K的4.7Ghz提升到10900K的5.3Ghz。
整体架构不大改,前后端设计小优化需要大量流片迭代,Intel平均一年迭代提升4-5%左右性能(俗称挤牙膏),这个在ARM侧也可以看出来,比如A77、A78这种不大改的微架构,整体性能(包括IPC和频率)提升非常有限。
4.3、工艺对频率的影响
同一个微架构设计,工艺也会影响频率,虽然组合逻辑内电路是基本固定或高度类似的,但是先进工艺可以直接降低电容,降低晶体管寄生电容充放电时间,从而提升频率。典型的比如:
1、Intel 22nm的4790K最高频率为4.4Ghz,同款微架构工艺升级初代14nm的5775C实际上是个失败产品(这应该是个典型案例,因为新工艺不支持高频导致同一个微架构使用先进工艺反而频率降低的情况),频率才3.8Ghz,而类似微架构的6700K也才4.2Ghz,再到改良版本的14nm+ 7700K 到4.5Ghz,再改良的14nm++ 8700K的4.7Ghz;初代14nm和14nm++我们算为半代工艺,对频率的影响为12%;
2、Intel的2-4代酷睿均采用14-19级流水线设计,工艺从32nm提升到22nm,频率从2700K的3.9Ghz提升到4790K的4.4Ghz,工艺提升一代,频率提升12.8%;
3、麒麟980、麒麟990,大核心均为A76,工艺分别为duv 7nm和euv 7+工艺(应该算6nm),频率从980的2.6Ghz提升至2.86Ghz;半代工艺对频率影响为10%;
4、骁龙865、麒麟9000s,大核心均为A77,工艺分别为7nm和5nm,频率从2.84Ghz提升至3.13Ghz;先进一代工艺频率提升10%;
5、14nm的AMD Ryzen ThreadRipper 1950X(32核)最高频率4.0Ghz,10nm的AMD Ryzen Threadripper 2950X(32核)最高频率到4.4Ghz,两者均为Zen架构,半代工艺对频率影响为10%;
6、龙芯的3A4000的GS464和3A5000的LA464实际上是非常相似的微架构,工艺从28nm提升到12nm,流水线都是12级的情况下,频率从2.0Ghz提升到2.5Ghz,工艺提升两代,频率提升25%;
可以发现工艺换代的频率提升并没有想象中的大,同架构大概影响10-20%的频率(当然这里包含了部分后端设计的小优化)。
7、同样的,龙芯官方在问董秘环节中也透露过类似信息,官方在回复时指出,将龙芯12nm工艺换成新工艺(7nm)的情况下,性能能提升20-30%(12nm是14nm的半代升级工艺,前面还有10nm,再到7nm,实际上为1.5代工艺升级):
12nm升级到7nm,预测性能提升20-30%
五、结论
通过上述分析我们可以得出一个结论:加深流水线对提升频率帮助较大,但是流水线越深,IPC性能越差。抛开频率只用IPC衡量一个Fabless的设计能力也是欠妥当的。
而从目前资料推测分析,龙芯代工厂高概率是台积电(2020.7中芯国际的上市招股书中显示12nm工艺还在研发中,而3a5000在2020下半年已经开始流片),所以直接把5000和6000高频上不去的问题甩锅给工艺或者说流片过少,实际上并不合适(当然龙芯官方显然是知道自己频率上不去的核心原因是因为架构设计,而不是工艺,否则也不会有上面这张图片中的回复),从AMD、苹果芯片看,虽然台积电无法像Intel一样追求极致的高频,12nm到4.0Ghz台积电应该是没有问题的(AMD锐龙 3400G 最高睿频4.2Ghz,现场撕裂者2950x最高频率4.4Ghz,均采用台积电12nm工艺)。
型号 内核代号 流水线深度 频率 功耗 工艺
3A1000 GS464 4发射 9级 1Gzh 15W 65nm
3A2000 GS464E 4发射 12级 1Ghz 15W 40nm
3A3000 GS464E 4发射 12级 1.5GHz 30W 28nm
3A4000 GS464V 4发射 12级 2.0Ghz 40W 28nm
3A5000 LA464 4发射 12级 2.5Ghz 40W 12nm
3A6000 LA664 6发射 12级(推测) 2.5Ghz 40W 12nm
从龙芯的研发历史看,12nm工艺不是首次使用(LA464在3A5000、3C5000最少四次流片,3A6000最少也是第五次流片),同时12级流水线后端的优化应该是有一定经验的,从1Ghz优化到2.5Ghz,所以可以认为龙芯目前的LA664是个有一定成熟度的内核,但是后端设计应该达不到6、7代酷睿如6700K、7700K的成熟度水平。
6000的频率提升不上去更多是龙芯设计侧采取短流水线、高IPC的技术选择原因,预测如果不大改流水线的情况下,采用7nm先进工艺,后端持续优化的情况下预计全核频率能到3.3-3.5Ghz(全核频率,LA664核心成熟度不高,尤其是后端设计,其次按官方说辞提升20-30%),单核睿频加0.2-0.3Ghz也是完全可能,当然这对龙芯目前的后端设计是一个不小的挑战。
当然如果龙芯更加激进一点,放弃小部分IPC,重新规划流水线,比如把流水线加深到15或16级以上,我相信频率会有更大的提升。
一、概述
龙芯在去年11月份发布了3A6000,这个CPU发布后部分人开始兴奋,因为它的IPC性能可以对标12、13代酷睿,于是很多人都说龙芯的设计性能直逼Intel。对于频率问题这些人认为“龙芯因为穷,没钱大规模流片,导致频率无法上去”,这种说法真的成立吗?通过查阅了一些资料,我们来看下这个逻辑是否成立。
高IPC:
在CPU设计领域,如何实现高性能CPU一直分为两个派系,“头脑家(brainiac,高IPC)”与“速度魔(speed-demon高频)”,虽然这个论调最早是1993年提出的,但是截至到今日仍然成立,国际上前者以苹果、ARM为代表(高IPC,相对低一点的频率),后者以Intel、AMD为代表(高频,相对低一点的IPC)。
国内龙芯走的就是“头脑家(brainiac,高IPC)”路线(特征:短流水线,相对较高的IPC),此路线典型的特点就是IPC性能相对较高,同时具备省电的特点。直接简单粗暴的用IPC性能去对比头脑家和速度魔的设计能力是错误的,因为大家真正的目标是设计出真正的高性能CPU(IPC*频率),实际CPU性能才是两者真实的设计水平的体现。所以直接用IPC性能去对标频率高一倍的Intel是不合适的。
频率:
这个更多是设计决策导致的,因为龙芯目前设计侧的决策是采用短流水线(3a5000为12级流水线)、高IPC的设计思路,这种设计模式下同工艺下无法做到长流水线架构CPU的频率的(龙芯如果不改当前流水线深度,即使上7nm,也很难将频率提升到3.5Ghz以上)。
二、流水线
CPU内部实际上是一堆门电路的组合逻辑,如果没有流水线,那么CPU需要在一个Tick(频率的倒数,也叫周期)内走完单个指令的所有逻辑门,而一般我们把单个Tick能跑多快影响最大,最长的那条路径叫做“关键路径”。
关键路径的长度越长,他需要经过的逻辑门个数就越多,那么信号在这个路径上传输的延迟就越大,当频率快到一定程度,可能出先出前一个信号还在逻辑门里面跑,后一个信号又输入进了逻辑门,这会导致CPU无法正常工作。而这个临界频率就是当前CPU的最大频率,如果没有流水线,CPU的频率是非常容易到瓶颈的。
所以就需要引入流水线的概念,流水线实际上是将CPU内部这个很大的逻辑组合门电路切割成多个组合逻辑(一般业界叫),不同的组合逻辑之间通过锁存器(流水线寄存器)的方式进行隔离,寄存器可以保存上一个组合逻辑的结果。
这就意味着一个Tick(周期)电信号只需要走完单个组合逻辑+锁存器即可,最多会同时有N个指令同时在跑(N为流水线深度,这里的“最多”仅为理论假设,实际因为受限指令上下文、分支跳转等原因会少一点),可以发现这样最显著的好处就是“关键路径”变短,CPU频率可以大幅提升。
现代处理器致力于控制逻辑门的数量以减少每个流水线阶段的延迟,但是大多数处理器都有非常深的流水线。
将CPU内部单条指令的逻辑组合拆分成若干个逻辑组合,并用寄存器保存上阶段的结果数据
比如最简单的5级流水线:
取指:指令取指(InstrucTIon Fetch)是指将指令从存储器中读取出来的过程。
译码:指令译码(InstrucTIon Decode)是指将存储器中取出的指令进行翻译的过程。经过译码之后得到指令需要的操作数寄存器索引,可以使用此索引从通用寄存器组(Register File,Regfile)中将操作数读出。
执行:指令译码之后所需要进行的计算类型都已得知,并且已经从通用寄存器组中读取出了所需的操作数,那么接下来便进行指令执行(InstrucTIon Execute)。指令执行是指对指令进行真正运算的过程。譬如,如果指令是一条加法运算指令,则对操作数进行加法操作;如果是减法运算指令,则进行减法操作。
访存:存储器访问指令往往是指令集中最重要的指令类型之一,访存(Memory Access)是指存储器访问指令将数据从存储器中读出,或者写入存储器的过程。
写回:写回(Write-Back)是指将指令执行的结果写回通用寄存器组的过程。如果是普通运算指令,该结果值来自于“执行”阶段计算的结果;如果是存储器读指令,该结果来自于“访存”阶段从存储器中读取出来的数据。
当然现代处理器为了更高性能,拥有非常深度的流水线。比如龙芯的3A5000,LA464的12级流水线为:PC、取指、预译码、译码I、译码II、寄存器重命名、调度、发射、读寄存器、执行、提交I、提交II(3A6000的LA664暂未看到相关数据)。
三、如何提升CPU频率
3.1、流水线拆分
多级流水线带来的直接好处就是将一整个组合逻辑拆分成多个,如果是10级流水线,那么流水线单个子组合逻辑门电路数量可以降低为原来的1/10左右(实际上因为流水线寄存器等原因,会增加少量门电路,另外流水线实际在划分的时候不可能均匀分布);如果是20级流水线,单个子组合逻辑门电路数量降低为原来的1/20左右,可以显著提升CPU频率。
流水线拆分,带来最直接的好处就是“关键路径”变短,延迟降低,意味着同工艺下频率可以大幅提升。
左边电路,是一个纯组合电路,它的路径延迟为23.0 ns。对这个电路进行流水线拆分优化后,得到右边所示的电路。将一个逻辑组合拆分为三个逻辑组合,降低电路延迟。
需要注意的是,流水线划需要在前端设计时就考虑,如中间的寄存器,需要在RTL代码中预置好。同时流水线拆分过细会带来IPC下降等负面作用,原因主要是:
1、流水线寄存器写入数据也是有延迟的,流水线过长会导致单条指令处理时间过长。以流水线章节那张图举例,如果我们不断加深流水线,这些操作占整个指令的执行时间的比例就会不断增加。最后,我们的性能瓶颈就会出现在这些overhead上。
如我们指令的执行有3纳秒,也就是3000皮秒。我们需要20级的流水线,那流水线寄存器的写入就需要花费400皮秒,占了超过10%。如果我们需要50级流水线,就要多花费1纳秒在流水线寄存器上,占到25%。这也就意味着,单纯地增加流水线级数,不仅不能提升性能,反而会有更多的overhead的开销。所以,设计合理的流水线级数也是现代CPU中非常重要的一点。
2、硬件电路上流水线带来的触发器延迟(输出延迟、建立时间)线性增加。对于大部分数字电路来说,逻辑可以粗略地大概分为两部分,即组合逻辑和触发器。触发器负责在时钟有效边沿到来的时候将数据采集下来,在时钟有效边沿没有到来的时候将数据保持住。于是乎,数据就一个周期一个周期地向后传递。传递过程中,数据流过组合逻辑,被组合逻辑进行运算、处理,然后再被下一级触发器采集到。 因此,大多数数字电路都可以简化为“前级触发器~组合逻辑~后级触发器”的结构。
在电路中,主要涉及到以下几种参数(只列出了和时钟频率有关的参数)
触发器:
输出延迟(Tc2q):时钟有效边沿到来后,数据从触发器输入被采集到输出所用的时间
建立时间(Tsetup):时钟有效边沿来之前,数据至少应该保持稳定的时间
组合逻辑:
组合逻辑延迟(Tcl)组合逻辑输入变化后,输出稳定到正确值所需要的时间
只考虑最理想情况,即组合逻辑延迟被n等分(即拆分未N个等分的流水线,当然实际情况不可能做到等分),同时假设电路工作在最高频率。因此,最小时钟周期就是:
Tmin=Tc2q+Tsetup+Tcl/n
由于电路处理时间由单周期变成了n周期,因此处理完一个数据(指令)所需要的时间就变成了:
n*Tmin=n(Tc2q+Tsetup)+Tcl
由此可见,在各自的极限频率下,打流水线后处理一笔数据(指令)所需要的时间不仅没有变短,还多了(n-1)(Tc2q+Tsetup)。
3、更长的流水线意味着分支预测失败带来的惩罚将更重,同时流水线过深会导致流水线停顿和冒险(某硬件不支持同时钟周期被多个资源访问,数据依赖或逻辑关系不被满足的情况、存在上下依赖的指令、跳转指令等),从而降低处理器的性能。
3.2、后端设计优化
后端通过后端设计优化(逻辑简化、门级重构、时序优化等)等方式优化CPU电路设计,甚至对于部分关键电路,可以通过手工布线方式优化整体延迟。
在CPU设计中,部分复杂的逻辑运算模块,它包含多个逻辑门和复杂的连接关系。在进行等效电路优化时,设计师可能会发现某些逻辑门是冗余的,或者某些连接关系可以简化。通过去除这些冗余的逻辑门或简化连接关系,可以减少整个模块的复杂性和延迟,提高CPU的性能和效率。
有兴趣可以参考文章:https://blog.csdn.net/weixin_43249158/article/details/123888942
例子一:重新排序运算符号(Reordering Operators):
RTL代码包含有电路的拓扑结构。HDL编译器从左到右解析表示式。括号的优先级更高。DC 中DesignWare 以这个次序作为排序的开始。
例如:表达式 S U M < = A ∗ B + C ∗ D + E + F + G SUM<= A*B+C*D+E+F+GSUM<=A∗B+C∗D+E+F+G,在DC中的综合的结构如下图所示:
电路的总延迟等于一个乘法器的延迟加上4个加法器的延迟。为了使电路的延迟减少,我们可以改变表达式的次序或用括号强制电路用不同的拓扑结构。如:
S U M < = E + F + G + C ∗ D + A ∗ B 或 S U M < = ( A ∗ B ) + ( ( C ∗ D ) + ( ( E + F ) + G ) ) SUM<=E+F+G+C*D+A*B\\ 或\\ SUM<=(A*B)+((C*D)+((E+F)+G))\\SUM<=E+F+G+C∗D+A∗B或SUM<=(A∗B)+((C∗D)+((E+F)+G))
这时得到的综合结构为:
电路的总延迟等于一个乘法器的延迟加上2个加法器的延迟,比原来的电路少了2个加法器的延迟。
例子二:边界优化
举例如下,对于下面的电路,既包含有组合逻辑电路又包含有寄存器(两个流水线组合逻辑):
后级的寄存器与寄存器之间的时序路径延迟为10.2 ns,而时钟周期为10 ns,因此,这条路径时序违规。但是前级的寄存器与寄存器之间的时序路径延迟为7.5 ns,有时间的冗余。使用optimize_registers命令,可以将后级的部分组合逻辑移到前级,使所有的寄存器与寄存器之间的时序路径延迟都小于时钟周期,满足寄存器建立时间的要求。需要注意的是这种优化一般是对时序的违规(timing violation)在时钟周期的25%以下时使用,如果超过25%一般需要重新修改前端RTL代码。
例子三:展平优化
把组合逻辑路径减少为两级,变为乘积之和(sum-of-products,简称SOP)的电路,即先与(and)后或(or)的电路,如下图所示:
展平优化后,组合逻辑关键路径由三级减少为两级,降低了延迟
3.3、工艺优化
CPU内部由无数晶体管组成,限制频率的本质原因是因为物理电路存在延迟,为什么会存证延迟,主要是因为晶体管存在寄生电容,而晶体管实现0-1开关翻转的时候必然涉及到电容的充放电,而这个充放电实际上是需要时间的,这个时间就是延迟产生的根本原因。
怎么样让寄生电容充电时间变短,一个是增加电压,另外一个就是降低电容容量。
前者我们再超频的时候就经常遇到,超频频率上不去的时候可以通过加电压,继续提升频率(比如有人一直很好奇为什么3a6000超频的时候明明功率还不是很高,超频的人却要加电压,本质就是因为这个原因)。
后者就是工艺改进,通过使用更先进的工艺,减少晶体管体积,从而降低电容容量。也因为寄生电容降低了,所以充放电需要的能量也降低,对外直观的另外一个表现先进工艺下功耗更低。
通过先进工艺降低硬件电路延迟,提升频率,这个大家在手机soc、Intel、AMD历代处理器中应该深有体会,不再赘述。
四、各种优化方式对频率的影响
4.1、流水线设计对频率以及IPC的影响
1、Intel将Northwood20级流水线架构(最高频率为3.06Ghz P4 90nm),设计调整为Prescott采用31级超长流水线,频率从3.06Ghz提升到3.8Ghz(P4 670 90nm);20级流水线和31级流水线情况下频率提升24%,后者称为高频低能的代表;
(这里会发现一个问题,当流水线过深后,继续增加流水线实际上带来频率的提升会变小,主要原因一个是寄存器、触发器的开销延迟,另外一个是流水线组合逻辑没法做到理论上的平均拆分)
2、Intel在2006年的奔4和酷睿两个处理器,奔4(Prescott核心)采用31级超长流水线,在65nm工艺下,最高频率做到3.8Ghz(P4 671,95W),但是后出来的酷睿E6800(Conroe核心),采用相对14级流水线设计,频率降低接近1/4,只有2.93Ghz(Core 2 Duo E6800,65W),IPC性能提升近一倍。这是一个非常典型的同工艺不同微架构设计的案例,缩短流水线长度,提升IPC,降低功耗;31级流水线和14级流水线情况下频率降低近30%,但是采用14级流水线的酷睿拥有比前者高80%的IPC性能;
3、均使用台积电的工艺,苹果M1、M2频率相对较低,采用12级短流水线设计,使用台积电5nm工艺的情况下最高频率只有3.5Ghz,但是AMD的Zen3频率就明显高的多,zen3采用18级流水线设计,比如采用台积电7nm工艺的5950X频率达到4.9Ghz;可以看到工艺落后一代的情况下,采用长流水线的Zen3频率比M2要高40%,当然IPC性能要低得多;
4、Intel 2-5代酷睿拥有14 - 19 级流水线,11代酷睿SunnyCove流水线深度为19级,12代酷睿大核一般认为是20级左右流水线,Intel CPU都拥有极高的频率,这和长流水线设计是分不开的;
5、龙芯的技术粉丝实际上也推测过龙芯流水线的设计,将12级流水线改为15级流水线,频率提升24%,参考:
注意:这里仅仅为推测,并不代表6000实际是这样实现的,纯粹是站在技术角度分析
技术性粉丝预测将LA464的12级流水线重新划分为15级,频率将提升24%左右
4.1、前后端设计小优化对频率的影响
需要注意的是,在工艺不变的情况下,对于成熟设计公司来说,3.2能带来的优化是比较有限的,我们可以通过观察Intel历史的挤牙膏来看一下,在工艺不迭代的情况下Intel如何艰难的提升频率:
从Intel公开的资料来看,Intel的14nm工艺有三代,分别是14nm、14nm+、14nm++工艺,对于桌面主流级处理器来说,使用初代14nm工艺的有Broadwell与Skylake(6700K 4.2Ghz),使用14nm+工艺的有Kaby Lake(7700K 4.5Ghz),而使用14nm++的则有Coffee Lake(8700K的4.7Ghz)、Coffee Lake Refresh(9900K 5.0Ghz)、Comet Lake(10900K 5.3Ghz)和Rocket Lake(11900K 5.3Ghz)。
可以看到Intel14nm++倒腾3年左右,工艺基本不变,Intel通过前后端设计优化,提升13%左右频率,将8700K的4.7Ghz提升到10900K的5.3Ghz。
整体架构不大改,前后端设计小优化需要大量流片迭代,Intel平均一年迭代提升4-5%左右性能(俗称挤牙膏),这个在ARM侧也可以看出来,比如A77、A78这种不大改的微架构,整体性能(包括IPC和频率)提升非常有限。
4.3、工艺对频率的影响
同一个微架构设计,工艺也会影响频率,虽然组合逻辑内电路是基本固定或高度类似的,但是先进工艺可以直接降低电容,降低晶体管寄生电容充放电时间,从而提升频率。典型的比如:
1、Intel 22nm的4790K最高频率为4.4Ghz,同款微架构工艺升级初代14nm的5775C实际上是个失败产品(这应该是个典型案例,因为新工艺不支持高频导致同一个微架构使用先进工艺反而频率降低的情况),频率才3.8Ghz,而类似微架构的6700K也才4.2Ghz,再到改良版本的14nm+ 7700K 到4.5Ghz,再改良的14nm++ 8700K的4.7Ghz;初代14nm和14nm++我们算为半代工艺,对频率的影响为12%;
2、Intel的2-4代酷睿均采用14-19级流水线设计,工艺从32nm提升到22nm,频率从2700K的3.9Ghz提升到4790K的4.4Ghz,工艺提升一代,频率提升12.8%;
3、麒麟980、麒麟990,大核心均为A76,工艺分别为duv 7nm和euv 7+工艺(应该算6nm),频率从980的2.6Ghz提升至2.86Ghz;半代工艺对频率影响为10%;
4、骁龙865、麒麟9000s,大核心均为A77,工艺分别为7nm和5nm,频率从2.84Ghz提升至3.13Ghz;先进一代工艺频率提升10%;
5、14nm的AMD Ryzen ThreadRipper 1950X(32核)最高频率4.0Ghz,10nm的AMD Ryzen Threadripper 2950X(32核)最高频率到4.4Ghz,两者均为Zen架构,半代工艺对频率影响为10%;
6、龙芯的3A4000的GS464和3A5000的LA464实际上是非常相似的微架构,工艺从28nm提升到12nm,流水线都是12级的情况下,频率从2.0Ghz提升到2.5Ghz,工艺提升两代,频率提升25%;
可以发现工艺换代的频率提升并没有想象中的大,同架构大概影响10-20%的频率(当然这里包含了部分后端设计的小优化)。
7、同样的,龙芯官方在问董秘环节中也透露过类似信息,官方在回复时指出,将龙芯12nm工艺换成新工艺(7nm)的情况下,性能能提升20-30%(12nm是14nm的半代升级工艺,前面还有10nm,再到7nm,实际上为1.5代工艺升级):
12nm升级到7nm,预测性能提升20-30%
五、结论
通过上述分析我们可以得出一个结论:加深流水线对提升频率帮助较大,但是流水线越深,IPC性能越差。抛开频率只用IPC衡量一个Fabless的设计能力也是欠妥当的。
而从目前资料推测分析,龙芯代工厂高概率是台积电(2020.7中芯国际的上市招股书中显示12nm工艺还在研发中,而3a5000在2020下半年已经开始流片),所以直接把5000和6000高频上不去的问题甩锅给工艺或者说流片过少,实际上并不合适(当然龙芯官方显然是知道自己频率上不去的核心原因是因为架构设计,而不是工艺,否则也不会有上面这张图片中的回复),从AMD、苹果芯片看,虽然台积电无法像Intel一样追求极致的高频,12nm到4.0Ghz台积电应该是没有问题的(AMD锐龙 3400G 最高睿频4.2Ghz,现场撕裂者2950x最高频率4.4Ghz,均采用台积电12nm工艺)。
型号 内核代号 流水线深度 频率 功耗 工艺
3A1000 GS464 4发射 9级 1Gzh 15W 65nm
3A2000 GS464E 4发射 12级 1Ghz 15W 40nm
3A3000 GS464E 4发射 12级 1.5GHz 30W 28nm
3A4000 GS464V 4发射 12级 2.0Ghz 40W 28nm
3A5000 LA464 4发射 12级 2.5Ghz 40W 12nm
3A6000 LA664 6发射 12级(推测) 2.5Ghz 40W 12nm
从龙芯的研发历史看,12nm工艺不是首次使用(LA464在3A5000、3C5000最少四次流片,3A6000最少也是第五次流片),同时12级流水线后端的优化应该是有一定经验的,从1Ghz优化到2.5Ghz,所以可以认为龙芯目前的LA664是个有一定成熟度的内核,但是后端设计应该达不到6、7代酷睿如6700K、7700K的成熟度水平。
6000的频率提升不上去更多是龙芯设计侧采取短流水线、高IPC的技术选择原因,预测如果不大改流水线的情况下,采用7nm先进工艺,后端持续优化的情况下预计全核频率能到3.3-3.5Ghz(全核频率,LA664核心成熟度不高,尤其是后端设计,其次按官方说辞提升20-30%),单核睿频加0.2-0.3Ghz也是完全可能,当然这对龙芯目前的后端设计是一个不小的挑战。
当然如果龙芯更加激进一点,放弃小部分IPC,重新规划流水线,比如把流水线加深到15或16级以上,我相信频率会有更大的提升。