Answers:
有一个普遍的历史趋势。
在过去,记忆很小,因此程序的执行力很小。另外,编译器不是很聪明,许多程序都是用汇编器编写的,因此能够使用很少的指令编写程序被认为是一件好事。指令流水线很简单,处理器一次抓取一条指令来执行它。无论如何,处理器内部的机器非常复杂。解码指令并不是很大的负担。
在1970年代,CPU和编译器设计人员意识到拥有如此复杂的指令毕竟没有那么大的帮助。很难设计出真正有效的处理器,也很难设计出真正利用这些指令的编译器。芯片面积和编译器复杂性最好花在更通用的追求上,例如更多的通用寄存器。RISC上的Wikipedia文章对此进行了更详细的说明。
MIPS是终极的RISC体系结构,这就是为什么它经常被教导。
该86家是有点不同。它最初是CISC体系结构,旨在用于内存非常小的系统(没有大指令空间),并且已经经历了许多后续版本。当今的x86指令集不仅复杂,因为它是CISC,而且因为它实际上是8088和80386,以及奔腾(可能带有x86_64处理器)。
在当今世界,RISC和CISC不再是过去的黑白区分。大多数CPU架构已演变为不同的灰色阴影。
在RISC方面,一些现代MIPS变体添加了具有非均匀编码的乘法和除法指令。ARM处理器已经变得更加复杂:除“原始” 32位指令外,许多处理器还具有称为Thumb的16位指令集,更不用说Jazelle在CPU上执行JVM指令了。现代ARM处理器还具有用于多媒体应用程序的SIMD指令:毕竟有些复杂的指令确实值得。
在CISC方面,所有最近的处理器在某种程度上都在RISC内部。它们具有微代码来定义所有这些复杂的宏指令。处理器的绝对复杂性使得即使使用RISC设计,每个模型的设计也要花费数年时间,而RISC设计则需要大量的组件,流水线和预测性执行等等。
那么,为什么最快的处理器仍留在CISC之外呢?对于x86(32位和64位)系列,其中一部分是历史兼容性。但这还不是全部。在2000年代初期,英特尔尝试推广Itanium架构。Itanium是复杂指令的极端情况(尽管不是真正的CISC:它的设计被称为EPIC)。它甚至消除了按顺序执行指令的老式想法:所有指令并行执行直到下一个障碍。Itanium没有采用的原因之一是,无论是在英特尔还是在其他地方,任何人都无法为其编写像样的编译器。现在,我们已经了解了像x86_64这样的老旧的,主要是顺序的处理器。
dec [address]
,它们倾向于被大量使用,并且与ldr r0,[address] / sub r0,#1 / str r0,[address]
可以有效实现它们的体系结构相比,具有明显的优势。RISC的出现源于以下事实:虽然非流水线机器的执行dec
速度可能是load/sub/store
序列的两倍以上,但流水线可以提高后一个序列的速度,而不是它可以提高读取-修改-写入的速度。指令。
x86指令集有点特殊情况。我认为摩托罗拉的68K和DEC的VAX是CISC的更好示例。在很多汇编语言代码时代,人们认为使用非常常规,非常包容的ISA更好:我相信他们称汇编代码与人们认为“ 语义鸿沟 ” 的方式之间的区别。从理论上讲,您想要一个与您的思维方式相匹配的指令集。
CISC的另一个大设计驱动力似乎是“正交性”:每条指令都可以在每种寻址模式下运行(寄存器,绝对地址,相对偏移等)。您可以看到在分布式计算环境(DCE)和CORBA中API设计中出现了正交性的柏忌。这个想法不仅限于指令集设计。
CISC的一个原因是对指令进行了密集编码(内存价格昂贵)。整个RISC想法是通过始终获取相同大小的指令来加速CPU(无复杂,缓慢的“确定指令大小”步骤),让它们做简单的事情(因此可以很快地确定要做什么)。 。内存很便宜。这样就释放了CPU上的电路区域用于其他内容(更多寄存器,更多处理单元,因此如果它们是独立的,则可以并行执行几条指令)。由于CPU的速度比RAM慢得多,因此得到了回报。但是CPU变得更快(并并行执行更多操作,等等),而RAM却没有变得更快(由于并行度提高,至少不能以与CPU数据消耗相同的速率)。满足高速缓存,与CPU一样快,但体积很小。因此,现在内存再次变得珍贵,不是出于成本原因,而是出于速度。CISC复兴时间。同时,CPU变得更加复杂,到今天的微处理器可以完成RISC编译器的大部分工作:将操作分解为基本部分,对内部RISCy指令重新排序,以便可以在可能的情况下并发执行。RISC被誉为“减轻编译器的重要负担”
CISC的真正优势在于减少了内存和缓存压力,仅凭这一点,它就可以很好地满足要求苛刻的高性能应用,因为此类系统的主要瓶颈是内存带宽。给定大小相等的高速缓存,CISC处理器比RISC可以描述更多的信息。而且,由于CISC指令涉及多个微操作,因此可能会进行体系结构改进,从而为写出单个指令可能提供的指令提供最快的执行路径。简而言之,CISC处理器在利用内存带宽方面效率更高,这通常可以转化为内存密集型应用程序的性能提升。
例如,要执行R1 = R2 + R3 + R4 + R5 + R6
结果并将结果压入堆栈,可以说RISC代码写为
ADD R1, R2, R3 (4-byte)
ADD R1, R4, R5 (4-byte)
ADD R1, R6, R0 (4-byte, R0=0)
PUSH R1 (4-byte)
因此需要16个字节的空间。
来到CISC,由于可能使用不同的编码样式,因此相同的信息可能表示如下:
ADD R1, R2, R3 (4-byte)
ADD R1, R4, R5 (4-byte)
ADD R1, R6 (2-byte)
PUSH R1 (1-byte)
仅占用12个字节的内存。因此,提高了存储器利用率,从而允许处理器看到更多指令,从而减少了空闲周期。
因此,没有人提出的一个重要方面是,几乎所有CISC CPU都是微代码架构。与硬连线控制器相比,微序列器和控制存储器消耗的房地产要少得多,并且无需修改硬件即可修改指令集。
当我进入该领域时,微处理器是新颖的设备。在七十年代和八十年代初期,一种非常普遍的做法是使用位片ALU,一个基于微序列器的控制单元以及一个控制存储区来组装CPU,在该控制存储区中加载或烧写微代码指令集。这些计算机基于7400系列晶体管晶体管逻辑(TTL)。78181 4位ALU用于构造许多处理器,包括DEC PDP-11和早期VAX 11计算机,Data General Nova,Xerox Alto和Wang台式计算机。
您将很难找到任何未使用x86兼容处理器的台式机。该指令集击败了MIPS,击败了Sparc,击败了Alpha,击败了Titanic(我可能拼写错了名字)。另一方面,MIPS如今几乎不存在。因此,无论您今天怎么想,非常聪明的人都认为x86指令集是一个非常不错的主意,他们因此赚了很多钱。
因为复杂的指令集超出了实现者的能力,所以计算机起初是RISC。如果要查看RISC指令集,请查看CDC 6400-6600和CDC Cyber 170-175指令集。那是正确的RISC。大约10年前,我问过一些芯片设计人员(在合理的高级GPU芯片的角落)需要多少空间。他们告诉我大约1平方毫米-包括机器的RAM,这将占用该空间的99%。
当人们可以建造CISC机器时,他们实际上处于优势地位。请记住,x86是在1978年和1985年的MIPS之前发布的。那时,您需要处理器周期来读取指令,对其进行解码,执行它们。1978年的MIPS每条指令和每条操作要花费四个周期。如果您采用x86指令(例如“将寄存器添加到内存”),则该指令可能需要7个周期,但执行3次操作。那是一个主要优势。而且,您拥有的指令越不相同,每条指令越强大,优势就越大。
而且,当开发出带有噩梦般的前缀代码的x86 64位指令集时,指令集的复杂性不再重要。如今,CISC只是被翻译成RISC,整个翻译业务可能只占芯片的百分之一。
这个问题与最近的计算趋势有关,这种趋势倾向于向移动和平板电脑的大规模转移,从而有利于RISC cpus,并已使英特尔(可能是全球最大的CISC供应商)处于所谓的“拐点”的劣势。点”,就像格罗夫提请注意和警告的那种。简短的故事是,由于移动计算的本质上固有的高能耗,CISC似乎已开始在大规模的改变范式/改变游戏规则的移动计算浪潮中消失。
据推测,CISC将始终存在于台式机上,但移动技术被广泛认为是计算机的新未来。实际上,许多发展中国家(拥有大量潜在的计算机使用人口)实际上将跳过台式机阶段。例如,参见桌面计算的兴衰
一个很好的案例研究案例是阅读迈克·贝尔的故事,他正在英特尔担任新职位,他试图通过类似“ skunkworks”的项目/计划通过Atom CPU在移动市场上更好地定位英特尔,并拥有非常强大的执行官支持。移动市场与RISC架构紧密相关,主要是ARM处理器,这主要归功于它们的高能效(功耗),这是计算的新关键标准,这个问题没有其他答案。以下是这两篇类似的文章,它们揭示了许多有关该主题的内部公司思想(并随之而来!)。
其他答案中未提及的一个因素是经济。这也与英特尔有关。CISC体系结构主要由x86和x64系列代表。这些都是源自原始IBM PC中使用的不起眼的8088。该系列计算机在市场上的早期统治地位,意味着英特尔在研发方面拥有可观的收入来源。再加上英特尔能够通过取消/取消其第二笔货源协议来遏制竞争,这意味着CPU价格可能会上升到极端水平,从而确保非常高的毛利率。
因此,在其他CPU制造商努力跟上步伐的同时,英特尔却投入了数十亿美元来开发更新更快的产品。RISC竞争不能花那么多钱。许多RISC处理器退出市场。一些是:
DEC Alpha,Fairchild Clipper,AMD 29000,SPARC,MIPS,POWER(供PC使用),日立SuperH ...
我记得那个时代的权威人士宣布RISC与CISC的战争已经结束,CISC赢得了胜利。它没有。它只花了其他所有人。
这种动态会改变吗?已经是 没有经济优势是绝对的。
x86的致命弱点是对电源的狂热渴望。这样一来,规模更小,更灵活的竞争对手(ARM)就能在能源节俭至关重要的市场(例如手机/平板电脑/等)中蓬勃发展。
ARM团队成员提供的有关这方面的精彩视频是ARM Processor-播下成功的种子-Computerphile,时间约为8:30
x86的第二个问题是英特尔战略的成功。他们设法消除了几乎所有的竞争。他们放慢了脚步。多年以来,新的英特尔处理器仅提供了很小的改进。更糟糕的是,超富裕的利润是任何公司都难以放弃的饮食。
如今,基于ARM的片上系统(SOC)和AMD竞争的x64芯片再次使CPU市场成为一个有趣的地方。(恕我直言)
人们选择实施CISC的原因有很多。最突出的原因是与现有CISC指令集的二进制兼容性。尽管软件二进制转换技术已得到改进,但基于硬件的兼容性具有一些技术优势(以及转换缓存较少的缺点)和看起来更可靠的技术优势。
代码密度可能是选择CISC的第二大原因。瑞萨RX被设计为专用于代码密度的CISC,因为它针对的是代码存储器大小非常重要的微控制器。可变长度指令,复杂指令(主要是更多的寻址模式),隐式操作数和较少的寄存器数均有益于代码密度。
选择CISC的历史原因(在我看来是错误的)是为了缩小使用高级语言的程序员与处理器之间的语义鸿沟。由于复杂的指令通常可以由一系列较简单的指令代替,因此用于RISC的高级语言编译器的复杂性不必比语言匹配的CISC复杂得多。RISC避免了“语义冲突”(处理器指令比相应的语言语句执行更多或更少的工作),并有助于降低强度和优化调度。(有关更多详细信息,请参见“与CISC与RISC相关的编译器开发工作中的哪些权衡?”。)
与执行一条指令相关的固定成本可能很高。这鼓励使用相对复杂的指令来将这些开销分散到更多实际工作中;减少动态指令数可以提高性能。当逻辑和RAM的成本远大于ROM的成本时,由于通过查找微码对一条指令进行解码,因此产生复杂指令的动机就很明显。
使用CISC的原因可能与历史证据相矛盾,原因是可以为每个微体系结构优化微代码,而标准库可能无法充分利用新实现的功能。内存复制的软件实现与REP MOVSB的微代码的优化级别意味着,库比微代码更受关注。部分原因可能来自面向更广泛用户群的处理器供应商,因此与开源或内部软件(开发人员或用户的本地化利益可能会偏向于实施工作)相比,进行工作合理化的难度可能更大。
能够随处理器一起交付优化的标准库确实具有很多吸引力。平台标准库的存储和执行可以通过软件-硬件代码签名进行显着优化。复杂指令和平台抽象层调用之间的区别可能是微妙的(或不存在)。RISC设计可以使用与CISC处理复杂指令相同的实现技术来处理PAL调用,包括使用专用硬件在通用指令集中未提供的操作,使用巧妙的缓存和解码以及指定寄存器操作数(尽管CISC会这样做)通常使用类似于每个功能ABI的专用寄存器)。与CISC相关的思维模型可以鼓励这种优化。此外,强制包含“
与可比的RISC技术的成语识别(其中将指令序列识别为语义单元)相比,对相对复杂的指令进行解码可以具有更少的开销(并且可能在辨别意图方面更可靠地正确)。在较小的实现中,此开销差异最明显,但是使用此信息的开销降低了解码节省的重要性。
其他上下文信息可以促进硬件优化。例如,当增加内存中的值时,硬件可以识别出该内存地址被使用了两次(用于加载和存储),从而提供了缓存方式记忆和转换缓存的机会。复杂的指令可以显式提供此类信息。在复杂的指令中,中间值具有明确的生命周期(该指令的生命周期);使用传统的RISC寄存器时,必须显式覆盖值以指示活动结束。(注意:RISC可以指定一个每次使用后始终为零的寄存器,从而提供一种指定一次性使用的临时值的方法。这样的指令会稍微复杂一些。)
如果实现细节没有隐藏在抽象层后面,则使用不同的微体系结构针对不同的折衷进行优化变得更加困难。将微体系结构细节公开为体系结构保证可将微体系结构锁定为兼容性保证。虽然PAL软件可以像复杂指令一样进行优化,但这需要硬件软件代码签名。组织上的分离和多样性使代码签名更加困难。
复杂的指令可以提供对特权状态的保护访问。例如,关于中断,复杂的指令通常是原子的。尽管RISC指令集可以提供用户级机制来临时挂起中断,甚至可能类似于链接加载之类的东西,以便软件在被中断时可以明确地重试操作,但这种情况对于RISC而言并不常见。
类似地,复杂的指令可以提供特权信息的受控访问和/或使用。因为执行的操作具有受控的语义,所以可以避免实际的特权冲突。面向RISC的替代方案包括PAL代码(通常会产生大量开销)和对具有某些特权状态的配置寄存器(或寄存器的影子副本)的屏蔽访问。提供通用解决方案(RISC)比提供针对一个或几个特殊情况(CISC)的解决方案更加困难,但功能更强大,并且更不容易累积特殊情况。如果人们认为重要的特殊情况很少,那么CISC可能会更具吸引力。
复杂的指令还可以对软件隐藏状态。这样的显着优势是上下文的保存和恢复。使用保存和恢复状态的指令,体系结构仅需要将上下文大小传达给OS,而无需将状态转移到内存的特定机制。这使在旧版OS上运行的应用程序可以使用添加状态的ISA扩展。(同样,PAL软件可以提供相同的功能。)
x86的大部分复杂性来自许多扩展的兼容性。使用复杂且正交性较低的指令(用于代码密度),删除一些原来不需要的工作,避免不必要的依赖链(例如,仅一个进位位,仅一个动态移位量寄存器),添加一些可以在复杂的指令中进行优化,而这些指令中的任何一个都需要添加新的指令,从而使ISA在美学上不那么令人满意。
在很多情况下,RISC不会遇到此类问题,因为指令是高度正交且原始的。在某些情况下,RISC可能需要添加新的原语,但这通常适用于多种用途。
此外,一旦建立了支持复杂指令的基础架构,就可以减少其他复杂指令的壁垒。也就是说,复杂指令的大部分成本是非重复的。强烈的RISC ISA在引入CISCy功能方面遇到了补充障碍。
x86的扩展频率也可能部分归因于它在通用计算和商户处理器模型中的流行(这也增加了二进制兼容性的重要性)。RISC ISA通常与系统供应商联系在一起,这鼓励更狭窄地关注应用程序,并且缺乏针对特定RISC ISA的实施竞争,这在某种程度上不利于将指令集扩展用于营销。受欢迎程度还使得开发新扩展的成本变得不那么重要(在大批量交易中,非经常性费用就不那么重要了)。
x86兼容性理念可能也倾向于扩展现有机制,而不是提供更清晰的突破,这意味着新功能受现有功能的影响更大。较高的扩展频率还鼓励更多的增量更改,从而鼓励重用机制,从而倾向于减少正交性。
将经典MIPS(这是MIPS的现代版本的子集,并且排除了各种可选的ISA扩展)的学术演示文稿与现代x86进行了比较(后者将二进制兼容性追溯到16位8086,而汇编级的准兼容性甚至更远)尽管历史悠久,但对于CISC来说并不是最好的案例,对于RISC来说也不是现实的案例。