历史

  1. 早期,所有的CPU都是CISC
  2. 实际的计算机设计和制造会严格受到硬件层面的限制,当时的计算很慢存储空间很小
    • 为了让计算机能够尽量多地工作,每个字节乃至每个比特都特别重要
  3. CPU指令集的设计,需要仔细考虑硬件限制,为了性能考虑,很多功能都直接通过硬件电路来完成
  4. 为了少用内存指令长度也是可变
    • 常用的指令要一些,不常用的指令要一些
    • 尽量少的内存空间,存储尽量多的指令
  5. 计算机的性能越来越好,存储的空间也越来越大,70年代末RISC出现
    • CPU运行程序,80%的运行代码都在使用20%的简单指令

对比

CISC RISC
硬件为中心的指令集设计 软件为中心的指令集设计
通过硬件实现各类程序指令 通过编译器实现简单指令组合,完成复杂功能
高效地使用内存和寄存器 – 一开始都是CISC,硬件资源非常珍贵 需要更大的内存和寄存器,并更频繁地使用
可变的指令集,支持更复杂的指令长度 简单定长的指令
大量指令数 少量指令数
  1. CISC的缺点
    • 在硬件层面,如果想要支持更多的复杂指令,CPU里面的电路就要更复杂,设计起来更困难
    • 更复杂的电路,在散热功耗层面,也会面临更大的挑战
    • 在软件层面,支持更多的复杂指令,编译器的优化变得更困难
  2. 在RISC架构里面,CPU选择把指令精简到20%的简单指令,原先复杂指令,通过简单指令组合来实现,让软件实现硬件的功能
    • 这样,CPU的整个硬件设计变得简单,在硬件层面提升性能变得更加容易
  3. RISC的CPU里完成指令的电路变简单了,可以腾出更多空间来存放通用寄存器
    • 因为RISC完成同样的功能,执行的指令数要比CISC多
    • 如果需要反复从内存里面读取指令或者数据寄存器,那么很多时间都会花在访问内存
    • 所以,RISC架构的CPU往往会有更多的通用寄存器
  4. RISC的CPU也可以把更多的晶体管,用来实现更好的分支预测等优化功能,进一步提升CPU实际的执行效率
  5. 程序的CPU执行时间 = 指令数 × CPI × Clock Cycle Time
    • CISC架构,是通过优化指令数,来减少CPU的执行时间
    • RISC架构,是通过优化CPI,来减少CPU的执行时间
      • 因为指令比较简单,需要的时钟周期就比较少
  6. 因为RISC降低了CPU硬件的设计和开发难度
    • 80年代开始,大部分新的CPU都开始采用RISC架构,如IBM的PowerPCSUN的SPARC

微指令架构

  1. x86架构所面临的种种问题,都来自于一个最重要的考量,即指令集的向前兼容性
    • x86在商业上太成功,所以市场上有大量的Intel CPU,围绕这些CPU,又有大量系统软件(如操作系统编译器
    • 这些系统软件只支持x86的指令集,在这些系统软件上,又有各种各样的应用软件
    • 如果Intel要放弃x86的架构和指令集,开发一个RISC架构的CPU,面临的第一个问题:所有的软件都是不兼容
      • 安腾处理器:Intel想要在CPU进入64位时代的时候,丢掉x86的历史包袱,推出了全新的IA-64架构
      • 但因为不兼容x86的指令集,遭遇了重大的失败
    • AMD,在Intel研发安腾的时候,推出了兼容32位x86指令集的64位架构,即AMD64
      • x86下的64位指令集x86-64,并不是Intel发明的,而是AMD
  2. Intel在开发安腾处理器的同时,也在不断地借鉴其它RISC处理器的设计思想
    • 核心问题:始终向前兼容x86的指令集
      • 思路:在不修改指令集的情况下,让CISC风格的指令集,用RISC的形式在CPU里面运行
      • Pentium Pro时代,Intel开始在处理器里引入微指令架构(Micro-Instructions/Micro-Ops)
  3. 在微指令架构的CPU里面,编译器编译出来的机器码汇编代码并没有发生什么变化
    • 但在指令译码阶段,指令译码器翻译出来的,不再是某一条CPU指令,指令译码器会把一条机器码,翻译成多条微指令
    • 微指令不再是CISC风格,而是变成了固定长度的RISC风格,这些RISC风格的微指令,会被放到一个微指令缓冲区
    • 然后再从微指令缓冲区里面,分发到后面的超标量并且是乱序执行流水线架构
      • 这个流水线架构接受的不是复杂的指令,而是精简的指令
    • 微指令架构里,指令译码器相当于一个适配器
      • 这个适配器,填平CISCRISC之间的指令差异
      • 但这样的指令译码器更复杂:需要把CISC指令译码成RISC指令,意味着更复杂的电路更长的译码时间
      • 本来通过RISC提升的性能,又有一部分浪费在指令译码
    • RISC优于CISC是基于一个假设:程序实际运行过程中,80%运行的代码使用20%的常用指令
      • 这意味着CPU里执行的指令有很强的局部性,对于很强局部性的问题,常见的解决方案是使用缓存
      • 因此,Intel在CPU里面加了一层L0 Cache,保存的是指令译码器把CISC指令翻译成RISC微指令的结果
      • 在大部分情况下, CPU都可以从L0 Cache里面直接拿到译码结果,而不需要让译码器去进行实际的译码操作
        • 好处:优化性能 + 减少功耗
  4. 从Pentium Pro开始,Intel处理器不再是一个纯粹的CISC处理器了,同时融合了大量RISC类型的处理器设计
    • 由于Intel本身在CPU层面做了大量的优化(乱序执行、分支预测等),x86的CPU在功耗上始终远远超过RISC架构的ARM

ARM

  1. ARM:Advanced RISC Machines
  2. 现在的CISCRISC的分界已经比较模糊
    • Intel和AMD的CPU,都是采用译码成RISC风格的微指令来运行的
    • ARM的芯片,一条指令同样需要多个时钟周期,也有乱序执行多发射
  3. ARM在移动端战胜Intel的原因
    • 功耗优先的设计
      • 在移动设备上,功耗是一个远比性能更重要的指标
      • ARM的CPU,主频更低晶体管更少高速缓存更小乱序执行的能力更弱,这些都是为了功耗所做的妥协
    • 低价
      • ARM只进行CPU设计,然后把对应的知识产权授权出去,让其它厂商来生产ARM架构的CPU
      • 甚至允许厂商(苹果、三星、华为)基于ARM架构和指令集,设计属于自己的CPU,ARM只收取对应的专利授权费用
      • 多个厂商之间的竞争,使得ARM的芯片在市场上的价格很便宜
        • 虽然ARM芯片的出货量远大于Intel,但收入利润却比不上Intel

参考资料

深入浅出计算机组成原理