如今,许多人说RISC和CISC之间的区别变得无关紧要。真的吗?如果不是,那么现代RISC和CISC CPU之间到底有什么区别?
Apple现在已经发布了M1 Apple Silicon芯片,经过一番摸索,您可能想知道它与Intel或AMD处理器有何不同?您可能听说过M1被称为ARM处理器,而ARM是所谓的RISC处理器,与Intel和AMD的x86处理器不同。
如果您想了解RISC和CISC微处理器之间的区别,您会听到很多人告诉您RISC和CISC不再重要。它们本质上是相同的。但这是真的吗?
好吧,所以您很困惑,您想要一些直接的答案。好吧,那么本文是您开始的正确地方。
我经过大量评论并为此撰写了文章,有时是由创建这些芯片的工程师自己撰写的,因此您不必在此上浪费时间。
首先,在开始回答一些更深层次的问题(例如RISC vs CISC)之前,我将首先介绍一些您必须了解的基础知识。我将成为头条新闻,因此您可以跳过已经知道的内容。
让我们澄清一下微处理器是什么。您可能已经有了一些主意,否则您将无需单击本文。
CPU基本上是计算机的大脑。它从内存中读取指令,告诉计算机该怎么做。这些说明只是数字,必须以特定的方式进行解释。
内存中没有任何东西可以将数字标记为数字或特定的指令。而是由操作系统和程序的制造者来确保将指令和数据放入CPU期望找到程序代码和数据的位置。
微处理器(CPU)做非常简单的事情。这是CPU遵循的一种指令示例:
这是人类可读的形式,只是计算机中的数字列表。例如,负载r1在典型的RISC CPU中将由单个32位数字表示。这表示一个包含32位数字的数字,其中每个数字必须为0或1。
在第一行加载时,将存储单元150的内容移至寄存器r1。您的计算机内存(RAM)是数十亿个数字的集合。这些数字中的每一个都有一个地址(位置),以便CPU有一种选择正确的数字的方式。
接下来,您可能想知道什么是寄存器。这实际上是一个非常古老的概念。便利店中的旧机械收银机也有收银机的概念。那时的收银机是某种机械装置,可以存放您要操作的号码。通常它会有一个累加器寄存器,您可以向其中添加值。它将跟踪总和。
您的电子计算器是相同的。大部分时间在显示屏上看到的是累加器的内容。您进行了大量影响累加器内容的计算。
CPU是一样的。它们有许多寄存器,通常使用简单的名称,例如A,B,C或r1,r2,r3,r4等。CPU指令通常在这些寄存器上执行操作。它们可以将两个数字加在一起存储在不同的寄存器中。
在我们的示例中,将r1和r2相加,将r1和r2的内容相加,并将结果存储在r1中。
最后,我们要使用存储区r1 310将结果存储在内存(RAM)中,该存储区将结果存储在地址为310的存储单元中。
可以想象,CPU可以理解的指令数量有限。如果您熟悉可以定义自己的函数的常规编程,那么机器代码就不是这样。
CPU可以理解固定数量的指令。您作为程序员不能添加到该集合中。
有很多不同的CPU,它们并不都使用相同的指令集。这意味着他们不会以相同的方式解释指令的数字。
在一个CPU体系结构中501012可能意味着添加r10,r12,而在另一体系结构中可能意味着加载r10、12。CPU理解的指令和它所知道的寄存器的组合称为指令集体系结构(ISA)。
英特尔和AMD芯片,例如都了解x86 ISA。虽然苹果在其iPhone和iPad设备中使用的芯片(例如A12,A13、14等)都了解ARM ISA。现在我们可以将M1添加到该列表中。
这些芯片就是我们所谓的Apple Silicon。他们像许多其他手机和平板电脑一样使用ARM ISA。甚至任天堂等游戏机和世界上最快的超级计算机也使用ARM ISA。
x86和ARM不可互换。除非是JavaScript,Java,C#或类似程序,否则将为特定的ISA编译计算机程序。在这种情况下,程序被编译为字节代码,这是类似CPU的ISA,但对于实际上并不存在的CPU。您需要即时编译器或解释器,以将此组合指令集转换为计算机CPU中使用的实际指令集。
这意味着Apple Macs上的大多数当前程序都不会在新的基于Apple Silicon的Macs上开箱即用。当前程序由x86指令组成。为了解决这个问题,必须为新的ISA重新编译程序。而Apple拥有Rosetta 2的优势,该程序可以在运行之前将x86指令转换为ARM指令。
现在下一个问题是。为什么要为Mac使用新的ISA?苹果为什么不让他们的Apple Silicon理解x86指令?无需使用Rosetta 2重新编译或翻译。
好吧,事实证明并非所有指令集都相等。 CPU的ISA在很大程度上影响您可以如何设计CPU本身。您使用的特定ISA可能会使创建高性能CPU或功耗很小的CPU的工作复杂化或简化。
第二个问题是许可。 Apple无法使用86 ISA自由地制造自己的CPU。它是英特尔知识产权的一部分,他们不想要竞争对手。相比之下,ARM公司实际上并没有构建自己的CPU。他们只是设计ISA,并为实现该ISA的CPU提供参考设计。
因此,ARM使您几乎可以完全按照自己的意愿做。这就是苹果想要的。他们希望为计算机创建量身定制的解决方案,并使用专门的硬件处理诸如机器学习,加密和面部识别之类的事情。如果使用x86,则必须在外部芯片上进行所有操作。出于效率方面的考虑,Apple希望在一个大型集成电路或所谓的片上系统(SoC)中完成所有这些工作。
这是从智能手机和平板电脑开始的发展。它们太小,无法在大型主板上具有许多不同的独立芯片。相反,他们必须将通常分布在一个主板上的所有东西集成到一个芯片中,该芯片包含CPU,GPU,内存和其他专用硬件。
现在,这种趋势已经出现在笔记本电脑上,并且可能稍后会出现在台式机上。紧密的集成提供了更好的性能,在这里x86及其僵化的许可方案是一个很大的缺点。
但是,让我们不要偏离本文的主要内容:RISC vs CISC。指令集体系结构倾向于遵循不同的核心哲学来定义ISA。 x86是我们所谓的CISC架构。而ARM遵循RISC哲学。那有很大的不同。因此,让我们深入研究关键区别。
CISC代表复杂指令集计算机,而RISC代表精简指令集计算机。
要解释今天的差异,要比RISC初次问世时要困难得多,因为RISC和CISC处理器都相互盗取了思想,并且开展了一场激烈的营销活动,目的是模糊区分。
保罗·德曼(Paul DeMone)早在2000年就撰写了这篇文章,对早期发展的营销压力给出了一些想法。
早在1987年,顶级x86处理器是Intel 386DX,而顶级RISC处理器是MIPS R2000。
尽管intel处理器的晶体管数量更多,在MIPS上为275 000 vs 11.5万,并且具有两倍的高速缓存,但是x86处理器在性能测试中被完全拆除。
两种处理器均以16 MHz的时钟速率运行,但是RISC处理器的性能要高出2-4倍,具体取决于所使用的基准。
因此,到90年代初,RISC处理器的性能大大提高已成为人们普遍接受的想法就不足为奇了。
因此,英特尔开始在市场上出现认知问题。他们很难说服投资者和买家他们过时的CISC设计可以击败RISC处理器。
因此,英特尔开始将其芯片作为RISC处理器进行营销,并在其前面进行了简单的解码,从而将CISC指令转换为RISC指令。
因此,英特尔可以以吸引人的方式展示自己:他们会说,使用我们的芯片,您仍然可以获得技术上更先进的RISC处理器,但是我们的RISC处理器能够理解您已经知道并喜欢的x86指令。
但是,让我们立即进行澄清:x86芯片中没有RISC内部结构。那只是营销策略。英特尔奔腾Pro的主要创造者之一鲍勃·科威尔斯(Bob Colwells)被认为是内置RISC的芯片,这一点很明显。
但是,您会看到这种虚假信息在整个Internet上传播,因为英特尔确实擅长推动这种营销策略。之所以有效,是因为其中包含了一些事实。但是,为了真正理解RISC与CISC,您必须首先摆脱这个神话。
认为CISC处理器内部可以装有RISC处理器,只会使您对RISC和CISC之间的区别感到困惑。
好的,不用担心,让我们看一下RISC和CISC的真正含义。两者都是关于如何设计CPU的哲学。
让我们开始看看CISC的哲学。由于我们标记为CISC的芯片具有多种设计,因此CISC很难确定。但是我们仍然可以谈论一些常见的模式。
早在1970年代末CISC处理器开始开发时,内存仍然非常昂贵。编译器也确实很糟糕,人们倾向于手工编写汇编代码程序。
因为内存很昂贵,所以您需要找到保存内存的方法。这样做的方法是想出功能强大的CPU指令,可以完成很多工作。
这也有助于汇编程序员,因为他们可以更轻松地编写程序,因为总有一些指令可以完成他们想要的事情。
一段时间后开始,这变得非常复杂。为所有这些指令设计解码器变得很麻烦。他们最初解决此问题的一种方法是发明微码。
在程序中,您知道可以将重复的任务放在单独的子例程(函数)中,从而避免重复执行这些任务。
微码的想法与此类似。对于ISA中的每条机器代码指令,您都会制作一个小程序,该程序存储在CPU内部的特殊存储器中,该程序由简单得多的指令(称为微码)组成。
因此,CPU将具有一小组简单的微码指令。然后,他们可以通过简单地在CPU内添加新的小型Microcode程序来添加许多高级ISA指令。
这样做还有一个好处,就是保存这些微代码程序的存储器是只读存储器(ROM),当时它比RAM便宜得多。因此,以增加ROM使用量为代价来减少RAM使用量是一种经济上的权衡。
因此,一段时间以来,CISC领域的一切看起来都非常好。但是最终他们开始遇到问题。所有这些微代码程序都成为要解决的问题。有时他们会犯编程错误。修复带有错误的微代码程序比修复常规程序中的错误要麻烦得多。您无法像访问和测试常规软件一样访问和测试该代码。
有些人开始思考:必须有一种更简单的方法来处理这种混乱!
RAM开始变得越来越便宜,编译器变得越来越好,人们不再用汇编代码进行编程了。
他们通过分析程序开始观察到,添加到CISC的复杂指令很少被人们使用。
编译器作者还发现很难选择这些复杂的指令之一。相反,他们更喜欢结合更简单的说明来完成工作。
您可以说我们有80/20规则的情况。大约80%的时间用于执行20%的指令。
因此,RISC的想法是:让我们放弃复杂的指令,并用更少的简单指令代替它们。而不是调试和修复很难的微码程序。您将其留给编译器作者解决。
对于“精简”一词应解释为与RISC有关,有些争议。它被解释为减少了指令数量。但是更合理的解释是,这意味着降低了指令的复杂性。意味着说明本身变得更简单。从用户的角度看,这并不一定意味着简单,而是在硬件中实现更简单,并且最好同时利用很少的CPU资源。
RISC代码不一定适合人类编写。多年前我犯了一个错误,当时我以为可以节省使用PowerPC指令(带有大量指令的IBM RISC体系结构)编写汇编代码的时间。它给了我很多额外的工作和挫败感。
RISC背后的关键原理之一是人们停止了手写汇编代码,而您需要一个易于编译器处理的指令集。 RISC针对编译器进行了优化,而未必针对人类。
尽管特定的RISC指令集在某种程度上可以让人类更容易编写,因为要学习的指令要少得多。另一方面,与使用CISC指令集相比,通常必须编写更多的指令。
RISC的另一个核心思想是流水线。让我给您一个简单的类比,以为这是一个动机。
想想在杂货店购物。现在,这在每个国家/地区都略有不同,但是我将基于它在我的祖国挪威的运作方式。您可以通过多个步骤在收银机中划分活动:
如果这是大多数CISC处理器最初采用的非流水线方式,那么下一个客户就不会开始将杂货放在传送带上,直到您将所有杂货打包好并离开为止。
这是低效的,因为打包时可以使用传送带扫描物品。您甚至可以在打包时使用付款终端。因此资源被利用不足。
我们可以将每个步骤视为一个时钟周期或时间单位。这意味着处理每个客户需要3个时间单位。因此,在9个时间单位中,您只处理了3个客户。
但是我们可以通过管道进行此过程。一旦我开始操作付款终端,下一位客户便可以将他们的食品放在传送带上。
当我开始打包时,此客户可以使用我刚刚使用的付款终端。此时,第三位客户可以开始将杂货放在传送带上。
这种方法的结果是,每个单位有人将完成包装并随身携带食品杂货。因此,您将以9个时间单位处理6个客户。随着时间的增加,由于流水线化,您将接近在1个时间单位内处理一位客户。那是9倍的加速。
我们可以将收银机描述为具有3个时间单位的延迟,但每1个时间单位一次购物的吞吐量。
用微处理器术语,这意味着1条指令的等待时间为3个时钟周期,但平均吞吐量为每个时钟周期1条指令。
现在,我在此示例中做出了很多假设,即结帐的每个阶段花费的时间相同。将杂货放在传送带上的时间大约与操作付款终端或包装杂货的时间相同。
如果每个阶段的时间相差很大,则效果不佳。例如。如果某人在传送带上有很多杂货,则支付终端和包装区域在很多时间都未使用,这会降低整体效率。
RISC设计师了解这一点。因此,他们试图标准化每条指令的时间长度,并将一条指令的工作分成大致相同时间的多个阶段。这样,随着指令的处理,CPU内部的每个资源都可以不断地最大化利用。
例如。如果我们看一下ARM RISC处理器,它有一个5级管道来处理指令:
从存储器中获取指令并更新程序计数器,以便能够在下一个时钟周期获取下一条指令。
解码指令。弄清楚它应该做什么。这意味着激活各种电线以切换我们用来执行指令的CPU的不同部分。
内存访问内存中的数据(如果相关)。这就是加载指令的作用。
ARM指令的各个部分分别处理这些部分,每个阶段通常需要1个时钟周期。这使得通过管道推送ARM指令变得容易。
例如。因为每个指令的大小相同,所以Fetch阶段知道如何获取下一条指令。不需要先解码。
使用CISC指令是很棘手的。指令可以是可变长度的。因此,直到您解码了下一条指令所在的部分后,您才真正知道。
第二个问题是CISC指令可能具有任意复杂性。进行多个内存访问并执行全部操作,这意味着您无法轻松地将CISC指令划分为可以分阶段执行的干净独立的部分。
流水线是杀手级功能,确实导致早期的RISC处理器破坏了其CISC同类产品的性能。
为了使每条指令所需的周期数相对统一和可预测,以使所有内容都流水线友好,RISC ISA与其他指令清楚地将加载和存储分开。
在CISC中一条指令可以从内存中加载数据,执行加法,乘法或其他操作,然后将结果写回内存。
在RISC世界中,这通常是一个很大的禁忌。 RISC操作(例如加,移位,乘等)通常仅在寄存器上起作用。他们不访问内存。
这对于管道正常工作很重要。否则,管道中的指令可以获取它们之间的各种依赖性。
相对于CISC而言,RISC面临的一大挑战是使用更简单的指令需要更多的指令,而内存虽然不昂贵,但速度较慢。如果RISC程序最终消耗的内存比CISC程序大得多,则运行起来可能会慢得多,因为CPU一直在等待慢速的内存读取。
RISC设计人员进行了一些观察以解决此问题。他们观察到,许多指令实际上只是将数据移入和移出内存,以准备进行不同的操作。通过拥有更多的寄存器,它们可以减少必须将数据写回内存的次数。
这确实需要对编译器进行改进。编译器必须很好地分析程序,并了解何时可以将变量保存在寄存器中以及何时必须将其写回内存。处理大量寄存器已成为编译器使RISC CPU快速运行的重要任务。
因为RISC指令更简单。没有太多不同的寻址模式要处理,例如在整个32位指令中,有更多位可用于指定寄存器的编号。
了解这一点很重要。一个CPU可以轻松拥有数百个
......