跳转至

📔 Lecture02 Fundamental Concepts and ISA 学习笔记

更新日期:2023.11.12

1. 课程可以学到什么?

  • CMU 18-447 本身就是一门偏向于 “计算机硬件” 的课程。不会去考虑和涉及操作系统相关的东西。

  • 课程可以学到:

    • 设计和实现可编程微处理器的硬件/软件接口和主要组件的基本原则tradeoff。

      • 关注最新的技术(以及最新的研究和趋势)
      • 权衡以及如何作出取舍?
    • 如何设计、实现和评估一个功能性的现代处理器?

      • RTL实现和更高层次仿真的结合。
    • 如何挖掘信息,批判性、广泛性地去思考

  • 对于掌握软件和硬件来说,可以相互权衡一些性能。通过硬件,可以设计和开发出更好的软件,可以通过硬件更好地去权衡是如何影响软件的。

  • 课程目标:

    • 目标1:让对计算机系统设计感兴趣的人熟悉当今系统中处理器、内存和平台架构的基本操作原理和设计权衡。

      • 重点强调基本原理、设计权衡、当前/未来的关键问题
      • 强烈强调向后看、向前看、向上看和向下看的原则。
    • 目标2:通过动手RTL和C级实现,为设计、实现和评估现代处理器提供必要的背景和经验。

      • 强烈强调功能性,动手设计和实现,考虑效率。
      • 强调让功能work,实现想法。

2. 计算机体系结构的定义和所处的位置

  • 计算机体系结构:

    • 设计、选择和连接硬件组件以及设计硬件/软件接口以创建满足功能、性能、功耗、成本或者其它特定目的的计算机系统的一门学科。
  • 传统定义(Gene Amdahl的观点):

    • 也是ISA的传统定义。
    • 术语体系结构主要用来描述程序员所看到的系统属性,即概念结构和功能行为,与数据流和控制块、逻辑设计和物理实现是截然不同的设计。
  • 传统意义上的架构就是硬件和软件之间的接口。

对于计算机来说,计算机系统中的转换层次结构图如下:

3. 什么是算法?

  • 计算机体系结构也是需要设计正确的算法。在硬件层面,依然也是需要设计大量准确的算法,体系结构主要的集中点是在硬件层面去设计,而不去关注软件层面的算法设计。

  • 算法的定义:

    • 一个逐步解决问题的过程(解决问题的方法)

      • 对于每一个步骤来说,都该是精准定义的。
    • 通过计算机完成高效计算。

    • 可以终止

4. 为什么学习计算机体系结构?

  • 实现更好的系统:让计算机更快、更小、更便宜、更可靠

    • 通过利用底层技术/电路的进步和变化。
  • 实现新的应用

    • 虚拟现实
    • 3D可视化
  • 为新的问题提供更好的解决方案

    • 问题总在变化,解决方案也随之变化。
    • 对于软件创新来说,总是建立在计算机体系结构的趋势和变化基础之上。
  • 理解计算机是如何工作的?

5. 当今计算机体系结构的发展趋势

计算机体系结构所在的行业并不是一个很大的模式转变,但也不是说一成不变。对于一些处理器来说,从早期的单核处理器演变成现在多核处理器的,正因为模式的转变,让许多现在的系统设计成为了可能。

  • 对于这种转变的发展,早期存在了许多困难的问题:

    • 电力/能耗约束(多核?)
    • 设计复杂性(多核?)
    • 技术规模化困难(新技术?)
    • 内存墙/差距
    • 墙/可靠性问题?
    • 可编程墙/问题?
    • 对数据和新的数据密集型应用的巨大需求增加?

对于这些问题,如果不改变设计系统的方式,会直接影响到系统设计中的堆栈的所有部分。

  • 应用程序设计总会出现新的需求,一切都会转变为数据和测试,在一定程度上会影响算法,会影响到设计语言的方式,也会影响到运行时系统。会影响到下面的一切。

  • 底层也会有很多新问题技术的扩展。

  • 用户个性需求变化迅速。

对于计算机来说,与前10~20年前相比,计算机的前景差异很大。最典型的例子就是闪存,随着时间流动,对应的过去和未来,都在不断地发展

到了今天,如果你可以同时理解软件和硬件,并做相应的修改,也就可以去改变现目前或者未来计算机的构造方式。

对于架构来说,既要回顾过去,也要着眼于未来不会随着时间改变的事物。 - 只有足够了解,才可以去改变。 - 如果不足够了解,就无法作出一个好的判断。

5. 基础概念

5.1 计算机的关键部件

计算机在某种程度上由 计算、通信和存储 三个关键部件构成。

对于大部分的芯片有专门用于存储和移动数据的缓存区域。

5.2 计算机的冯诺依曼(von Neumann)模型/架构

对于冯诺依曼计算机也叫做存储程序计算机。有两个关键性的属性:

  • 存储程序

    • 对于指令来说,基本上都是线性方式存储在存储阵列中。
    • 内存是指令和数据的统一
      • 将一个存储值解释为指令还是数据都是取决于所应用的控制信号。
    • 对于这个架构中,所有的数据都是一样,但对数据的解释不同。
      • 主要取决于处理器对数据进行访问时。
  • 指令顺序提取处理

    • 一次一个指令处理,在进行完一个流程之后,又重新开始新一轮的指令执行操作:

      • 提取
      • 执行
      • 完成
      • 销毁
    • 主要思想:利用程序计数器(指令指针)去标识正在处理的当前指令。

    • 除了控制转移指令外,程序计数器都是优先顺序执行。
  • 对于冯诺依曼计算机来说,它是几十年来计算机领域的主导范例。

  • 截至目前,几乎大多数所有主要的指令集架构都是基于冯诺依曼结构模型,大多数都是基于顺序执行的方式,也是目前主流架构模型。

    x86、ARM、MIPS、SPARC、Alpha、Power等。

  • 在微架构层级,几乎所有实现的执行模型都是存在很大的差异的。但是性能基本上没啥问题。

    • 当一条指令执行完成时,可以执行下一条执行。从程序的角度来说,不需要处理多个指令,但从效率和性能的角度来说,这些指令就是很糟糕的指令。
    • 因为指令执行的方式并不是一个均匀的流水线指令执行去打破冯诺依曼架构模型。但是在流水线机器中,就需要一些机制来处理中断和异常。
      • Intel 80486 Uarch
    • 一次执行多个指令
      • Intel Pentium Uarch
    • 乱序执行
      • Intel Pentium Pro Uarch
    • 单独指令和数据缓存
  • 在底层(微架构层级)下面发生的与冯诺依曼模型不一致的地方,底层接口是并不会暴露给软件。

    • 这也是ISA和微架构的差异之处。
  • 推荐阅读材料

5.3 计算机的数据流(DataFlow)模型

  • 对于冯诺依曼模型,一条指令按控制流顺序提取并执行。

    • 由指令指针指定。
    • 顺序除非显式控制流指令
  • 数据流模型:在数据流顺序中获取一条指令并执行。

    • 数据流顺序实际上就是程序分支顺序,因为程序可能会存在分支,指向不同的执行分支,可能是判断字符的分时,也可能是判断数字的分支等。

    • 对于数据流来说,一个操作数可用时,即可直接获取并执行指令。

    • 对于结果来说,没有指令指针的概念。

    • 任何指令顺序都是由数据流依赖关系决定的。

      • 每条指令都指定谁或者其它哪个指令应该接收它的的结果。
      • 当对应的所有操作数都被接收时,一条指令就会触发执行。
    • 可以同时执行多个指令结构。

      • 本质上就是并行。
  • 对于冯诺依曼和数据流架构两种方式来说,执行的方式都有差异,可以大致表示为如下视图:

  • 在数据流机器中,程序是由数据流节点组成的。

    • 当所有的输入都准备好之后,数据流节点就会被触发执行指令(提取和执行)

      • 对于所有的数据结点来说,都有一个对应的token来进行识别处理。

  • 对于数据流结点来说,有一些常见的表示方式,主要可作为通用编程语言。

  • 设计并行程序的一种常见方法是设置一些线程的执行,如果是单线程,就建立一些执行,将一些任务的执行划分到不同的线程。

    • 程序的平行部分也叫并行部分,这也叫做串行线程。
  • 推荐阅读材料

6. ISA和微架构层级之间的权衡

  • 在ISA中是否需要指令指针?

    由于驱动方式的不同,则对应的需求则存在不同。

    • 控制驱动:需要

      • 顺序执行
      • 当一条指令指针指向一条指令时,就会被触发执行。
      • 除了控制流指令外,指令指针会自动顺序更改。
    • 数据驱动:不需要

      • 并行执行
      • 一条指令只要所有操作数的数值可用时,就会触发执行(数据流的执行方式)。
  • 在更高层级上如何权衡以下更多问题呢?

    • 问题点:

      • 对于普通程序员来说,编程的简单性?
      • 是否易于编译?
      • 性能:哪个并行性更好?
      • 硬件的复杂性?
    • 解决方案:

      • 对于如上几个问题点的权衡,可以通过在微架构层级上进行。
      • ISA层级:指定程序员如何看待要执行的指令。向程序员公开了软件和硬件的接口所指定的内容,主要看到的就是两种执行顺序:

        • 顺序、控制流的执行顺序
        • 数据流的执行顺序。
      • 微架构层级:指定了底层实现的实际执行方式。

        • 微架构可以通过任何顺序执行指令,只要它在使指令结果对软件可见时遵守ISA指定的语义规则。而指令的结果对于软件来说是可见的。
        • 程序员可以看得到ISA指定的顺序。

7. ISA和微架构相关的概念

  • 微处理器(Microprocessor)

    • ISA、Uarch、电路
    • 架构 = ISA + Microarchitecture
  • 对于设计来说,只要满足ISA规范,架构的实现就可以是多种多样。

    • Bit serial, ripple carry, carry lookahead adders are all part of microarchitecture

    • 例如遵循x86 ISA规范设计的产品:286、386、486、Pentium、Pentium Pro、Pentium 4、Core等等。

  • 微架构的变化通常是比ISA快,ISA很多,但是变化极少。

7.1 ISA

  • 协定软件和硬件之间的接口

    • 软件和编译器假定和硬件承诺提供微架构。
    • 软件是无法看到具体的实现,
  • 对于软件编写人员来说,需要只要编写、调试系统/用户程序。

对于ISA来说,可以分为很多部分:

  • 指令

    • 操作码、寻址模式、数据类型
    • 指令类型和格式
    • 寄存器、条件代码
  • 内存

    • 内存地址空间、可寻址性、内存对齐
    • 虚拟内存管理
  • 调用,中断/异常处理

  • 访问控制,优先级/特权

  • I/O:内存映射 VS instr

  • 任务/线程管理

  • 电源和热管理

  • 多线程支持,多处理器支持。

7.2 Microarchitecture

  • 在特定的设计约束和目标下实现ISA。

  • 在硬件上完成的任何操作,都不涉及到软件,所以对软件来说不可见。

    • 流水线
    • 有序和无序指令执行
    • 内存访问调度策略
    • 投机执行(Speculative Execution)
    • 超标量处理(多指令问题??)
    • 时钟门控(Clock Gating)
    • 缓存?级别、大小、结合性、替换策略
    • 预取
    • 电压/频率扩展
    • 纠错处理

论文阅读笔记

  • 待更新

Homework 1: ISA 实战笔记

  • 待更新