当前位置: 首页 > 科技观察

都2021年了,x86和ARM还分CISC和RISC?

时间:2023-03-21 11:49:36 科技观察

CISC和RISC于1981年由DavidPatterson和DavidDitzel正式提出,四十年过去了,两者的发展又发生了什么样的融合和变化?IT新闻资深人士JoelHruska写了一篇长篇文章,详细介绍了该领域的历史及其面临的挑战,这里是全文。随着基于ARM的M1的推出,关于x86和ARM的比较和讨论也越来越多。这些讨论通常还涉及CISC和RISC,因为“x86和ARM”与“CISC和RISC”密切相关。但这种联想却造成了一种误解:“x86和ARM可以归为CISC和RISC,其中x86是CISC,ARM是RISC”,三十年前是这样,现在不是了。人们经常将x86CPU与其他公司制造的处理器进行比较,但x86近二十年来一直没有真正的架构竞争对手。RISC是DavidPatterson和DavidDitzel在他们1981年的开创性论文《The Case for a Reduced Instruction Set Computer》中创造的一个术语。他们根据20世纪70年代末该领域的发展趋势和当时CPU面临的微缩问题,正式提出了RISC这一半导体设计方法。此外,他们还想出了另一个术语“CISC(复杂指令集)”来描述许多已经存在但没有遵循RISC原则的CPU架构。随着限制CPU性能的瓶颈发生变化,人们意识到需要一种新的CPU设计方法。最初的8086是遵循CISC设计原则的一个例子,旨在通过将复杂性卸载到硬件中来减轻内存的高成本。这种方法强调代码密度和某些按顺序对变量执行多个操作的指令。作为一种设计理念,CISC试图通过最小化CPU执行给定任务所需的指令数来提高性能,其指令集架构通常会提供一些专门的指令。在20世纪70年代后期,CISCCPU有很多缺点。它们通常必须跨多个芯片实施,因为当时的超大规模集成(VLSI)技术无法将所有必要的组件封装在一起。实现支持大量很少使用的指令的复杂指令集架构会消耗裸片空间并且具有有限的最大可实现时钟速度。与此同时,内存成本不断降低,代码大小变得不那么重要了。Patterson和Ditzel认为,当时CISCCPU仍在努力解决代码膨胀问题,他们意识到绝大多数CISC指令都没有被使用。因此,他们想出了一种完全不同的处理器设计方法——一种更小的指令集RISC,其中指令的长度是固定的,并且可以在一个时钟周期内全部执行。尽管RISCCPU每条指令执行的工作量比CISCCPU少一些,但芯片设计人员通过简化处理器来弥补这一点。这种简化允许晶体管预算用于其他功能,例如一些额外的寄存器。1981年设想的未来功能包括片上缓存、更大更快的晶体管,甚至流水线技术。RISCCPU的目标是尽可能快地执行指令,增加IPC(即每个时钟周期执行的指令数,用来衡量CPU的效率)。Patterson和Ditzel认为,通过以这种方式重新分配资源,RISC最终将超越CISC。很快这个猜想就得到了证实。MIPS于1985年推出的R2000在某些情况下能够保持接近1的IPC。SPARC和HP的PA-RISC系列等早期RISCCPU创造了性能记录。在80年代末和90年代初,人们常说,“x86等基于CISC的架构已经过时,也许对家庭计算来说已经足够好了,但如果你想要一个真正的CPU,请购买RISC芯片”。以数据中心、工作站和高性能计算(HPC)为例:注:这里的“Intel架构”仅指x86CPU,而不是早期计算机市场流行的8080等芯片。此外,英特尔在2000年拥有多款“RISC”类别的超级计算机,x86机器也占有较大的市场份额。上图分析了80-00年代CPU的市场状况。截至1990年,在个人电脑市场,x86占有相当大的市场份额,非x86CPU仅占20%左右;但是在数据中心,x86几乎没有份额,在HPC中也没有。当时,苹果正准备设计下一代CPU。1991年,苹果、IBM、摩托罗拉组成的AIM联盟推出了微处理器架构PowerPC。他们认为,根据RISC原理构建的高性能CPU将是计算机的未来。直到1990年代初期,CISC和RISC才并肩发展。虽然英特尔的x86架构继续主导PC、数据中心和HPC等计算行业这一事实是无可争辩的,但争论的焦点是英特尔和AMD的CPU架构是否真的使用RISC设计原则来实现。在CPU开发领域,一些概念和属性划分了很长时间。例如,PaulDeMone在《RISC vs. CISC Still Matters》中写道:随着使用固定长度控制字来操纵乱序执行数据路径的现代x86处理器的出现,RISC和CISC之间的混淆越来越多。“RISC和CISC正在合并”是一个从根本上有缺陷的想法,可以追溯到1992年i486的发布。其根源在于对指令集架构和物理处理器实现细节之间差异的普遍忽视。相比之下,JonStokesin《RISC vs. CISC: the Post-RISC Era》:显然到目前为止,缩写术语“RISC”和“CISC”掩盖了这样一个事实,即设计哲学所涉及的不仅仅是指令集的简单性或复杂性......考虑到历史,这两个术语都是荒谬的RISC和CISC以及这两种方法试图解决的问题……“RISCvsCISC”辩论早已结束,现在必须是基于硬件和软件、ISA和实现的更加细致和有趣的讨论。然而,这些文章已经过时了。Stokes的文章写于1999年,DeMone的文章写于2000年。这里引用他们的文章来说明RISC已经与CISC和现代计算联系了20多年。关于实现与ISA的两种观点上面提到的引用反映了对“CISC与RISC”的两种不同观点。DeMone的观点与今天的ARM和Apple基本一致。这种观点被称为“以ISA为中心的立场”。几十年来,斯托克斯的观点一直是PC领域的主流观点,被称为“以实现为中心的立场”。我使用“实现”一词是因为它可以在上下文中指代CPU的微体系结构或用于制造物理芯片的工艺节点。以上两个位置都是用“中心”的形式来描述的,两者的观点是有交集的。尽管意见不同,但它们都遵循一些共同的趋势。从以ISA为中心的观点来看,RISC指令集的某些固有特性使其比x86更高效,包括使用固定长度指令和加载/存储设计。虽然CISC和RISC之间的一些原始差异不再有意义,但以ISA为中心的观点认为x86和ARM在性能和能效方面仍然存在一些关键差异。以ISA为中心的观点认为,英特尔、AMD和x86优于MIPS、SPARC和POWER/PowerPC的原因有以下三个:英特尔优越的制程制造、英特尔在逐步降低所谓“CISC税”方面的优势、二进制兼容性性能提高了x86的值。以实现为中心的观点着眼于自RISC、CISC等术语出现以来现代CPU是如何演变的,并认为这两个术语已经完全过时了。例如,现在x86和高端ARMCPU都使用乱序执行来提高CPU的性能。虽然使用芯片即时重新排序指令以提高执行效率与RISC的原始设计理念不一致,但Patterson和Ditzel主张使用能够以更高时钟速度运行的不太复杂的CPU。现代ARMCPU还具有一些在1981年也不存在的功能,例如SIMD执行单元和分支预测。RISC的最初目标是所有指令在一个周期内执行,大多数ARM指令都符合这一规则,但ARMv8ISA和ARMv9ISA包括在一个以上时钟周期内执行的指令。现代x86CPU也是如此。以实现为中心的观点是,工艺节点改进和微体系结构增强的结合使x86很久以前就缩小了与RISCCPU的差距,并且ISA级别差异在非常低的功率范围内无关紧要。Intel、AMD等普遍支持这个观点,我在2014年写过一篇相关文章,题目是《The final ISA showdown: Is ARM, x86, or MIPS intrinsically more power efficient?》。2014文章链接:https://www.extremetech.com/extreme/188396-the-final-isa-showdown-is-arm-x86-or-mips-intrinsically-more-power-efficient但是这个观点完全是正确的?RISC和CISC的发展是否趋于一致?以实现为中心的观点认为,CISC和RISCCPU已经交互发展了几十年,从1990年代中期x86CPU采用“类RISC”解码方法开始。常见的解释是这样的:在1990年代初期,英特尔和其他x86CPU制造商意识到,未来CPU性能的提升需要的不仅仅是更大的缓存和更快的时钟。几家公司决定投资于x86CPU微体系结构以动态重新排序他们自己的指令流以提高性能。在此过程中,原生x86指令被送入x86解码器并在执行前转换为“类RISC”微操作。二十多年来,这一直是业界的观点,但最近受到了挑战。2020年ErikEngheim写道:“x86芯片中根本没有RISC内部结构,这只是一种营销策略。”他还提到了DeMone的故事和P6微架构背后的首席架构师BobColwell的话。P6微架构是第一个实现乱序执行和原生x86到微操作解码引擎的英特尔微架构。P6与PentiumPro一起发布,后来演变成PentiumII、Pentium3和更高版本。它是现代x86CPU的鼻祖。因此,P6微架构首席架构师BobColwell有资格解释上述挑战,称Intel的x86在“引擎单板”下并没有RISC引擎。他们依靠将x86指令映射到机器操作或解码/执行复杂指令的机器操作序列的方案来实现x86指令集体系结构,然后通过微体系结构找到自己的方式,遵守有关数据依赖性的各种规则,并最终确定定时。完成这个过程的“微操作”有100多位,承载着各种复杂而具体的信息,编译器不能直接生成,也不一定是单循环。但归根结底,它们只是一种微架构技巧,而RISC/CISC是关于指令集架构的。微操作的思想不是受RISC启发,“类RISC”,或者与RISC完全无关。相反,我们的设计团队找到了一种方法来突破非常复杂的指令集的复杂性和竞争微处理器中存在的限制。英特尔并不是第一家将x86前端解码器与所谓的RISC式后端相结合的x86CPU制造商,被AMD收购的NexGen也是如此。NexGen5×86CPU于1994年3月首次亮相,而PentiumPro直到1995年11月才问世。NexGen对其CPU的描述如下:Nx586处理器是NexGen创新和获得专利的RISC86微体系结构的首次实施。该公司后来给出了更多实现细节:RISC86方法将x86指令动态转换为RISC86指令。如下图所示,Nx586利用了RISC性能原理。由于RISC86环境的限制,每个执行单元必须更小更紧凑。也许人们仍然觉得这只是一种营销说辞,那么让我们看看1996年的AMDK5。K5通常被描述为x86前端与AMD从其32位RISC微控制器中借用的执行后端,即Am29000。在看它的具体框图之前,我们先把它和原来的IntelPentium比较一下。Pentium可以说是CISCx86进化的巅峰之作,因为它在x86CPU中同时实现了流水线和超标量设计(superscaling),但没有将x86指令转化为微操作,缺乏乱序执行引擎。AMDK5框图如下所示:如果你研究过微处理器原理图,你可能会注意到K5与微处理器有很多相似之处,而Pentium则相反。Nx586上市后,AMD收购了NexGen。K5是AMD自己设计的,而K6本来就是NexGen的产品。也是从那时起,CPU就成了我们今天所熟悉的东西。设计芯片的工程师表示,相似之处不仅仅是表面上的。早在1996年,AMD的DavidChristie就在IEEEMicro上发表了一篇关于K5的文章,解释了K5是如何结合RISC和CISC的。这是文章中的引述:我们基于29000指令集开发了一个松散的微型ISA。一些额外的控制字段将uop的大小扩展到59位。其中一些简化并加速了超标量控制逻辑,另一些用于提供x86特定功能,这些功能对性能至关重要,无法与微指令序列合成。但这些微指令仍然遵循基本的RISC原则:简单的寄存器到寄存器操作,寄存器说明符和其他字段的固定位置编码,每个操作不超过一个内存引用。所以我们称它们为RISC操作,或简称为ROP。这种简单、通用的特性为实现更复杂的x86操作提供了灵活性,有助于保持执行逻辑相对简单。RISC微架构的关键点是x86指令集的复杂性止于解码器,对乱序执行核心在很大程度上是透明的。这种方法需要非常少的额外控制复杂性,而不需要乱序RISC执行来实现乱序x86执行。任务切换的ROP序列看起来并不比简单指令字符串复杂。执行核心的复杂性与架构的复杂性有效分离,而不是复合。Christie没有混淆ISA和CPU物理实现细节之间的区别。他认为物理实现本身在某些重要方面类似于RISC。K5重用了AMD为其Am29000系列RISCCPU开发的部分执行后端,它实现了一个比原生x86ISA更像RISC的内部指令集。在此期间,NexGen和AMD引用的RISC式技术引用了数据缓存、管道和超标量架构等参考概念。这些想法都不是严格的RISC,但它们都首先出现在RISCCPU中,将这些功能作为“类RISC”进行营销是有道理的。这些功能与RISC的相关性如何,以及x86CPU是否解码RISC风格的指令,取决于所选的框架标准。尽管P6是与无序执行引擎等技术发展最相关的微体系结构,但这场争论比PentiumPro更大。来自不同公司的工程师有自己的看法。现代x86CPU的压力那么这种“RISC与CISC”比较对当今的ARM和x86CPU有什么实际影响?当我们将AMD和英特尔CPU与苹果的M1和未来的M2进行比较时,我们真正要问的问题是:x86中是否存在某些瓶颈阻止它有效地与苹果和高通等公司未来的ARM芯片竞争?AMD和Intel给出的答案是否定的,而ARM给出的答案是肯定的。业内公司之间存在明显的利益冲突,因此我请教了丹麦计算机科学家AgnerFog,他以在x86架构和微架构方面的工作而闻名。他认为ISA并非微不足道。x86ISA很复杂,因为随着时间的推移,人们一直在进行小的更改和补丁以向ISA添加更多功能,而ISA中确实没有空间容纳这些新功能。复杂的x86ISA使解码成为瓶颈。x86指令的长度在1到15个字节之间,计算长度非常复杂。在开始解码下一条指令之前,需要知道一条指令的长度。如果你想在每个时钟周期解码4或6条指令,这绝对是个问题!Intel和AMD现在都在添加微操作缓存来克服这个瓶颈。另一方面,ARM有固定大小的指令,所以这个瓶颈不存在,也不需要微操作缓存。x86的另一个问题是它需要很长的管道来处理复杂性。分支预测错误的惩罚等于流水线的长度。因此,他们正在使用大型分支历史表和分支目标缓冲区添加越来越复杂的分支预测机制。当然,所有这些都需要更多的芯片空间和更多的功耗。尽管有这些负担,x86ISA还是相当成功。这是因为它可以为每条指令做更多的工作。Agner还在他的微体系结构手册中写道:AMD和IntelCPU设计的最新趋势已经回归到CISC原则,以更好地利用有限的代码缓存、增加流水线带宽,并通过在流水线中维护更少的微体系结构。减少功耗的操作次数。这些改进代表微架构转变,提高了x86的整体性能和能效。一个重要的问题仍然存在:现代AMD和IntelCPU为x86兼容性支付了多少费用?Agner提到的解码瓶颈、分支预测和流水线复杂性是ARM认为x86产生的“CISC税”的一部分。过去,英特尔和AMD曾告诉我们,解码能力仅占芯片总功耗的一小部分。但是,如果CPU正在为微操作缓存或复杂的分支预测器花费能量来弥补解码带宽的不足,那么意义就不同了。微操作缓存能力和分支预测能力均由CPU的微架构及其制造工艺节点决定。“RISCvs.CISC”没有充分体现这三个变量之间关系的复杂性。苹果的M1和高通未来的CPU是否代表着市场的翻天覆地的变化,以及AMD和英特尔是否会面临下一个挑战,可能还需要几年的时间。维护x86兼容性是否是现代CPU的负担既是一个新问题,也是一个非常古老的问题。这是一个新问题,因为在M1之前无法进行有意义的比较,这是一个老问题,因为在x86CPU首次推出时,一些个人计算机继续使用非x86CPU,使这个话题成为一个话题。相当多的讨论。AMD还在以每年1.15到1.2倍的速度提升Zen,Intel的AlderLake也会使用低功耗的x86CPU内核来改善功耗,两家x86厂商都在不断改进自己的方法。这些内核及其后续产品如何与未来的Apple产品竞争还需要一些时间,但x86从未退出过游戏。回到最初的问题:为什么将x86和ARMCPU与RISC与CISC进行比较是错误的?当Patterson和Ditzel创建RISC和CISC时,他们着手说明两种不同的CPU设计策略。四十年过去了,这些条款既模糊又明确。RISC和CISC并非没有意义,但这两个术语的含义和适用性已经高度语境化。使用RISC与CISC比较现代x86和ARMCPU的问题是:它需要3个对x86和ARM很重要的特定属性——进程节点、微体系结构和ISA——将这3个属性结合在一起,然后才能声明ARM优于ISA。“以ISA为中心”与“以实现为中心”是一种更好的理解方式,但前提是需要记住两者之间的关系。具体来说:以ISA为中心的观点认为制造几何和微体系结构很重要,并促成了x86曾经在PC、服务器和HPC市场占据主导地位。论点是,当制造能力和安装基础的优势受到控制或消除时,RISC(以及因此的ARMCPU)通常优于x86CPU。从以实现为中心的角度来看,ISA确实很重要,但从开发的角度来看,微架构和进程几何更重要。目前,英特尔正在努力缩小一些行业差距,而AMD正在努力改进Ryzen(尤其是在移动领域)。但从历史上看,这两家x86制造商都展示了与RISCCPU制造商有效竞争的能力。考虑到CPU设计周期的现实情况,我们还需要几年的时间才能真正得出哪种观点更好的答案。今天的半导体市场与20年前的市场有一个区别:台积电是比英特尔在1990年代末和2000年代初面对的大多数RISC制造商更强大的晶圆代工竞争对手。英特尔的7nm团队不得不承受巨大的压力。RISC与CISC是了解这两种不同类型CPU之间差异的起点,而不是它们今天如何比较的准确基础。