大家好,我是老萧。
缓存器相关的笔记老萧还在整理之中,为了不让大家久等,我打算先开始更新下一个系列的笔记文章——指令集架构(Instruction Set Architecture, ISA)。这一系列会更加的着重于 ISA 的历史、演化,相比于上一期的 Cache 缓存器来说,较为轻松简短,希望大家喜欢,并有所收获!
先按照国际惯例,贴下传送门:
Cache 缓存器系列笔记: Computer Architecture —— Cache 缓存器介绍 (一)
以下内容均为个人笔记,图片、内容来自:
1. 什么是指令集架构 (Instruction Set Architecture, ISA)?
先来看一张图:
图 1. 计算机系统抽象图
这张图描述了整个计算机系统从上到下的抽象层。首先最顶层的是应用程序(Application),那么应用程序在计算机里是由什么构成的呢?是由它的下一层级,算法(Algorithm)构成的。算法也依赖于所实现它的编程语言(Programming Language),然而编程语言也需要操作系统(Operating System)的支持才能正确工作。那什么东西支持操作系统呢?再往下一层就是我们今天的主角:指令集架构(Instruction Set Architecture, 以下简称 ISA)。
从 ISA 开始往下,都是和硬件电路相关的内容了,所以我们可以得出一个基本的定义:指令集架构是一个能为电路硬件翻译应用程序的一层抽象层。它能够为操作系统制定很多规则和约束,也能让编程者不用操心具体的电路结构,转而在这一抽象的、高级的、定义很多规则的层面编写程序,比如:
- 这个计算机架构里有多少个寄存器(Register)?
- 我能进行哪些运算操作?(有哪些指令?ADD,SUB,MUL 等等)
- 如果遇到异常或者中断该怎么办?
- 数据可以有哪些类型?最多有几个字节?
- 等等等等
2. 为什么需要指令集架构
为什么需要在整个计算机系统中添加这么一个抽象层呢?用历史上经典的一个故事就能展示出它的重要性。
指令集架构(ISA)第一次出现是在 IBM 360 机器上,而 IBM 360 的出现,是为了解决公司遇到的这样一个问题:
(插一嘴,文章封面里的大块头就是 IBM 360)
当时 IBM 同时拥有四条生产线:
- 701 (用于科学计算)
- 650
- 702
- 1401 (用于商业计算)
这四种计算机完全不兼容!每一种都配有自己的指令集、编译器、存储器、汇编器、链接器等等。每当有新的计算机设计的时候,都要为其编写合适的编译器、汇编器等等,其中有很多任务都是重复性的,大大增加了成本,浪费了劳动力。其次,用于这四种机器的应用程序也必须特定编写,运行在 701 上面的软件不能在 1401 上运行。于是,IBM 公司 在 1964 年的时候,推出了一款大型电脑 —— IBM 360,首次提出和定义了指令集架构(ISA),区分了架构和实现(Implementation,or Microarchitecture),增强了通用性。我们来看看 IBM 360 的 ISA 具体是怎样的:
16 个 32 - 位的通用寄存器(General Purpose Register,GPR)
4 个浮点寄存器(Floating-Point Register)
1 个程序状态寄存器(Program Status Word,PSW),用于储存程序计数器(Program Counter,PC)、条件代码(Condition Code)和控制标志(Control Flag)
运用了 24 位的地址
数据形式:(注:IBM 360 第一次定义了以下这些数据形式,并且得到了计算机界的认可,传承至今)
8 比特 = 1 字节 (8-bit = Byte)
16 比特 = 1 半字 (16-bit = Half Word)
32 比特 = 1 字 (32-bit = Word)
64 比特 = 1 双字 (4-bit = Double Word)
规定了这些,程序就可以依照这些特性来设计,并且只要依照这些特性设计的程序,都可以运行在支持这个架构的计算机上,这样一来,程序、编译器、汇编器等等软件的通用性就增加了。
3. 决定指令集架构的因素有哪些
既然指令集架构(ISA)设计的初衷是通用性,那为什么存在很多不同种类的架构呢,比如 ARM、x86、MIPS、PowerPC 等等?这是因为时势造英雄,在计算机发展的历史中,程序的要求和技术的限制造就了不同的架构。
在过去,程序没有那么复杂,编译器也没有那么聪明,内存的容量和速度是最大的瓶颈。所以一个程序所产生的指令的多少,很大程度上决定了它的性能。所以在以前的时候,指令都是可变长度(Variable-Length Instruction),这样就可以最大程度利用内存的容量,而且每条指令都能让处理器进行复杂的工作,这就是 CISC 指令集(Complex Instruction Set Computing)。
随着程序的发展,新的指令也在不断加入指令集架构中,指令集系统越来越复杂。比如,现在有越来越多的视频处理程序,这就要求指令集架构能提供 矢量(Vector) 相关的运算指令。而随着编译器变得越来越聪明,很多优化可以由编译器来完成,这就让人们开始更多的关注 RISC 指令集(Reduced Instruction Set Computing),一种使用固定长度指令、大量使用寄存器的指令级架构。
技术上的突破也让这种新的架构成为可能。随着内存和缓存的制造成本越来越低,我们不需要再像以前那样节约内存,这样可以使用固定长度的指令(Fixed-Length Instructions),可以大大优化指令解码的过程,减少处理器的周期时间。寄存器的成本降低,随之而来的就是可以在处理器里运用大量的寄存器组(Register File),也可以让地址空间(Address Space)从 32 位 扩展到 64 位。
现如今,RISC 和 CISC 也隐隐有着融合的趋势。CISC 处理器中添加了有着 RISC 机制的微指令(Micro-op, uop),而在 RISC 处理器中存在了 CISC 才有的微程序内存(Micro-code ROM),用来执行复杂的任务。
总而言之,来自上层软件程序的性能要求,和来自底部技术的限制,塑造了如今现有的指令集架构。未来 ISA 发展的趋势,就是在最大程度利用现有技术的情况下,为软件运行提供最好的性能支持。
4. 指令集架构(ISA) vs. 微架构(Microarchitecture)
指令集架构(ISA)和微架构(Microarchitecture)很多时候会被人们混淆。其实微架构就是对 ISA 的一种实现。
比如,AMD 和 Intel 的两款不同的芯片,尽管他们的指令集架构一样,能够运行相同的操作系统和程序,但他们的具体实现方式是不一样的,也就是他们拥有着不一样的微架构。
微架构更感兴趣的,是设计芯片时,各个指标的权衡(Trade-off)。这些指标包含了:
- 功率(Power)
- 面积(Area)
- 成本(Cost)
- 性能(Performance)
相比指令集架构,微架构更加关注这些内容:
- 流水线深度
- 流水线宽度(超标量流水线)
- 缓存器的大小
- 总面积
- 峰值功率
- 乱序执行(Out-of-Order)还是 有序执行(In-Order)
- 总线带宽
- 等等等等……
综合而言,微架构是指令集架构的一种实现方式,不同的处理器有着不一样的微架构。如果你是 RTL 设计工程师 或者 验证工程师,你就会拿到处理器的指令集架构的手册,然后根据这个手册,来设计或者验证芯片的微架构。
https://zhuanlan.zhihu.com/p/345307861