Download presentation
Presentation is loading. Please wait.
Published byWillis Robinson Modified 5年之前
1
周学海 xhzhou@ustc.edu.cn 0551-63606864 中国科学技术大学
2019/6/3 计算机体系结构 周学海 中国科学技术大学
2
03/06-review-性能 性能度量 CPU 执行时间 = IC × CPI × T
响应时间 (response time) 吞吐率 (Throughput) CPU 执行时间 = IC × CPI × T CPI ( Cycles per Instruction) MIPS = Millions of Instructions Per Second Latency versus Bandwidth Latency指单个任务的执行时间,Bandwidth 指单位时间完成的任务量(rate) Latency 的提升滞后于带宽的提升 (在过去的30年) Amdahl’s Law 用来度量加速比(speedup) 性能提升受限于任务中可加速部分所占的比例 应用于多处理器系统的基本假设:在给定的问题规模下,研究随着处理器数目的增加性能的变化 Benchmarks:指一组用于测试的程序 比较计算机系统的性能 SPEC benchmark : 针对一组应用综合性能值采用SPEC ratios 的几何平均 2019/6/3
3
03/06-review-能耗/功耗 给定负载情况下能耗越少,能效越高, 特别是对电池供电的移动设备。
功耗已经成为系统设计的重要约束条件之一 A chip might be limited to 120 watts (cooling + power supply) Power Consumed = Dynamic Power + Static Power 晶体管开和关的切换导致的功耗为动态功耗 由于晶体管静态漏电流导致的功耗称为静态功耗 通过降低频率可节省功耗 降低电压可降低功耗和能耗 2019/6/3
4
Recap:指令集架构 软件子系统与硬件子系统的关键界面 一组直接由硬件执行的指令,包括 应具备的特性
instruction set software hardware 软件子系统与硬件子系统的关键界面 一组直接由硬件执行的指令,包括 程序员可见的机器状态 程序员可见的指令集合(操作机器状态的指令) 应具备的特性 成本 简洁性 架构和具体实现分离:可持续多代,以保持向后(backward) 兼容 可扩展空间:可用于不同应用领域(desktops, servers, embedded applications) 易于编程/编译/链接:为高层软件的设计与开发提供方便的功能 性能:方便低层硬件子系统高效实现 IBM 360 是第一个将ISA与其实现分离的系列机 给定一个ISA,可以有不同的实现方式;例如AMD/Intel CPU 都是X86-64指令集。ARM ISA 也有不同的实现方式 2019/6/3
5
用户级ISA和特权级ISA 重要的系统界面(System Interface) ISA:用户级ISA+特权级ISA
ISA界面(Instruction Set Architecture) ABI界面(Application Binary Interface) ISA:用户级ISA+特权级ISA 用户级ISA 适用于操作系统和应用程序 特权级ISA 适用于硬件资源的管理(操作系统) 2019/6/3
6
ISA的实现 ISA 通常设计时会考虑特定的微体系结构(实现)方式。 ISA 理论上可以用任何微体系结构(实现)方式
Accumulator hardwired, unpipelined (硬布线、非流水) CISC microcoded (微程序) RISC hardwired, pipelined(硬布线、流水线) VLIW fixed-latency in-order parallel pipelines (固定延时、顺序执行、多条流水线并行) JVM software interpretation(软件解释) ISA 理论上可以用任何微体系结构(实现)方式 Intel Ivy Bridge: hardwired pipelined CISC (x86) machine (with some microcode support) (硬布线流水化(部分微程序支持)) Spike: Software-interpreted RISC-V machine (模拟器) ARM Jazelle: A hardware JVM processor 2019/6/3 CS252 S05
7
Recap:ISA 的演进 2019/6/3
8
Recap:ISA必须说明哪些东西? 指令格式或编码方式。即如何编码? 操作数和操作结果的存放位置 数据类型和大小 支持哪些操作
Instruction Fetch Decode Operand Execute Result Store Next 指令格式或编码方式。即如何编码? 操作数和操作结果的存放位置 存放位置? 多少个显式操作数? 存储器操作数如何定位? 哪些操作数可以或不可以放到存储器中? 寻址方式 数据类型和大小 支持哪些操作 下一条指令地址 jumps, conditions, branches fetch-decode-execute is implicit! 2019/6/3
9
Recap: 有关ISA的若干问题 存储器寻址 操作数的类型与大小 所支持的操作 控制转移类指令 指令格式 2019/6/3
10
Recap: 存储器寻址 80年以来几乎所有机器的存储器都是按字节编址 一个存储器地址可以访问: 不同体系结构对字的定义是不同的
一个字节、2个字节、4个字节、更多字节….. 不同体系结构对字的定义是不同的 16位字(Intel X86)32位字(MIPS) 如何读32位字,两种方案 每次一个字节,四次完成;每次一个字,一次完成 问题: (1)如何将字节地址映射到字地址 (尾端问题) (2)一个字是否可以存放在任何字节边界上(对齐问题) 2019/6/3
11
Recap: 尾端问题 little endian, big endian, 在一个字内部的字节顺序问题
如地址xxx00指定了一个字(int), 存储器中从xxx00处连续存放ffff0000, 则有两种方式: Little endian 方式下xxx00位置是字的最低字节,整数值为0000ffff, Intel 80x86, DEC Vax, DEC Alpha (Windows NT) Big endian 方式下xxx00位置是字的最高字节,整数值为ffff0000, IBM 360/370, Motorola 68k, MIPS, Sparc, HP PA 2019/6/3
12
Recap: 对齐问题 对s字节的对象访问地址为A,如果A mod s =0 称为边界对齐。
边界对齐的原因是存储器本身读写的要求,存储器本身读写通常就是边界对齐的,对于不是边界对齐的对象的访问可能要导致存储器的两次访问,然后再拼接出所需要的数。(或发生异常) 2019/6/3
13
Recap: 寻址方式 寻址方式:如何说明要访问的对象地址
有效地址:由寻址方式说明的某一存储单元的实际存储器地址。有效地址 vs. 物理地址 2019/6/3
14
各种寻址方式的使用情况? (忽略寄存器直接寻址)
三个SPEC89程序在VAX结构上的测试结果: 立即寻址,偏移寻址使用较多 2019/6/3
15
偏移寻址 主要问题:偏移的范围(偏移量的大小)
Alpha Architecture with full optimization for Spec CPU2000, showing the average of integer programs(CINT2000) and the average of floating-point programs (CFP2000) 2019/6/3
16
立即数寻址 Alpha Architecture with full optimization for Spec CPU2000, showing the average of integer programs(CINT2000) and the average of floating-point programs (CFP2000) 2019/6/3
17
立即数的大小 The distribution of immediate values. About 20% were negative for CINT2000 and about 30% were negative for CFP2000. These measurements were taken on a Alpha, where the maximum immediate is 16 bits, for the spec cpu2000 programs. A similar measurement on the VAX, which supported 32-bit immediates, showed that about 20% to 25% of immediates were longer than 16 bits. 2019/6/3
18
寻址方式小结 重要的寻址方式: 偏移字段的大小应该在 12 - 16 bits 立即数字段的大小应该在 8 -16 bits
偏移寻址方式, 立即数寻址方式, 寄存器间址方式 SPEC测试表明,使用频度达到 75%--99% 偏移字段的大小应该在 bits 可满足75%-99%的需求 立即数字段的大小应该在 bits 可满足50%-80%的需求 1, 性能综合 (第6节) 2,第2章 第1次 (第7节)ISA 分类、memory addressing 2019/6/3
19
操作数的类型、表示和大小 操作数类型和操作数表示是软硬件的主要界面之一。 操作数类型:是面向应用、面向软件系统所处理的各种数据类型。
整型、浮点型、字符、字符串、向量类型等 类型由操作码确定或数据附加硬件解释的标记,一般采用由操作码确定 数据附加硬件解释的标记,现在已经不采用 操作数的表示:操作数在机器中的表示,硬件结构能够识别,指令系统可以直接使用的表示格式 整型:原码、反码、补码 浮点:IEEE 754标准 十进制:BCD码/二进制十进制表示 2019/6/3
20
常用操作数类型 ASCII character = 1 byte (64-bit register can store 8 characters Unicode character or Short integer = 2 bytes = 16 bits (half word) Integer = 4 bytes = 32 bits (word size on many RISC Processors) Single-precision float = 4 bytes = 32 bits (word size) Long integer = 8 bytes = 64 bits (double word) Double-precision float = 8 bytes = 64 bits (double word) Extended-precision float = 10 bytes = 80 bits (Intel architecture) Quad-precision float = 16 bytes = 128 bits 2019/6/3
21
操作数的大小 基准测试的结论:(1)对单字、双字的数据访问具有较高的频率 (2)支持64位双字操作,更具有一般性 2019/6/3
22
小结:指令集架构 ISA需考虑的问题 ISA的类型 寻址方式 操作数的类型和大小 Class of ISA
Memory addressing Types and sizes of operands Operations Control flow instructions Encoding an ISA …… ISA的类型 通用寄存器型占主导地位 寻址方式 重要的寻址方式: 偏移寻址方式, 立即数寻址方式, 寄存器间址方式 SPEC测试表明,使用频度达到 75%--99% 偏移字段的大小应该在 bits, 可满足75%-99%的需求 立即数字段的大小应该在 bits, 可满足50%-80%的需求 操作数的类型和大小 对单字、双字的数据访问具有较高的频率 支持64位双字操作,更具有一般性 1 chapter 1 性能综合评估 算术平均 调和平均 几何平均 2 Chapter 2 ISA的分类、寻址方式 2019/6/3
23
MIPS MIPS是最典型的RISC 指令集架构 主要特征: Stanford, 1980年提出,主要受到IBM801 小型机的影响
最初的设计中,其整数指令集仅有58条指令,直接实现单发射、顺序流水线 30年来,逐步增加到约400条指令。 主要特征: Load/Store型结构,专门的指令完成存储器与寄存器之间的传送 ALU类指令的操作数来源于寄存器或立即数(指令中的特定区域) 降低了指令集和硬件的复杂性,依赖于优化编译技术,方便了简单流水线的实现 2019/6/3
24
主要缺陷: 针对特定的微体系架构的实现方式(5级流水、单发射、顺序流水线)进行过度的优化设计
延迟转移问题导致超标量等复杂流水线的实现难度,当无法有效填充延迟槽时会导致代码尺寸变大 MIPS-I中暴露出其他流水线冲突(load、乘除引起的冲突)采用简单的Interlocking 简单又高效,但为了保持兼容性,仍然保留了延迟转移 ISA对位置无关的代码(position-independent code, PIC)支持不足。 直接跳转没有提供PC相对寻址,需要通过间接跳转方式实现PIC,增加了代码尺寸,降低了性能 2014年MIPS的修订,改进了PC-相对寻址(针对数据),但仍然要多条指令才能完成 16位位宽立即数消耗了大量编码空间,只有少量的编码空间可供扩展指令 2014修订版,保存有1/64的编码空间供扩展 架构师如果想采用压缩指令编码来降低代码空间,就不得不采用新的指令编码 乘除指令使用了特殊的寄存器(HI,LO),导致上下文切换内容、指令条数、代码尺寸增加,微架构实现复杂 2019/6/3
25
ISA假设浮点操作部件是一个独立的协处理器,使得单芯片实现无法最优
例如,整型数与浮点数的转换结果写到浮点数寄存器,使用结果时,需要额外的mov指令,更糟糕的是浮点数寄存器文件与整型数寄存器文件之间的传输,需要有显式的延迟槽 在标准的ABI中,保留两个整型寄存器用于内核程序,减少了用户程序可用的寄存器数 使用特殊指令处理未对齐的load和store会消耗大量的操作码空间,并使除了最简单的实现之外的其他实现复杂化。 时钟速率/CPI 的权衡使得架构师省略了整数大小比较和分支指令。随着分支预测和静态CMOS逻辑的出现,这种权衡在今天已经不太合适了。 除了技术方面,MIPS是非开放的专属指令集,不能自由使用 2019/6/3
26
SPARC Sun Microsystems的专属指令集 SPARC V8 主要特征 主要问题
可追溯到Berkeley RISC-I和RISC-II项目 ; 最近的32位版本的ISA SPARC V8 SPARC V8 主要特征 用户级 整型ISA 90条指令; 硬件支持IEEE 标准的浮点数(50条) ;特权级指令 20条 主要问题 SPARC使用了寄存器窗口来加速函数调用 当函数调用所需的栈空间超过了窗口的寄存器数,性能会急剧下降。对于所有的实现来说,寄存器窗口都消耗很大的面积和功耗 分支使用条件码 这些条件码由于在一些指令之间创建了额外的依赖关系,增加了体系结构状态并使实现复杂化 load和store相邻寄存器对的指令 对于简单的微体系结构很有吸引力,可以在很少增加硬件复杂性的情况下提高吞吐量。 遗憾的是当使用寄存器重命名使实现复杂化,因为在寄存器文件中数据在物理上可能不再相邻 浮点寄存器文件和整数寄存器文件之间的移动必须使用内存系统作为中介,限制了系统性能 2019/6/3
27
SPARC ISA通过体系结构公开的延迟陷阱队列支持非精确浮点异常,该队列向系统监控程序提供信息,以恢复此类异常上的处理器状态
唯一的原子内存操作是fetch-and-store,这对于实现许多无等待的数据结构是不够的 SPARC与其他80年代RISC结构的许多有缺陷的特性 ISA设计面向单发射、顺序、五级流水线的微体系架构; SPARC具有分支延迟插槽和许多显式的数据和控制冲突,这些冲突使代码生成复杂化,无助于更积极的实现; 缺乏位置无关的寻址方式(相对寻址) 由于SPARC缺乏足够的自由编码空间,因此不能方便地对其进行改进以支持压缩ISA扩展 2019/6/3
28
Alpha (DEC) DEC公司的架构师在20世纪90年代初定义了他们的RISC ISA, Alpha
摒弃了当时非常吸引人的特性,如分支延迟、条件码、寄存器窗口等 创建了64位寻址空间、设计简洁、实现简单、高性能的ISA Alpha架构师仔细地将特权体系结构和硬件平台的大部分细节隔离在抽象接口(特权体系结构库)后面(PALcode) 主要问题:尽管如此,DEC对顺序微架构的Alpha进行了过度优化,并添加了一些不太适合现代实现的特性 为了追求高时钟频率,ISA的原始版本避免了8位和16位的加载和存储,实际上创建了一个字寻址的内存系统。为了在广泛使用这些操作的应用程序上性能,添加了特殊的未对齐的加载和存储指令以及一些整数指令,以加速重新组合过程。 为了方便长延迟浮点指令的乱序完成,Alpha 有一个非精确的浮点陷阱模型。这个决定可能是可以单独接受的,但是ISA还定义了异常标记和默认值(如果需要的话)必须由软件例程提供。 Alpha缺少整数除法指令,建议使用软件牛顿迭代法实现,导致浮点除法速度高于整数除法 这种组合对于IEEE-754兼容的程序来说是灾难性的 2019/6/3
29
与它的前辈RISC一样,没有预先考虑可能的压缩指令集扩展,因此没有足够的操作码空间来进行更新
ISA包含有条件的移动,这使得微架构与寄存器重命名复杂化 如果移动条件不满足,指令仍然必须将旧值复制到新的物理目标寄存器中。这实际上使条件移动成为ISA中惟一读取三个源操作数的指令。 实际上,DEC的第一个乱序执行的实现使用了一些技巧来避免该指令的额外数据路径。 Alpha 21264通过将条件移动指令分解为两个微操作来执行,第一个微操作评估移动条件,第二个微操作执行移动。这种方法还要求物理寄存器文件加宽一位以保存中间结果 使用商业Alpha ISAs的一个重要风险:它们可能会被摒弃。康柏在上世纪90年代末收购了摇摇欲坠的DEC后不久,他们选择逐步淘汰Alpha,转而采用英特尔的安腾架构。康柏将Alpha的知识产权出售给了英特尔,此后不久,惠普收购了康柏,并在2004年完成了Alpha的最终实现 2019/6/3
30
ARMv7 32位 RISC ISA 即使知识产权不是问题,它仍然存在一些技术缺陷
目前世界上使用最广的体系结构。当我们权衡是否要设计自己的指令集时,ARMv7是一个自然的选择,大量的软件已经被移植到该ISA上,而且它在嵌入式和移动设备中无处不在。 是一个封闭的标准,剪裁或扩充是不允许的,即使是微架构的创新也仅限于那些能够获得ARM所称的架构许可的人 ARMv7十分庞大复杂。整型类指令600+条 即使知识产权不是问题,它仍然存在一些技术缺陷 不支持64位地址, ISA缺乏硬件支持IEEE 标准( ARMv8 纠正了这些缺陷) 特权体系结构的细节渗透到用户级体系结构的定义中 2019/6/3
31
ARMv7附带一个压缩ISA,具有固定宽度的16位指令,称为Thumb。
Thumb-2 虽然提供了较高的性能,但32位的Thumb-2编码方式与基本的ISA编码方式不同,16位的Thumb-2的编码方式与基本的16位编码方式也不同。导致译码器需要理解三种编码格式,使得能耗、延迟以及设计成本增加 ISA中包含了许多实现复杂的特性。 程序计数器是可寻址寄存器之一,这意味着几乎任何指令都可以改变控制流。 更糟糕的是,程序计数器的最低有效位反映ISA当前正在执行(ARM或Thumb)哪个ISA——简单的ADD指令可以更改ISA当前在处理器上执行的指令! 分支使用条件码以及谓词指令进一步使高性能实现复杂化。 2019/6/3
32
ARMv8 2011年,ARM发布新的ISA ARMv8 主要问题 64位地址; 扩展了整型寄存器组。 摒弃了ARMv7中实现复杂的一些特性
PC不再是整形寄存器组的成员; 不再有谓词指令 删除了load-multiple和store-multiple 指令 指令编码归一化 主要问题 使用条件码 存在许多特殊的寄存器 2019/6/3
33
增加了一些缺陷,包括大量的subword-SIMD架构 指令集更加厚重:1070条指令,53种格式,8种寻址方式。说明文档达到了5778页
与其他大多数ISA一样,通常以暴露底层实现的方式将用户和特权架构紧密地结合在一起 此外,随着ARMv8的引入,ARM不再支持压缩指令编码 最后,和它的以前版本一样,ARMv8也是一个封闭的标准 2019/6/3
34
OpenRISC OpenRISC项目是一个开放源码处理器设计项目 主要问题 来源于Hennessy和Patterson的体系结构教科书。
适用于教学、科研和工业界的实现。 主要问题 OpenRISC项目主要是开源处理器设计项目,而不是开源的ISA 规格说明,ISA和实现是紧密耦合的 固定的32位编码与16位立即数阻碍了压缩ISA扩展 硬件不支持IEEE 标准 用于分支和条件转移的条件码使高性能实现复杂化 ISA对位置无关的寻址方式支持较弱 OpenRISC不利于虚拟化。从异常返回的指令L.RFE,定义为在用户模式下功能,而不是捕获 值得一提的是:2010年这两个问题都得到了解决:延迟插槽已经成为可选的,64位版本已经定义(但是,据我们所知,从未实现过)。最终,我们(UCB)认为最好从头开始,而不是相应地修改OpenRISC。 2019/6/3
35
80x86 在过去的四十年里,英特尔的8086架构已经成为笔记本电脑、台式机和服务器市场上最流行的指令集。 主要问题:
在嵌入式系统领域之外,几乎所有流行的软件都被移植到x86上,或者是为x86开发的 它受欢迎的原因有很多:该架构在IBM PC诞生之初的偶然可用性; 英特尔专注于二进制兼容性; 它们积极的卓有成效的微结构实现; 以及他们的前沿制造技术 指令集设计质量并不是它流行的原因之一。 主要问题: 1300条指令,许多寻址方式,很多特殊寄存器,多种地址翻译方式,从AMD K5微架构开始,所有的Intel支持乱序执行的微结构,都是动态地将x86指令翻译为内部的RISC-风格的指令集。 ISA不利于虚拟化,因为一些特权指令在用户模式下会无声地失败,而不是被捕获。VMware的工程师们用复杂的动态二进制翻译软件解决了这一缺陷 ISA的指令长度为任意整数字节数,最多为15个字节,但是数量较少的短操作码已经被随意使用 2019/6/3
36
大多数整数寄存器在ISA中执行特殊功能,这加剧了体系结构寄存器的不足
更糟糕的是,大多数x86指令只有一种破坏性的指令格式,它会覆盖其中一个源操作数 一些ISA特性,包括隐式条件代码和带有谓词的移动操作,在微架构中实现复杂 这些ISA决策对静态代码大小有深刻的影响。尽管存在所有这些缺陷,x86通常比RISC体系结构使用更少的动态指令完成相同的功能,因为x86指令可以编码多个基本操作。 最后,80x86是一个专有指令集 2019/6/3
37
ISA Summary MIPS SPARC Alpha ARMv7 ARMv8 OpenRISC 80x86 Free and Open
√ 64-bit Address Compressed Instructions Partial Separate Privileged ISA Position-Indep. Code IEEE Classically Virtualizable 2019/6/3
38
03/11:指令集架构 ISA需考虑的问题 ISA的类型 寻址方式 操作数的类型和大小 Class of ISA
Memory addressing Types and sizes of operands Operations Control flow instructions Encoding an ISA …… ISA的类型 通用寄存器型占主导地位 寻址方式 重要的寻址方式: 偏移寻址方式, 立即数寻址方式, 寄存器间址方式 SPEC测试表明,使用频度达到 75%--99% 偏移字段的大小应该在 bits, 可满足75%-99%的需求 立即数字段的大小应该在 bits, 可满足50%-80%的需求 操作数的类型和大小 对单字、双字的数据访问具有较高的频率 支持64位双字操作,更具有一般性 1 chapter 1 性能综合评估 算术平均 调和平均 几何平均 2 Chapter 2 ISA的分类、寻址方式 2019/6/3
39
ISA的操作 CISC 指令集结构的功能设计 RISC 指令结构的功能设计 2019/6/3
40
典型操作类型 一般计算机都支持前三类所有的操作; 不同计算机系统 对系统支持程度不同,但都支持基本的系统功能。
对最后四类操作的支持程度差别也很大,有些机器不支持,有些机器还在此基础上做一些扩展,这些指令有时作为可选的指令。 2019/6/3
41
Top 10 80x86 Instructions 2019/6/3
42
ISA对操作类型的选择 需考虑的因素:速度、价格和灵活性 基本要求:指令系统的完整性、规整性、高效率和兼容性
完整性设计:具备基本指令种类 兼容性:系列机 高效率:指令执行速度快、使用频度高 规整性 让所有运算部件都能对称、均匀的在所有数据存储单元之间进行操作。 对所有数据存储单元都能同等对待,无论是操作数或运算结果都可以无约束地存放到任意数据存储单元中 正交性 数据类型独立于寻址方式 寻址方式独立于所要完成的操作 当前对这一问题的处理有两种截然不同的方向 CISC和RISC 2019/6/3
43
CISC计算机ISA的功能设计 目标:强化指令功能,减少指令条数,以提高系统性能 基本优化方法
1. 面向目标程序的优化是提高计算机系统性能最直接方法 优化目标 缩短程序的长度 缩短程序的执行时间 优化方法 统计分析目标程序执行情况,找出使用频度高,执行时间长的指令或指令串 优化使用频度高的指令 用新的指令代替使用频度高的指令串 2019/6/3
44
优化目标程序的主要途径(1/2) 1)增强运算型指令的功能 如sin(x), cos(x), SQRT(X),甚至多项式计算
如用一条三地址指令完成 P(X) = C(0)+C(1)X+C(2)X2+C(3)X3+….. 2) 增强数据传送类指令的功能 主要是指数据块传送指令 R-R, R-M, M-M之间的数据块传送可有效的支持向量和矩阵运算,如IBM370 R-Stack之间设置数据块传送指令,能够在程序调用和程序中断时,快速保存和恢复程序现场,如 VAX-11 2019/6/3
45
优化目标程序的主要途径(2/2) 3) 增强程序控制指令的功能 2. 面向高级语言和编译程序改进指令系统
在CISC中,一般均设置了多种程序控制指令,正常仅需要转移指令和子程序控制指令 2. 面向高级语言和编译程序改进指令系统 优化目标:主要是缩小HL-ML之间的差距 优化方法: 1)增强面向HL和Compiler支持的指令功能 统计分析源程序中各种语句的使用频度和执行时间 增强相关指令的功能,优化使用频度高、执行时间长的语句 增加专门指令,以缩短目标程序长度,减少目标程序执行时间,缩短编译时间 2019/6/3
46
FORTRAN语言和COBOL语言中各种主要语句的使用频度
观察结果: (1)一元赋值在其中比例最大,增强数据传送类指令功能,缩短这类指令的执行时间是对高级语言非常有力的支持, (2)其他赋值语句中,增1操作比例较大,许多机器都有专门的增1指令 (3)条件转移和无条件转移占22%,38.2%,因此增强转移指令的功能,增加转移指令的种类是必要的 语言 一元赋值 其他赋值 IF GOTO I/O DO CALL 其他 FORTRAN 31.0 15.0 11.5 10.5 6.5 4.5 6.0 COBOL 42.1 7.5 19.1 8.46 0.17 3.4 2019/6/3
47
2)高级语言计算机系统 3)支持操作系统的优化实现-些特权指令
缩小HL和ML的差别时,走到极端,就是把HL和ML合二为一,即所谓的高级语言计算机。在这种机器中,高级语言不需要经过编译,直接由机器硬件来执行。如LISP机,PROLOG机 3)支持操作系统的优化实现-些特权指令 任何一种计算机系统通常需要操作系统,而OS又必须用指令系统来实现,指令系统对OS的支持主要有 处理器工作状态和访问方式的转换 进程的管理和切换 存储管理和信息保护 进程同步和互斥,信号量的管理等 2019/6/3
48
-Review (续) ISA的功能设计 CISC(Complex Instruction Set Computer)
任务:确定硬件支持哪些操作 方法:统计的方法 两种类型:CISC和RISC CISC(Complex Instruction Set Computer) 目标:强化指令功能,减少运行的指令条数,提高系统性能 方法:面向目标程序的优化,面向高级语言和编译器的优化 RISC(Reduced Instruction Set Computer) 目标:通过简化指令系统,用高效的方法实现最常用的指令 方法:充分发挥流水线的效率,降低(优化)CPI 2019/6/3
49
RISC指令集结构的功能设计 采用RISC体系结构的微处理器
SUN Microsystem: SPARC, SuperSPARC, Ulta SPARC SGI: MIPS R4000, R5000, R10000, IBM: Power PC Intel: 80860, 80960 DEC: Alpha Motorola 88100 HP HP300/930系列,950系列 ARM,MIPS RISC-V 2019/6/3
50
RISC的定义和特点 RISC是一种计算机体系结构的设计思想,它不是一种产品。RISC是近代计算机体系结构发展史中的一个里程碑,直到现在,RISC没有一个确切的定义 早期对RISC特点的描述 大多数指令在单周期内完成 采用Load/Store结构 硬布线控制逻辑 减少指令和寻址方式的种类 固定的指令格式 注重代码的优化 从目前的发展看,RISC体系结构还应具有如下特点: 面向寄存器结构 十分重视流水线的执行效率-尽量减少断流 重视优化编译技术 减少指令平均执行周期数是RISC思想的精华 2019/6/3
51
问题 RISC的指令系统精简了,CISC中的一条指令可能由一串指令才能完成,那么为什么RISC执行程序的速度比CISC还要快?
ExecuteTime = CPI X IC X T IC CPI T CISC ~ ns~5ns RISC ~ ~ ns~2ns IC : 实际统计结果,RISC的IC只比CISC 长30%~40% CPI: CISC CPI一般在4~6之间,RISC 一般CPI =1 , Load/Store 为2 T: RISC采用硬布线逻辑,指令要完成的功能比较简单 2019/6/3
52
RISC为什么会减少CPI 硬件方面: 软件方面:十分强调优化编译的作用 硬布线控制逻辑 减少指令和寻址方式的种类 使用固定格式
采用Load/Store 指令执行过程中设置多级流水线。 软件方面:十分强调优化编译的作用 2019/6/3
53
控制类指令 四种类型的控制流改变: 条件分支( Conditional branch) 、跳转(Jump)、过程调用(Procedure calls)、过程返回(Procedure returns) Alpha Architecture with full optimization for Spec CPU2000, showing the average of integer programs(CINT2000) and the average of floating-point programs (CFP2000) 2019/6/3
54
控制流类指令中的寻址方式 PC-relative 方式 (相对寻址) 说明动态的转移地址方式(通过寄存器间接跳转): 例如:条件转移
编译时不知道目标地址,程序执行时动态确定 Case or switch statements Virtual function or methods High-order functions or function pointers Dynamically shared libraries 转移地址放到某一寄存器中,通过寄存器间接跳转 2019/6/3
55
转移目标地址与当前指令的距离 Alpha Architecture with full optimization for Spec CPU2000, showing the average of integer programs(CINT2000) and the average of floating-point programs (CFP2000) 建议:PC-relative 寻址,偏移地址至少8位 2019/6/3
56
分支比较类型比较 Alpha Architecture with full optimization for Spec CPU2000, showing the average of integer programs(CINT2000) and the average of floating-point programs (CFP2000) 2019/6/3
57
指令编码 Variable: Fixed: Hybrid: … 2019/6/3
58
指令格式选择策略 如果代码规模最重要,那么使用变长指令格式 如果性能至关重要,使用固定长度指令
有些嵌入式CPU附加可选模式,由每一应用自己选择性能还是代码量 窄指令支持更少的操作、更短的地址和立即数字段、更少的寄存器以及双地址格式,而不是传统的RISC计算机的三地址格式 例如:RISC-V 的 RV32IC, C表示压缩表示 ARM Thumb , microMIPS 有些机器使用边执行边解压的方式 例如 IBM 的CodePack PowerPC 2019/6/3
59
MIPS 寻址方式/指令格式 所有指令都是32位宽 Register Indirect? op rs rt rd immed
Register (direct) Base+index + Memory Immediate PC PC-relative Register Indirect? 2019/6/3
60
小结 ISA的功能设计:任务为确定硬件支持哪些操作。方法是统计的方法。存在CISC和RISC两种类型 控制转移类指令 指令编码(指令格式)
CISC(Complex Instruction Set Computer) 目标:强化指令功能,减少指令的指令条数,以提高系统性能 基本方法:面向目标程序的优化,面向高级语言和编译器的优化 RISC(Reduced Instruction Set Computer) 目标:通过简化指令系统,用最高效的方法实现最常用的指令 主要手段:充分发挥流水线的效率,降低(优化)CPI 控制转移类指令 指令编码(指令格式) 2019/6/3
61
ISA的演进 2019/6/3
62
Recap: MIPS指令集结构 MIPS64的一个子集,简称为MIPS MIPS的寄存器 32个64位通用寄存器(GPRs)
R0,R1,…,R31 也被称为整数寄存器 R0的值永远是0 32个64位浮点数寄存器(FPRs) F0,F1,…,F31 用来存放32个单精度浮点数(32位),也可以用来存放32个双精度浮点数(64位)。 存储单精度浮点数(32位)时,只用到FPR的一半,其另一半没用 一些特殊寄存器 它们可以与通用寄存器交换数据。 例如,浮点状态寄存器用来保存有关浮点操作结果的信息。 2019/6/3
63
Recap:MIPS的数据表示 整数 浮点数
字节(8位) 半字(16位)字(32位) 双字(64位) 浮点数 单精度浮点数(32位) 双精度浮点数(64位) 字节、半字或者字在装入64位寄存器时,用零扩展或者用符号位扩展来填充该寄存器的剩余部分。装入以后,对它们将按照64位整数的方式进行运算。 2019/6/3
64
Recap:MIPS的寻址方式 立即数寻址与偏移量寻址 寄存器间接寻址是通过把0作为偏移量来实现的
立即数字段和偏移量字段都是16位的。 寄存器间接寻址是通过把0作为偏移量来实现的 16位绝对寻址是通过把R0(其值永远为0)作为基址寄存器来完成的 MIPS的存储器是按字节寻址的,地址为64位 所有存储器访问都必须是边界对齐的 2019/6/3
65
Recap:存储器中的数据存放(存储字长为 32 位)
地址(十进制) 4 8 12 16 20 24 28 32 36 双字 双字(地址32) 双字(地址24) 半字(地址20) 半字(地址22) 半字(地址16) 半字(地址18) 字节(地址 8) 字节(地址 9) 字节(地址10) 字节(地址11) 字(地址 4) 字(地址 0) 字节(地址14) 字节(地址15) 字节(地址13) 字节(地址12) 边界对准 ▲ ▲ 地址(十进制) 4 8 字节( 地址7) 字节( 地址6) 字( 地址2) 半字( 地址10) 半字( 地址8) 半字( 地址0) 字( 地址4) 边界未对准 2019/6/3
66
Recap:MIPS的指令格式 寻址方式编码到操作码中 所有的指令都是32位的 操作码占6位 3种指令格式 I类 R类 J类
2019/6/3
67
Recap:I类指令 包括所有的load和store指令、立即数指令,分支指令、寄存器跳转指令、寄存器链接跳转指令。
立即数字段为16位,用于提供立即数或偏移量。 2019/6/3
68
Recap:具体的I类指令 load指令 store指令 立即数指令 分支指令 寄存器跳转、寄存器跳转并链接
访存有效地址:Regs[rs]+immediate 从存储器取来的数据放入寄存器rt store指令 要存入存储器的数据放在寄存器rt中 立即数指令 Regs[rt] ← Regs[rs] op immediate 分支指令 转移目标地址:Regs[rs]+immediate,rt无用 寄存器跳转、寄存器跳转并链接 转移目标地址为Regs[rs] 2019/6/3
69
Recap:R类指令 包括ALU指令、专用寄存器读/写指令、move指令等 ALU指令
Regs[rd]← Regs[rs] funct Regs[rt] func为具体的运算操作编码 Sham : shamt 表示位移量 移位操作指令时使用 2019/6/3
70
Recap:J类指令 包括跳转指令、跳转并链接指令、自陷指令、异常返回指令
在这类指令中,指令字的低26位是偏移量,它与PC值相加形成跳转的地址 2019/6/3
71
Recap:MIPS的操作 MIPS指令可以分为四大类 符号的意义 load和store、ALU操作、分支与跳转、浮点操作
x←ny:从y传送n位到x x,y←z:把z传送到x和y 下标:表示字段中具体的位; 对于指令和数据,按从最高位到最低位(即从左到右)的顺序依次编号,最高位为第0位,次高位为第1位,依此类推。 下标可以是一个数字,也可以是一个范围。例如: Regs[R4]0:R4的符号位;Regs[R4]56..63:R4的最低字节 2019/6/3
72
以R6的内容作为地址访问内存,得到的字节按符 号位扩展为32位后存入R8的低32位,R8的高32位(即 Regs[R8]0..31)不变。
Mem:表示主存;按字节寻址,可以传输任意个字节。 上标:用于表示对字段进行复制的次数。 例如:0 32:一个32位长的全0字段 符号##:用于两个字段的拼接,并且可以出现在数据传送的任何一边。举例:R8、R10:64位的寄存器,则 Regs[R8] ←32(Mem [Regs[R6]]0)24 ## Mem [Regs[R6]] 表示的意义是: 以R6的内容作为地址访问内存,得到的字节按符 号位扩展为32位后存入R8的低32位,R8的高32位(即 Regs[R8]0..31)不变。 2019/6/3
73
Recap:MIPS控制类指令 指令举例 指令名称 含义 J name 跳转 PC 36··63← name<<2
JAL name 跳转并链接 Regs[R31]←PC+4;PC 36··63←name<<2; ((PC+4)-227)≤name<((PC+4)+227) JALR R3 寄存器跳转并链接 Regs[R31]←PC+4;PC← Regs[R3] JR R5 寄存器跳转 PC← Regs[R5] BEQZ R4,name 等于零时分支 if(Regs[R4]== 0) PC←name ; ((PC+4)-217)≤name<((PC+4)+217) BNE R3,R4,name 不相等时分支 if(Regs[R3]!= Regs[R4]) PC←name MOVZ R1,R2,R3 等于零时移动 if(Regs[R3]==0) Regs[R1]← Regs[R2] 2019/6/3
74
Recap:跳转指令 根据跳转指令确定目标地址的方式不同以及跳转时是否链接,可以把跳转指令分成4种。 确定目标地址的方式 跳转的两种类型
把指令中的26位偏移量左移2位后,替换程序计数器的低28位。 间接跳转:由指令中指定的一个寄存器来给出转移目标地址。 跳转的两种类型 简单跳转:把目标地址送入程序计数器。 跳转并链接:把目标地址送入程序计数器,把返回地址(即顺序下一条指令的地址)放入寄存器R31。 2019/6/3
75
Recap:分支指令(条件转移) 分支条件由指令确定。 提供一组比较指令,用于比较两个寄存器的值。
例如:测试某个寄存器的值是否为零 提供一组比较指令,用于比较两个寄存器的值。 例如:“置小于”指令 有的分支指令可以直接判断寄存器内容是否为负,或者比较两个寄存器是否相等。 分支的目标地址。 由16位带符号偏移量左移两位后和PC相加的结果来决定 一条浮点条件分支指令:通过测试浮点状态寄存器来决定是否进行分支。 2019/6/3
76
RISC-V ISA UC Berkeley 设计的第5代RISC指令集 设计理念(指导思想):通用的ISA
能适应从最袖珍的嵌入式控制器,到最快的高性能计算机等各种规模的处理器。 能兼容各种流行的软件栈和编程语言。 适应所有实现技术,包括现场可编程门阵列(FPGA)、专用集成电路(ASIC)、全定制芯片,甚至未来的技术。 对所有微体系结构实现方式都有效。例如: 微编码或硬连线控制;顺序或乱序执行流水线;单发射或超标量等等。 支持广泛的定制化,成为定制加速器的基础。随着摩尔定律的消退,加速器的重要性日益提高。 基础的指令集架构是稳定的。不能像以前的专有指令集架构一样被弃用,例如AMD Am29000、Digital Alpha、Digital VAX、Hewlett Packard PA-RISC、Intel i860、Intel i960、Motorola 88000、以及Zilog Z8000。 完全开源 2019/6/3
77
技术目标 将ISA分成基础ISA和可选的扩展部分 方便定制ISA扩展 支持变长指令集扩展 提供对现代标准的有效硬件支持
扩展部分提高计算的性能,并支持多处理机并行 支持32位和64位地址空间 方便定制ISA扩展 包括紧耦合功能单元和松耦合协处理器 支持变长指令集扩展 既为了提高代码密度,也为了扩展可能的自定义ISA扩展的空间 提供对现代标准的有效硬件支持 用户级ISA和特权级ISA是正交的(相互独立,互不依赖) 在保持用户应用程序二进制接口(ABI)兼容性的同时,允许完全虚拟化,并允许在特权ISA中进行实验测试 2019/6/3
78
RISC-V ISA的特点 完全开源: 架构简单 模块化的指令集架构 面向多核并行 有效的指令编码方式
开源采用BSD协议(企业完全自由免费使用,允许企业添加自有指令而不必开放共享以实现差异化发展) 架构简单 没有针对某一种微体系结构实现方式做过度的架构设计 新的指令集,没有向后(backward)兼容的包袱 说明书的页数…..(图1.6) 模块化的指令集架构 RV32I和RV64I是基础的ISA。可扩展增加其他特性的支持 面向教育或科研,易于扩充或剪裁 支持32位和64位地址空间 面向多核并行 有效的指令编码方式 2019/6/3
79
RISC-V子集命名约定 2019/6/3
80
RV32 处理器状态 Program counter (pc) 32x32-bit 整型数寄存器 (x0-x31)
32 个浮点数寄存器(FP) (f0-f31) 每个寄存器可以存放单精度或双精度浮点数 (32-bit or 64-bit IEEE FP) FP 状态寄存器 (fsr), 用于舍入模式和异常状态报告 2019/6/3 CS252 S05
81
RISC-V 指令编码 可支持变长指令(三种长度)
基础指令集 (RV32) 总是固定的32-bit指令(lowest two bits = 112) 所有的条件转移和无条件转移的转移地址16-bit对齐 2019/6/3 CS252 S05
82
RISC-V 指令格式 7-bit opcode field (but low 2 bits =112) Destination Reg.
Reg. Source 2 Additional opcode bits/immediate Reg. Source 1 2019/6/3 CS252 S05
83
RV32I 带有指令布局,操作码,格式类型和名称的操作码映射
2019/6/3
84
RV32I 带有指令布局,操作码,格式类型和名称的操作码映射
2019/6/3
85
03/13-review ISA的功能设计:任务为确定硬件支持哪些操作。方法是统计的方法。存在CISC和RISC两种类型 控制转移类指令
CISC(Complex Instruction Set Computer) 目标:强化指令功能,减少指令的指令条数,以提高系统性能 基本方法:面向目标程序的优化,面向高级语言和编译器的优化 RISC(Reduced Instruction Set Computer) 目标:通过简化指令系统,用最高效的方法实现最常用的指令 主要手段:充分发挥流水线的效率,降低(优化)CPI 控制转移类指令 指令编码(指令格式) MIPS ISA RISC-V ISA 2019/6/3
86
Recap:为什么学习微程序控制 如何用一个简单处理器实现复杂的ISA CISC机器怎么发展起来的
CISC指令集仍然广泛使用 (x86, IBM360, PowerPC) 帮助我们理解技术驱动从CISC->RISC 2019/6/3 CS252 S05
87
RISC-V 指令执行阶段 Instruction Fetch Instruction Decode Register Fetch
ALU Operations Optional Memory Operations Optional Register Writeback Calculate Next Instruction Address 2019/6/3
88
控制部分与数据通路 处理器设计可以分为datapath和Control设计两部分 早期的计算机设计者的最大挑战是控制逻辑的正确性
Maurice Wilkes 提出了微程序设计的概念来设计处理器的控制逻辑(EDSAC-II, 1958) 当时的技术水平 Logic: Vacuum Tubes Main Memory: Magnetic cores Read-Only Memory: Diode matrix, punched metal cards, … Cost: Logic > RAM > ROM Speed: ROM > RAM Condition? Control Main Memory Address Data Control Lines Datapath PC Inst. Reg. Registers ALU Instruction Busy? The central processing unit in a computer system is composed of a data path and a control unit. The data path includes registers, function units such as shifters and ALUs (arithmetic and logic units), internal processor busses and paths, and interface units for main memory and I/O busses. The control unit governs the series of steps taken by the data path during the execution of a user-visible instruction, or macroinstruction (e.g., load, add, store). Each action of the datapath is called a register transfer and involves the transfer of information within the data path, possibly including the transformation of data, address, or instruction bits by the function units. A register transfer is accomplished by gating out (sending) register contents onto internal processor busses, selecting the operation of ALUs, shifters, etc., through which that information might pass, and gating in (receiving) new values for one or more registers. Register-enabling signals, which control the sending or receiving of data at the registers, and operation-selection signals, which control the actions of the functional units, are called control signals. These signals are supplied by the control unit. The collections of logic gates in the datapath that respond to enabling signals and allow the sending or receiving of data at the registers are called the called control points. Each step in the execution of a macroinstruction thus consists of one or more register transfers, and a complete macroinstruction is executed by generating an appropriately timed sequence of groups of control signals. Individual datapath actions or sets of related actions are often called microoperations. 2019/6/3
89
微程序控制RISC-V的单总线数据通路 Condition? Main Memory PC Registers ALU rd rs1 rs2
Register RAM Address In Data Out Instruction Reg. Mem. Address B A Immediate ImmEn RegEn ALUEn MemEn ALUOp MemW ImmSel RegW BLd InstLd MALd ALd RegSel Busy? Opcode 微指令的寄存器传输级表示: MA:=PC means RegSel=PC; RegW=0; RegEn=1; MALd=1 B:=Reg[rs2] means RegSel=rs2; RegW=0; RegEn=1; BLd=1 Reg[rd]:=A+B means ALUop=Add; ALUEn=1; RegSel=rd; RegW=1 2019/6/3
90
(holds user program written in macroinstructions, e.g., x86, RISC-V)
微程序控制 CPU Datapath Main Memory (holds user program written in macroinstructions, e.g., x86, RISC-V) Address Data Decoder µPC Microcode ROM (holds fixed µcode instructions) Next State Control Lines Opcode Condition Busy? 2019/6/3
91
Microcode示意 (1) Instruction Fetch: MA,A:=PC PC:=A+4 wait for memory IR:=Mem dispatch on opcode ALU: A:=Reg[rs1] B:=Reg[rs2] Reg[rd]:=ALUOp(A,B) goto instruction fetch ALUI: A:=Reg[rs1] B:=ImmI //Sign-extend 12b immediate 2019/6/3
92
Microcode 示意 (2) LW: A:=Reg[rs1] B:=ImmI //Sign-extend 12b immediate MA:=A+B wait for memory Reg[rd]:=Mem goto instruction fetch JAL: Reg[rd]:=A // Store return address A:=A-4 // Recover original PC B:=ImmJ // Jump-style immediate PC:=A+B Branch: A:=Reg[rs1] B:=Reg[rs2] if (!ALUOp(A,B)) goto instruction fetch //Not taken A:=PC //Microcode fall through if branch taken A:=A-4 B:=ImmB// Branch-style immediate 2019/6/3
93
采用 ROM 实现微程序控制 How many address bits? How many data bits?
µPC ROM Address Data Opcode Cond? Busy? Next µPC Control Signals How many address bits? |µaddress| = |µPC|+|opcode| How many data bits? |data| = |µPC|+|control signals| = |µPC| + 18 Total ROM size = 2|µaddress|x|data| 2019/6/3
94
ROM 中的内容 Address | Data µPC Opcode Cond? Busy? | Control Lines Next µPC fetch0 X X X | MA,A:=PC fetch1 fetch1 X X 1 | fetch1 fetch1 X X 0 | IR:=Mem fetch2 fetch2 ALU X X | PC:=A+4 ALU0 fetch2 ALUI X X | PC:=A+4 ALUI0 fetch2 LW X X | PC:=A+4 LW0 …. ALU0 X X X | A:=Reg[rs1] ALU1 ALU1 X X X | B:=Reg[rs2] ALU2 ALU2 X X X | Reg[rd]:=ALUOp(A,B) fetch0 2019/6/3
95
单总线数据通路结构的微程序控制存储器大小
取指阶段有3个公操作 RISC-V指令分为12 组 完成一条指令需要5条微指令(包括dispatch) 共计 3+12*5 = 63条微指令,因此 µPC需要6位 指令操作码(Opcode)5 位, 每条微指令~18个控制信号 微控制器的大小 = 2(6+5+2)x(6+18)=213x24 = ~25KiB! 2019/6/3
96
单总线 RISC-V 微程序控制引擎 Opcode fetch0 Decode µPC +1 Cond? µPC Jump Logic
Reducing Control Store Size Opcode fetch0 |µaddress| = |µPC|+|opcode| |data| = |µPC|+|control signals| Decode Total ROM size = 2|µaddress|x|data| µPC +1 Cond? µPC Jump Logic Address ROM Busy? Data µPC jump Control Signals µPC jump = next | spin | fetch | dispatch | ftrue | ffalse 2019/6/3
97
µPC Jump 类型 next :increments µPC spin :waits for memory
fetch :jumps to start of instruction fetch dispatch :jumps to start of decoded opcode group ftrue/ffalse :jumps to fetch if Cond? true/false 2019/6/3
98
微程序控制存储器ROM中的内容 Address | Data µPC | Control Lines Next µPC fetch0 | MA,A:=PC next fetch1 | IR:=Mem spin fetch2 | PC:=A+4 dispatch ALU0 | A:=Reg[rs1] next ALU1 | B:=Reg[rs2] next ALU2 | Reg[rd]:=ALUOp(A,B) fetch Branch0 | A:=Reg[rs1] next Branch1 | B:=Reg[rs2] next Branch2 | A:=PC ffalse Branch3 | A:=A-4 next Branch4 | B:=ImmB next Branch5 | PC:=A+B fetch 2019/6/3
99
Memory-memory add: M[rd] = M[rs1] + M[rs2]
示例:实现一条复杂指令 Memory-memory add: M[rd] = M[rs1] + M[rs2] Address | Data µPC | Control Lines Next µPC MMA0 | MA:=Reg[rs1] next MMA1 | A:=Mem spin MMA2 | MA:=Reg[rs2] next MMA3 | B:=Mem spin MMA4 | MA:=Reg[rd] next MMA5 | Mem:=ALUOp(A,B) spin MMA6 | fetch 复杂指令的实现通常不需要修改数据通路,仅仅需要编写相应的微程序(可能会占用更多的控存) 采用硬布线控制器而不修改数据通路来实现这些指令是非常困难的 2019/6/3
100
Single-Bus Datapath for Microcoded RISC-V
Condition? Main Memory PC Registers ALU 32 (PC) rd rs1 rs2 Register RAM Address In Data Out Instruction Reg. Mem. Address B A Immediate ImmEn RegEn ALUEn MemEn ALUOp MemW ImmSel RegW BLd InstLd MALd ALd RegSel Busy? Opcode Datapath unchanged for complex instructions! 2019/6/3
101
Horizontal vs Vertical µCode
Bits per µInstruction # µInstructions 水平微编码的水平型微指令 每条微指令有多个微操作并行 每条宏指令(指令)具有较少的微指令 稀疏的(微操作)编码 微指令较宽(含有较多的位数) 垂直微编码的垂直型微指令 典型的是每条微指令代表一个数据通路操作 不同的数据通路分支是独立的微指令 每条宏指令(指令)需要更多的微指令 紧凑的(微指令)编码 微指令较窄(含有较少的位数) Nanocoding 水平型微指令和垂直型微指令的结合 Reduce ROM width (#data bits) 2019/6/3 CS252 S05
102
Nanocoding 利用微代码中重复的控制信号 e.g. ALU0 A Reg[rs1] ... ALUI0 A Reg[rs1]
µcode next-state PC (state) µaddress µcode ROM nanoaddress nanoinstruction ROM data Motorola had 17-bit µcode containing either 10-bit µjump or 9-bit nanoinstruction pointer Nanoinstructions were 68 bits wide, decoded to give 196 control signals 2019/6/3 CS252 S05
103
Microprogramming in IBM 360
Datapath width (bits) 8 16 32 64 µinst width (bits) 50 52 85 87 µcode size (K µinsts) 4 2.75 µstore technology CCROS TCROS BCROS µstore cycle (ns) 750 625 500 200 memory cycle (ns) 1500 2500 2000 Rental fee ($K/month) 7 15 35 CCROS Card-Capacitor Read-Only Store BCROS balanced Capacitor Read-Only Store Only the fastest models (75 and 95) were hardwired 2019/6/3 CS252 S05
104
IBM Card-Capacitor Read-Only Storage
Punched Card with metal film Fixed sensing plates [ IBM Journal, January 1961] 2019/6/3
105
Microcode Emulation 在推出IBM 360系列机之前,IBM最初错误地估计了与早期机器的软件兼容性的重要性
Honeywell为H200系列机器提供翻译软件(“Liberator”),抢走了一些IBM 1401客户 IBM对此进行了反击,为360系列增加了可选的微代码,该微代码可以模拟IBM 1401 ISA,后来又扩展到IBM 7000系列 1401上一个常用的程序是650模拟器,一些客户在1401上模拟运行650的多个程序 (650在1401上模拟,1401在360上模拟) 2019/6/3 CS252 S05
106
60到70年代微程序盛行 除了低档的或者性能最高机器,所有计算机都采用微程序控制 ROM比DRAM要快的多
ROM和RAM速度之间的差异导致了额外的复杂指令 对于复杂的指令集,datapath和controller更便宜、更简单 新的指令(例如 floating point)可以在不修改数据通路的情况下增加 修改控制器的bug更容易 不同型号的机器实现ISA的兼容性更简单、成本更低 除了低档的或者性能最高机器,所有计算机都采用微程序控制 2019/6/3 CS252 S05
107
80年代初的微程序技术 微程序技术的进展孕育了更复杂的微程序控制的机器 随着超大规模集成电路技术的出现,有关ROM和RAM速度的假设变得无效
复杂指令集导致µcode需要子程序和调用堆栈 需要修复控制程序中的bug与µROM 的只读属性冲突 Writable Control Store (WCS) (B1700, QMachine, Intel i432, …) 随着超大规模集成电路技术的出现,有关ROM和RAM速度的假设变得无效 逻辑部件、存储部件(RAM, ROM)均采用MOS晶体管实现 半导体RAM与ROM的存取速度相同 随着编译器技术的进步复杂指令变得不再那么重要 随着微结构技术的进步(pipeling, caches and buffers),使得多周期执行reg-reg指令失去了吸引力 2019/6/3 CS252 S05
108
Writable Control Store (WCS)
使用RAM实现控制存储 MOS SRAM内存几乎和控制存储一样快 过去 磁芯存储器/DRAM 要比控制存储器慢2-10倍 要写出没有bug的微程序是很困难的 使用可修改的RAM存储微程序有利于微程序的维护 一些小型机提供了User-WCS选项。即允许用户修改微指令 User-WCS 失败的原因 几乎没有编程工具支持 很难将应用软件装入很小的WCS中 在用户级别使用微程序控制来模拟原来的ISA,对其他人用处不大 大量的WCS空间用来保存处理器状态导致上下文切换代价昂贵 如果用户改变微代码环境保护很困难 虚拟存储要求微代码具有restartable能力 2019/6/3 CS252 S05
109
VAX Microcode 2019/6/3 CS252 S05
110
80年初:微程序控制机器分析 用高级语言编程成为主流 IBM的John Cocke团队 80年代初,Emer和Clark (DEC)发现
关键问题:编译器会生成什么指令? IBM的John Cocke团队 为小型计算机801(ECL Server)开发了更简单的 ISA 和编译器 移植到IBM370,仅使用IBM 370的简单的寄存器-寄存器及load/store指令 发现:与原IBM 370相比,性能提高3X 80年代初,Emer和Clark (DEC)发现 VAX 11/180 CPI = 10! 虽然声称是1MIPS的机器,实际测试其性能是0.5MIPS VAX ISA 的 20%指令 (占用了60%的微码)仅占用了 0.2%的执行时间 VAX8800 控制存储: 16K*147b RAM, Unified Cache: 64K*8b RAM 微程序控制存储是cache容量的4.5x 2019/6/3
111
From CISC to RISC 使用快速RAM构建用户最近要执行的指令的指令缓存,而不是固定的硬件微程序 芯片集成度的提高带来的机遇
指令缓存中的内容随着程序执行不断更新,提高访存速度 使用简单的ISA,以有效实现硬布线的流水线方式执行 大多数编译器生成的代码只使用了一部分常用的CISC指令 简单的指令格式使得流水线高效实现成为可能 芯片集成度的提高带来的机遇 80年代初,单芯片上已经可以集成32-bit的数据通路加上小的cache 大多数情况下没有芯片间的通信,使得性能更好 2019/6/3 CS252 S05
112
Berkeley RISC Chips Stanford built some too…
RISC-I (1982) Contains 44,420 transistors, fabbed in 5 µm NMOS, with a die area of 77 mm2, ran at 1 MHz. This chip is probably the first VLSI RISC. RISC-II (1983) contains 40,760 transistors, was fabbed in 3 µm NMOS, ran at 3 MHz, and the size is 60 mm2. Stanford built some too… 2019/6/3
113
Microprogramming is far from extinct
80年代微程序控制起到了关键作用 DEC uVAX, Motorola 68K series, Intel 286/386 现代微处理器中微程序控制扮演辅助的角色 e.g., AMD Bulldozer, Intel Ivy Bridge, Intel Atom, IBM PowerPC, … 大多数指令采用硬布线逻辑控制 不常用的指令或者复杂的指令采用微程序控制 芯片bug的修复(打补丁) 例如Intel处理器在bootup阶段可装载微代码方式的patches 英特尔不得不重新启用微代码工具,并寻找原来的微代码工程师来修补熔毁/幽灵安全漏洞 2019/6/3 CS252 S05
114
Acknowledgements These slides contain material developed and copyright by: Arvind (MIT) Krste Asanovic (MIT/UCB) Joel Emer (Intel/MIT) James Hoe (CMU) John Kubiatowicz (UCB) David Patterson (UCB) MIT material derived from course 6.823 UCB material derived from course CS252 KFUPM material derived from course COE501、COE502 2019/6/3 CS252 S05
Similar presentations