小结:指令集架构 ISA需考虑的问题 Class of isa Memory addressing Types and sizes of operands Operations Control flow instructions Encoding an isa ·ISA的类型 通用寄存器型占主导地位 寻址方式 重要的寻址方式:偏移寻址方式,立即数寻址方式寄存器间址方式 SPEC测试表明,使用频度达到75%-99% 偏移字段的大小应该在12-16bits,可满足75%99%的需求 立即数字段的大小应该在8-16bits,可满足50%-80%的需求 操作数的类型和大小 对单字、双字的数据访问具有较高的频率 支持64位双字操作,更具有一般性 202125
小结:指令集架构 • ISA需考虑的问题 – Class of ISA – Memory addressing – Types and sizes of operands – Operations – Control flow instructions – Encoding an ISA – …… • ISA的类型 – 通用寄存器型占主导地位 • 寻址方式 – 重要的寻址方式: 偏移寻址方式, 立即数寻址方式, 寄存器间址方式 • SPEC测试表明,使用频度达到 75%--99% – 偏移字段的大小应该在 12 - 16 bits, 可满足75%-99%的需求 – 立即数字段的大小应该在 8 -16 bits, 可满足50%-80%的需求 • 操作数的类型和大小 – 对单字、双字的数据访问具有较高的频率 – 支持64位双字操作,更具有一般性 2021/2/5 22
MIPS MIPS是最典型的RSC指令集架构 Stanford,1980年提出,主要受到IBM801小型机的影响 第一个商业实现是R2000(1986) 最初的设计中,其整数指令集仅有58条指令,直接实现单发射、 顺序流水线 30年来,逐步增加到约400条指令 ·主要特征 Load/ Store型结构,专门的指令完成存储器与寄存器之间的传送 ALU类指令的操作数来源于寄存器或立即数(指令中的特定区域) 降低了指令集和硬件的复杂性,依赖于优化编译技术,方便了简 单流水线的实现 2021/2/5 2
MIPS • MIPS是最典型的RISC 指令集架构 – Stanford, 1980年提出,主要受到IBM801 小型机的影响 – 第一个商业实现是R2000(1986) – 最初的设计中,其整数指令集仅有58条指令,直接实现单发射、 顺序流水线 – 30年来,逐步增加到约400条指令。 • 主要特征: – Load/Store型结构,专门的指令完成存储器与寄存器之间的传送 – ALU类指令的操作数来源于寄存器或立即数(指令中的特定区域) – 降低了指令集和硬件的复杂性,依赖于优化编译技术,方便了简 单流水线的实现 2021/2/5 23
主要缺陷 针对特定的微体系架构的实现方式(5级流水、单发射、顺序流水线)进 行过度的优化设计 延迟转移问题导致超标量等复杂流水线的实现难度,当无法有效填充延迟槽时会导 致代码尺寸变大 ·MIPS-I中暴露出其他流水线冲突(load、乘除引起的冲突)采用简单的 Interlocking简单又高效,但为了保持兼容性,仍然保留了延迟转移 ISA对位置无关的代码( position-independent code,PC)支持不足。 直接跳转没有提供P相对寻址,需要通过间接跳转方式实现PC,增加了代码尺寸, 降低了性能 2014年MIPS的修订,改进了PC-相对寻址针对数据),但仍然要多条指令才能完成 16位位宽立即数消耗了大量编码空间,只有少量的编码空间可供扩展指令 ·2014修订版,保存有1/64的编码空间供扩展 架构师如果想采用压缩指令编码来降低代码空间,就不得不采用新的指令编码 乘除指令使用了特殊的寄存器(HILO),导致上下文切换内容、指令条数 代码尺寸增加,微架构实现复杂 2021/2/5
• 主要缺陷: – 针对特定的微体系架构的实现方式(5级流水、单发射、顺序流水线)进 行过度的优化设计 • 延迟转移问题导致超标量等复杂流水线的实现难度,当无法有效填充延迟槽时会导 致代码尺寸变大 • MIPS-I中暴露出其他流水线冲突(load、乘除引起的冲突)采用简单的 Interlocking 简单又高效,但为了保持兼容性,仍然保留了延迟转移 – ISA对位置无关的代码(position-independent code, PIC)支持不足。 • 直接跳转没有提供PC相对寻址,需要通过间接跳转方式实现PIC,增加了代码尺寸, 降低了性能 • 2014年MIPS的修订,改进了PC-相对寻址(针对数据),但仍然要多条指令才能完成 – 16位位宽立即数消耗了大量编码空间,只有少量的编码空间可供扩展指令 • 2014修订版,保存有1/64的编码空间供扩展 • 架构师如果想采用压缩指令编码来降低代码空间,就不得不采用新的指令编码 – 乘除指令使用了特殊的寄存器(HI,LO),导致上下文切换内容、指令条数、 代码尺寸增加,微架构实现复杂 2021/2/5 24
ISA假设浮点操作部件是一个独立的协处理器,使得单芯片实现无 法最优 例如,整型数与浮点数的转换结果写到浮点数寄存器,使用结果时,需 要额外的mo指令,更糟糕的是浮点数寄存器文件与整型数寄存器文件 之间的传输,需要有显式的延迟槽 在标准的AB中,保留两个整型寄存器用于内核程序,减少了用户 程序可用的寄存器数 使用特殊指令处理未对齐的load和 Istore会消耗大量的操作码空间, 并使除了最简单的实现之外的其他实现复杂化 时钟速率CPI的权衡使得架构师省略了整数大小比较和分支指令。 随着分支预测和静态CMOS逻辑的出现,这种权衡在今天已经不 太合适了。 除了技术方面,MIPS是非开放的专属指令集,不能自由使用 2021/2/5
– ISA假设浮点操作部件是一个独立的协处理器,使得单芯片实现无 法最优 • 例如,整型数与浮点数的转换结果写到浮点数寄存器,使用结果时,需 要额外的mov指令,更糟糕的是浮点数寄存器文件与整型数寄存器文件 之间的传输,需要有显式的延迟槽 – 在标准的ABI中,保留两个整型寄存器用于内核程序,减少了用户 程序可用的寄存器数 – 使用特殊指令处理未对齐的load和store会消耗大量的操作码空间, 并使除了最简单的实现之外的其他实现复杂化。 – 时钟速率/CPI 的权衡使得架构师省略了整数大小比较和分支指令。 随着分支预测和静态CMOS逻辑的出现,这种权衡在今天已经不 太合适了。 – 除了技术方面,MIPS是非开放的专属指令集,不能自由使用 2021/2/5 25
SPARO Sun Microsystems的专属指令集 可迫溯到 Berkeley risC-和RSC亚项目;最近的32位版本的 ISA SPARC8 SPARC VE8主要特征 用户级整型SA90条指令;硬件支持IEE754-1985标准的浮点数(50条);特 权级指令20条 主要问题 SPARC使用了寄存器窗口来加速函数调用 当函数调用所需的栈空间超过了窗口的寄存器数,性能会急剧下降。对于所有的实现来 说,寄存器窗口都消耗很大的面枳和功耗 分支使用条件码 这些条件码由于在一些指令之间创建了额外的依赖关系,增加了体系结构状态并使实现 复杂化 load和 store相邻寄存器对的指令 对于简单的微体系结构很有吸引力,可以在很少增加硬件复杂性的情况下提高吞吐量. 遗憾的是当使用寄存器重命名使实现复杂化,因为在寄存器文件中数据在物理上可能不 再相邻 浮点寄存器文件和整数寄存器文件之间的移动必须使用内存系统作为中介,限制了 系统性能 2021/2/5
SPARC • Sun Microsystems的专属指令集 – 可追溯到Berkeley RISC-I和RISC-II项目 ; 最近的32位版本的ISA SPARC V8 • SPARC V8 主要特征 – 用户级 整型ISA 90条指令; 硬件支持IEEE 754-1985标准的浮点数(50条) ;特 权级指令 20条 • 主要问题 – SPARC使用了寄存器窗口来加速函数调用 • 当函数调用所需的栈空间超过了窗口的寄存器数,性能会急剧下降。对于所有的实现来 说,寄存器窗口都消耗很大的面积和功耗 – 分支使用条件码 • 这些条件码由于在一些指令之间创建了额外的依赖关系,增加了体系结构状态并使实现 复杂化 – load和store相邻寄存器对的指令 • 对于简单的微体系结构很有吸引力,可以在很少增加硬件复杂性的情况下提高吞吐量。 • 遗憾的是当使用寄存器重命名使实现复杂化,因为在寄存器文件中数据在物理上可能不 再相邻 – 浮点寄存器文件和整数寄存器文件之间的移动必须使用内存系统作为中介,限制了 系统性能 2021/2/5 26