26~29章

26-Superscalar和VLIW:如何让CPU的吞吐率超过1?

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

IPC(Instruction Per Clock)一 个时钟周期里面能够执行的指令数,代表了CPU的吞吐率。

  • 情景:IPC在流水线架构的CPU下也只能到1。

  • 问题:如何提高IPC?

  • 解决:超标量

  • 解决:超长指令集合

26~29章_第1张图片

多发射与超标量:同一时间执行的两条指令

  • 问题:怎么在同一时间执行的多条指令
  • 执行阶段:因为硬件层面是多个ALU分别执行不同的功能模块,所以不同ALU之间可以并行
  • 取指令和指令译码:通过增加硬件的方式,并行进行

这种CPU设计,我们叫作多发射(Mulitple Issue)和超标量(Superscalar)。

26~29章_第2张图片

超标量CPU

26~29章_第3张图片

Intel的失败之作:安腾的超长指令字设计

  • 情景:乱序执行,超标量技术都需要在运行时用复杂的硬件解决依赖冲突(冒险)

  • 问题:能不能在编译阶段用软件先解决冒险?

  • 解决:超长指令字设计

    • 优点:优化指令数和CPI
    • 缺点:兼容性差(与X86和自身不同代都不兼容)
  • 过程:在软件阶段就用编译器优化指令,把没有依赖关系的代码位置进行交换。再把多条连续的指令打包成一个指令包。CPU运行时取出并拆分指令包,并行执行多个指令

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

超长指令字设计(Very Long Instruction Word,VLIW)。

26~29章_第4张图片

26~29章_第5张图片

27-SIMD:如何加速矩阵乘法?

超线程:Intel多卖给你的那一倍CPU

因为这些解决“冒险”、提升并发的方案,本质上都是一种指令级并行(Instruction-level parallelism,IPL)的技术方案。

超线程是线程级并行,SIMD是数据级别并行

超线程(Hyper-Threading)技术。

  • 问题:并行的指令怎么避免冒险?

  • 解决:超线程技术

    • 原理:结构冒险通过增加资源,发生数据冒险和控制冒险时通过执行不同线程来避免浪费CPU时间
    • 优点:
      • 成本低。这里只需要增加些寄存器和电路就能维护两个线程的信息,让两线程共用CPU。
      • cache读写速度快
      • 可以在cache中保存上下文而不需要去内存中读取上下文
      • 减少开销。线程可以共用多数资源切换开销小。可以降低三种冒险所带来的开销
    • 缺点:
      • 实际效果跟测试条件关系密切。并没有增加真的功能单元。所以超线程只在特定的应用场景下效果比较好。

    超线程CPU图

26~29章_第6张图片

26~29章_第7张图片

SIMD:如何加速矩阵乘法?

  • SIMD 能够并行进行向量的操作。
  • 原理:SIMD在获取数据和执行指令的时候,都做到了并行。
  • 优点:执行大量“数据并行”(Data Parallelism)的计算速度快
  • SISD,单指令单数据(Single Instruction Single Data)
  • MIMD,多指令多数据(Multiple Instruction Multiple Dataa)。
  • SIMD,单指令多数据流(Single Instruction Multiple Data)

26~29章_第8张图片

总结延伸

这一讲,我们讲完了超线程和SIMD这两个CPU的“并行计算”方案。超线程,其实是一个“线程级并 行”的解决方案。它通过让一个物理CPU核心,“装作”两个逻辑层面的CPU核心,使得CPU可以同时运行 两个不同线程的指令。虽然,这样的运行仍然有着种种的限制,很多场景下超线程并不一定能带来CPU的性 能提升。但是Intel通过超线程,让使用者有了“占到便宜”的感觉。同样的4核心的CPU,在有些情况下能 够发挥出8核心CPU的作用。而超线程在今天,也已经成为Intel CPU的标配了。 而SIMD技术,则是一种“指令级并行”的加速方案,或者我们可以说,它是一种“数据并行”的加速方 案。在处理向量计算的情况下,同一个向量的不同维度之间的计算是相互独立的。而我们的CPU里的寄存 器,又能放得下多条数据。于是,我们可以一次性取出多条数据,交给CPU并行计算。

28-异常和中断:程序出错了怎么办?

我们的程序都是自动运行且正常运行的。自动运行的意思是说,我们的程序和指令都是一条 条顺序执行,你不需要通过键盘或者网络给这个程序任何输入。正常运行是说,我们的程序都是能够正常执 行下去的,没有遇到计算溢出之类的程序错误。

异常:硬件、系统和应用的组合拳

异常其实是一个硬件和软件组合到一起的处理过程。异常的发生和捕捉,在硬件层面完成。异常的处理,由软件来完成。

计算机会为每一种可能会发生的异常,分配一个异常代码。I/O发出的信号的异常代码,是由操作系统来分配的,也就是由软件来设定的。而像加法 溢出这样的异常代码,则是由CPU预先分配好的,也就是由硬件来分配的。

异常代码(Exception Number)也叫中断向量(Interrupt Vector)。

异常发生的时候,通常是CPU检测到了一个特殊的信号。

拿到异常代码之后,CPU就会触发异常处理的流程。计算机在内存里,会保留一个异常表。存放的是不同的异常代码对应的异常处理程序 (Exception Handler)所在的地址。

异常表(Exception Table)也叫中断向量表(Interrupt Vector Table)

这个异常表有点儿像我们在第10讲里讲的GOT表,

CPU在拿到了异常码之后,保存上下文,然后根据异常码查询,找到对应的异常处理程序,最后把后续指令执行的指挥权,交给这个异常处理程序。

26~29章_第9张图片

“检测异常,拿到异常码,再根据异常码进行查表处理”的模式

26~29章_第10张图片

异常的分类:中断、陷阱、故障和中止

26~29章_第11张图片

中断异常的信号来自系统外部,称之为“异 步”类型的异常。其他是在程序执行的过程中发生的,所以我们称之为“同 步“类型的异常。

异常的处理:上下文切换

  • 问题:切换到异常处理程序有什么特点
  • 答案:
    • 需要保存所有上下文(保存所有寄存器)
    • 涉及CPU“变态”的操作需要把寄存器里的信息保存到内核栈中
    • 处理完故障类异常后要重新执行当前指令
  • 对于异常这样的处理流程,不像是顺序执行的指令间的函数调用关系。而是更像两个不同的独立进程 之间在CPU层面的切换,所以这个过程我们称之为上下文切换(Context Switch)

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

CISC和RISEC的差别: CPU的指令集里的机器码是固定长度还是可变长度

复杂指令集(Complex Instruction Set Computing,简称CISC)和精简指令集(Reduced Instruction Set Computing,简称RISC)

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

两者的区别

26~29章_第12张图片

  • 问题:指令多的缺点
  • 缺点:
    • 硬件层面:复杂的指令导致复杂的CPU电路。复杂电路增加散热和功耗的难度
    • 软件层面:支持更多的复杂指令,编译器的优化就更难

在RISC架构里面, cpu腾出空间给寄存器。 因为RISC完成同样的功能,执行的指令数量要比CISC多,所以,如果需要反复从内存里面读取指令或 者数据到寄存器里来 除了寄存器这样的存储空间,RISC的CPU也可以把更多的晶体管,用来实现更好的分支预测等相关功能,进 一步去提升CPU实际的执行效率。

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

CISC的架构,优化指令数。而RISC的架构,优化CPI。

Intel的进化:微指令架构的出现

  • 问题:怎么才能有向前兼容性的同时改进CISC
  • 解决:微指令(Micro-Instructions/Micro-Ops)架 构
    • 过程: 指令译码器把一条机器码翻译多条微指令,放入缓冲区,再发给超标量乱序执行的流水线架构里
  • 问题:指令译码器变得更复杂。导致更复杂的电路和更长的译码时间
  • 解决:因为CPU执行的指令有强局部性所以使用缓存
    • 实现:Intel就在CPU里面加了一层L0 Cache。这个Cache保存的就是指令译码器把CISC的指令“翻译”成 RISC的微指令的结果。
  • 结果:即使融合了大量RISC类型的处理器设计。由于Intel本身在CPU层面做的大量优化,比如乱序执行、分支预 测等相关工作,功耗还是较大

26~29章_第13张图片

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

  • 问题:ARM相比于x86的优点

  • 答案:

  • 功耗优先的设计。 在移动设备上,功耗指标很重要

    ARM的CPU,主频,晶体管,高速缓存,乱序执行都弱

  • 低价。ARM只是进行CPU设计,没有垄断CPU的生产和制造

你可能感兴趣的:(深入浅出计算机组成原理,其他)