【计算机组成原理】学习笔记——总目录

【29】CISC和RISC:为什么手机芯片都是ARM?

  • 引言
  • 一、CISC VS RISC:历史的车轮不总是向前的
    • 1、RISC 架构的 CPU受到追捧的原因【降低了 CPU 硬件的设计和开发难度】
  • 二、Intel 的进化:【☆微指令架构的出现☆】
    • 1、Intel不使用RISC的原因【向前兼容】
    • 2、微指令架构的出现
    • 3、新的问题:译码器电路更复杂+译码时间增加—>引入L0缓冲器
  • 三、ARM 和 RISC-V :CPU 的现在与未来
  • 四、总结【个人总结的重点】

引言

我在第 5 讲讲计算机指令的时候,给你看过 MIPS 体系结构计算机的机器指令格式。MIPS 的指令都是固定的 32 位长度,如果要用一个打孔卡来表示,并不复杂。

第 6 讲的时候,我带你编译了一些简单的 C 语言程序,看了 x86 体系结构下的汇编代码。眼尖的话,你应该能发现,每一条机器码的长度是不一样的。【Intel x86 的机器码的长度是可变的】

而 CPU 的指令集里的机器码是固定长度还是可变长度,也就是复杂指令集(Complex Instruction Set Computing,简称 CISC)和精简指令集(Reduced Instruction Set Computing,简称 RISC)这两种风格的指令集一个最重要的差别。那今天我们就来看复杂指令集和精简指令集之间的对比、差异以及历史纠葛。

一、CISC VS RISC:历史的车轮不总是向前的

1、RISC 架构的 CPU受到追捧的原因【降低了 CPU 硬件的设计和开发难度】

【面临的挑战:】
RISC 架构的 CPU 的想法其实非常直观。既然我们 80% 的时间都在用 20% 的简单指令,那我们能不能只要那 20% 的简单指令就好了呢?答案当然是可以的。因为指令数量多,计算机科学家们在软硬件两方面都受到了很多挑战。

在硬件层面,我们要想支持更多的复杂指令,CPU 里面的电路就要更复杂,设计起来也就更困难。更复杂的电路,在散热和功耗层面,也会带来更大的挑战。
在软件层面,支持更多的复杂指令,编译器的优化就变得更困难。毕竟,面向 2000 个指令来优化编译器和面向 500 个指令来优化编译器的困难是完全不同的。

【原因:】
于是,在 RISC 架构里面,CPU 选择把指令“精简”到 20% 的简单指令。而原先的复杂指令,则通过用简单指令组合起来来实现,让软件来实现硬件的功能。这样,CPU 的整个硬件设计就会变得更简单了,在硬件层面提升性能也会变得更容易了

RISC 的 CPU 里完成指令的电路变得简单了,于是也就腾出了更多的空间。这个空间,常常被拿来放通用寄存器。因为 RISC 完成同样的功能,执行的指令数量要比 CISC 多,所以,如果需要反复从内存里面读取指令或者数据到寄存器里来,那么很多时间就会花在访问内存上。于是,RISC 架构的 CPU 往往就有更多的通用寄存器

除了寄存器这样的存储空间,RISC 的 CPU 也可以把更多的晶体管,用来实现更好的分支预测等相关功能,进一步去提升 CPU 实际的执行效率。

总的来说,对于 CISC 和 RISC 的对比,我们可以一起回到第 4 讲讲的程序运行时间的公式:

程序的 CPU 执行时间 = 指令数 × CPI × Clock Cycle Time

CISC 的架构,其实就是通过优化指令数,来减少 CPU 的执行时间。
而 RISC 的架构,其实是在优化 CPI。因为指令比较简单,需要的时钟周期就比较少。

【带来的影响 + 进一步追问?】
因为 RISC 降低了 CPU 硬件的设计和开发难度,所以从 80 年代开始,大部分新的 CPU 都开始采用 RISC 架构。从 IBM 的 PowerPC,到 SUN 的 SPARC,都是 RISC 架构。

所有人看到仍然采用 CISC 架构的 Intel CPU,都可以批评一句“Complex and messy”。
但是,为什么无论是在 PC 上,还是服务器上,仍然是 Intel 成为最后的赢家呢?

二、Intel 的进化:【☆微指令架构的出现☆】

1、Intel不使用RISC的原因【向前兼容】

面对这么多负面评价的 Intel,自然也不能无动于衷。更何况,x86 架构的问题并不能说明 Intel 的工程师不够厉害。事实上,在整个 CPU 设计的领域,Intel 集中了大量优秀的人才。无论是成功的 Pentium 时代引入的超标量设计,还是失败的 Pentium 4 时代引入的超线程技术,都是异常精巧的工程实现。

x86 架构所面临的种种问题,其实都来自于一个最重要的考量,那就是指令集的向前兼容性。因为 x86 在商业上太成功了,所以市场上有大量的 Intel CPU。而围绕着这些 CPU,又有大量的操作系统、编译器。这些系统软件只支持 x86 的指令集,就比如著名的 Windows 95。而在这些系统软件上,又有各种各样的应用软件

如果 Intel 要放弃 x86 的架构和指令集,开发一个 RISC 架构的 CPU,面临的第一个问题就是所有这些软件都是不兼容的。事实上,Intel 并非没有尝试过在 x86 之外另起炉灶,这其实就是我在第26 讲介绍的安腾处理器。当时,Intel 想要在 CPU 进入 64 位的时代的时候,丢掉 x86 的历史包袱,所以推出了全新的 IA-64 的架构。但是,却因为不兼容 x86 的指令集,遭遇了重大的失败。

反而是 AMD,趁着 Intel 研发安腾的时候,推出了兼容 32 位 x86 指令集的 64 位架构,也就是== AMD64==。如果你现在在 Linux 下安装各种软件包,一定经常会看到像下面这样带有 AMD64 字样的内容。这是因为 x86 下的 64 位的指令集 x86-64,并不是 Intel 发明的,而是 AMD 发明的

2、微指令架构的出现

Intel 在开发安腾处理器的同时,也在不断借鉴其他 RISC 处理器的设计思想。既然核心问题是要始终向前兼容 x86 的指令集,那么我们能不能不修改指令集,但是让 CISC 风格的指令集,用 RISC 的形式在 CPU 里面运行呢?

于是,从 Pentium Pro 时代开始,Intel 就开始在处理器里引入了微指令(Micro-Instructions/Micro-Ops)架构。而微指令架构的引入,也让 CISC 和 RISC 的分界变得模糊了。
【重点知识】在微指令架构的 CPU 里面,编译器编译出来的机器码和汇编代码并没有发生什么变化。但在指令译码的阶段,指令译码器“翻译”出来的,不再是某一条 CPU 指令。译码器会把一条机器码,“翻译”成好几条“微指令”。这里的一条条微指令,就不再是 CISC 风格的了,而是变成了固定长度的 RISC 风格的了

这些 RISC 风格的微指令,会被放到一个微指令缓冲区里面,然后再从缓冲区里面,分发给到后面的超标量,并且是乱序执行的流水线架构里面。不过这个流水线架构里面接受的,就不是复杂的指令,而是精简的指令了。在这个架构里,我们的指令译码器相当于变成了设计模式里的一个“适配器”(Adaptor)。这个适配器,填平了 CISC 和 RISC 之间的指令差异。

3、新的问题:译码器电路更复杂+译码时间增加—>引入L0缓冲器

不过,凡事有好处就有坏处。这样一个能够把 CISC 的指令译码成 RISC 指令的指令译码器,比原来的指令译码器要复杂。这也就意味着更复杂的电路和更长的译码时间:本来以为可以通过 RISC 提升的性能,结果又有一部分浪费在了指令译码上。针对这个问题,我们有没有更好的办法呢?

我在前面说过,之所以大家认为 RISC 优于 CISC,来自于一个数字统计,那就是在实际的程序运行过程中,有 80% 运行的代码用着 20% 的常用指令。这意味着,CPU 里执行的代码有很强的局部性。而对于有着很强局部性的问题,常见的一个解决方案就是使用缓存

所以,Intel 就在 CPU 里面加了一层== L0 Cache==。这个 Cache 保存的就是指令译码器把 CISC 的指令“翻译”成 RISC 的微指令的结果。于是,在大部分情况下,CPU 都可以从 Cache 里面拿到译码结果,而不需要让译码器去进行实际的译码操作。这样不仅优化了性能,因为译码器的晶体管开关动作变少了,还减少了功耗。

因为“微指令”架构的存在,**从 Pentium Pro 开始,Intel 处理器已经不是一个纯粹的 CISC 处理器了。它同样融合了大量 RISC 类型的处理器设计。**不过,由于 Intel 本身在 CPU 层面做的大量优化,比如乱序执行、分支预测等相关工作,x86 的 CPU 始终在功耗上还是要远远超过 RISC 架构的 ARM,所以最终在智能手机崛起替代 PC 的时代,落在了 ARM 后面。

三、ARM 和 RISC-V :CPU 的现在与未来

四、总结【个人总结的重点】

  • RISC 和 CISC 架构之前的差异:

    • RISC 的指令是固定长度的,CISC 的指令是可变长度的。
    • RISC 的指令集里的指令数少,而且单个指令只完成简单的功能,所以被称为“精简”。
    • CISC 里的指令数多,为了节约内存,直接在硬件层面能够完成复杂的功能,所以被称为“复杂”。
    • RISC 的通过减少 CPI 来提升性能,而 CISC 通过减少需要的指令数来提升性能。
  • Intel不使用RISC的原因:指令集的向前兼容
  • Intel在CISC和RISC融合上做的努力:微指令架构—>译码器电路更复杂+译码时间增加—>引入L0缓冲器(减少频繁译码的工作)
  • 未来的趋势:开源CPU RISC-V
  • ARM(Advanced RISC Machines)在移动端称霸的原因(并非RISC架构):1、功耗优先的设计(功耗低);2、价格低。
  • Intel CPU(电脑端):使用CISC架构
  • ARM CPU(手机端):使用RISC架构

【计算机组成原理】学习笔记——总目录

【29】CISC和RISC:为什么手机芯片都是ARM?相关推荐

  1. 那些年的那些事CISC和RISC发展中的纠缠

    本文来自http://www.cnbeta.com/articles/224544.htm ARM.ARM.ARM,没错ARM仿佛一夜之间就火了,平板.手机等领域随处可见它的影子,甚至已经有人预言未来 ...

  2. 以下关于CISC和RISC的叙述中,错误的是()【最全!最详细总结!】

    天道酬勤,思者常新. 以下关于CISC和RISC的叙述中,错误的是() A. 在CISC中,复杂指令都采用硬布线逻辑来执行 B. 一般而言,采用CISC技术的CPU,其芯片设计复杂度更高 C. 在RI ...

  3. ARM架构、指令集、内核版本、CISC与RISC、ARM产品线

    架构:处理器的硬件架构,称为微架构.用实际的半导体电路,去实现指令集列表的运算操作.日常中的构架很多时候就是说的指令集,像我们说X86构架.X86指令集,最后表达出的意思都差不多.实际中架构和指令集也 ...

  4. 计组--CISC和RISC特点和区别

    CISC和RISC特点和区别 CISC(微程序) RISC(硬布线) 指令系统 复杂.庞大 简单.精简 指令数目 一般大于200条 一般小于100条 指令字长 不固定 定长 可访存指令 不加限制 只有 ...

  5. CISC 和 RISC

    文章目录 CISC CISC:Complex Instruction Set Computer,复杂指令集计算机,桌面PC使用的基本上都是这种指令集. CISC 指令集存在的严重问题是:各个指令的使用 ...

  6. 关于CISC和RISC的一些总结

    CISC和RISC 首先先来介绍一下两个名词,毕竟我第一次看到这个题目,也有一点点懵,所以,先来讲述一下各自的含义. CISC (Complex Instruction Set Computer) 复 ...

  7. 逃离x86架构-----CPU体系结构CISC与RISC之争

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 转载:h ...

  8. 计算机组成原理(7)指令系统——偏移寻址、堆栈寻址、CISC和RISC

    上一回主要讲了寻址方式:指令寻址和数据寻址 指令寻址分为定长指令字结构(分为四地址指令.三地址指令等,操作码的长度固定,指令长度固定,就是后面的地址长度进行变化)和变长指令字结构 同时也可分为定长操作 ...

  9. 计组高分笔记:【04】指令系统 「指令格式与分类 | CISC、RISC | 直接寻址 | 间接寻址 | 寄存器寻址 | 隐式寻址 | 立即寻址| 基址寻址 | 变址寻址 | 相对寻址 | 堆栈寻址」

    文章目录 1. 指令格式 1.1 指令的基本概念 1.2 指令的分类 1.2.1 按地址码(操作数)长度/数目分类 1.2.2 按指令的长度分类 1.2.3 按操作码长度分类 1.2.4 按操作类型分 ...

最新文章

  1. linux eclipse java_从Linux终端编译运行Eclipse Java项目
  2. 1、solr包结构介绍,solrCore的安装配置,solr部署到Tomcat,多solrCore配置,配置中文分词器,界面功能介绍,Schema.xml的基本使用,数据导入
  3. 相角裕量的指令 matlab,[转载]什么是相角裕量、增益裕量?
  4. sql server创建数据库与相关查询操作
  5. [转载]Unix 高手的另外 10 个习惯
  6. wxpython控件如何自动调整大小_wxpython:自动调整静态图像(staticbitmap)的大小以适应大小...
  7. Android studio 清除缓存数据的步骤
  8. shell编程题(四)
  9. 【今日CV 视觉论文速览】14 Nov 2018
  10. Docker学习总结(9)——Docker常用命令
  11. 根据用户查进程_Linux进程之如何查看进程详情?
  12. socket pro 启动客户端的命令
  13. mac读取ntfs移动硬盘
  14. 育英oj——LZY逃命路线总数
  15. 指数族分布(2)——对数配分函数和MLE与充分统计量
  16. 00无人机简介以及课程介绍2020-07-03
  17. 面向对象程序设计课程设计:利用决策树方法判定西瓜质量
  18. python 三方库字典
  19. 物联网——完全开源物联网基础平台
  20. android登陆界面左右两种登陆布局,Android UI组件----用相对布局RelativeLayout做一个登陆界面...

热门文章

  1. 银行软件性能测试,银行手机银行系统性能测试方案.pdf
  2. 禁止K8S容器内子进程拥有提升权限的能力
  3. 阿里云——云开发平台基于Python的web项目部署到Serverless
  4. 亿级流量电商JVM调优(转图灵学院)
  5. 远程唤醒WOL启动服务器或电脑
  6. MySQL中使用SQL统计App的日活,周活,月活,年活
  7. Python3读取h5,pkl,npz,npy格式的文件
  8. 将selinux=enforing设置好过后,重启Linux管理员账号不能登陆
  9. c语言实现求一个矩阵特征值和特征向量
  10. mock.js的使用方法