Design of the RISC-V Instruction Set Architecture笔记(chapter1-2)
本帖最后由 皋陶 于 2020-8-27 15:41 编辑Design of the RISC-V Instruction Set Architecture笔记(chapter1-2)
Design of the RISC-V Instruction Set Architecture笔记(chapter3)
Design of the RISC-V Instruction Set Architecture笔记(chapter4)
Design of the RISC-V Instruction Set Architecture笔记(chapter5)
Design of the RISC-V Instruction Set Architecture笔记(chapter1-2)
[*]A free and open ISA standard has the potential to increase innovation in microprocessor design, reduce computer system cost, and, as Moore’s law wanes, ease the transition to more specialized computational devices
[*]The optional extensions form a more powerful ISA for general purpose and high-performance computing.
[*]直到IBM360才引入了软硬件接口的概念,介绍了ISA的概念
[*]作者认为:保持标准封闭阻碍了创新并人为地抬高了微处理器的成本
[*]Why develop a new instruction set?
[*]all of the popular commercial ISAs are proprietary
[*]the massive complexity of the popular commercial instruction sets
[*]MIPS:80年代斯坦福提出,受到了IBM 801的深刻影响。使用通用寄存器的load-store体系结构,算术运算也只发生在寄存器之间。MIPS的设计减少了指令集和硬件的复杂程度,促进了低价流水线的实现。在1986年,MIPS第一次在商业上被实现,R2000。在最初的版本中,MIPS用户级定点指令集合只有58条指令,实现采用单发射,按序流水线。三十年依赖,ISA变得更加庞大,目前差不多400条指令。实现MIPS-I的简单微体系结构非常适合学术研究,但是却有一些问题限制了其高性能的实现:
[*]ISA对单发射,按序五级流水线的微体系结构进行了过度的优化。分支延迟槽的问题。分支和跳转被一条指令延迟,使超标量和超流水线实现变得复杂。 当延迟时隙不能被适当填充时,延迟的分支增加了代码大小并浪费指令发射带宽。
[*]ISA提供对位置无关代码(PIC)没有很好的支持,因此只能动态链接。直接跳转指令是伪绝对的,而不是相对于程序计数器,从而使它们在PIC中无用; 相反,MIPS使用间接跳转,代码量和性能成本都很高
[*]16位的立即数位宽使得可编码空间变少,不利于指令扩展
[*]乘除使用了特殊的体系结构寄存器,增加了上下文的大小,指令数量和代码大小,微体系结构的复杂性
[*]ISA预先假定浮点单元是一个单独的协处理器,对于单芯片实现来说并不是最理想的。额外的转换开销
[*]标准的ABI中,两个定点寄存器保留为内核程序专用,因此减少了用户可用的寄存器数量
[*]使用特殊指令处理未对齐的加载和存储会占用大量的操作码空间,并使除最简单的实现之外的所有操作都复杂化
[*]删除了整数大小的比较分支(compare-and-branch)指令
[*]MIPS是私有的指令系统
[*]SPARC:Oracle的体系结构,最初发展于Sun Microsystem,可以追溯到伯克利的RISC-I和RISC-II。最新的32位版本的ISA SPARC V8并不过分复杂:用户级的定点ISA是一个简单的,编码规整的,包含90条指令的系统。硬件支持IEEE 754-1985的浮点标准,增加了50条浮点指令,和20条特权模式下的指令。但是没有MIPS-I有吸引力:
[*]为了加速函数调用,减少保存寄存器和恢复的开销,SPRAC使用了一个更大的窗口寄存器文件。如果寄存器窗口的数量不够,则性能会受损。因此需要OS定期处理窗口的溢出和下溢问题,这就会增加上下文切换的开销。同时寄存器窗口会占有很大的面积,带来很大的功耗开销。但是为了减轻其成本的技术会使得超标量实现更加复杂。
[*]使用条件码实现分支指令,从而增加了体系结构状态,造成了额外的指令相关,使得实现更加复杂。同时还缺少compare-and-branch指令也会增加静态和动态指令数
[*]加载和存储相邻寄存器对(同时处理相邻寄存器的内容)的指令对于简单的微体系结构是有吸引力的,因为它们增加了吞吐量而几乎没有额外的硬件复杂性。 但是这种方式会使得寄存器重命名的实现更加复杂,因为数据值在寄存器文件中不再是物理上相邻的。
[*]浮点和定点寄存器之间的移动,必须使用存储系统作为中介,限制了混合格式代码的性能
[*]使用显式的deferred-trap queue支持非精确的浮点异常
[*]原子存储操作太少,只有fetch-and-store
[*]SPARC有延迟槽,同时有很多的控制和数据相关,不利于激进的实现技术。同时SPARC不支持位置无关的数据索引。除此之外,SPARC不能够快速的增加压缩指令集,(没有足够的编码空间,尽管相对于MIPS,SPARC仅有13位立即数,但是CALL指令浪费了很多空间,尽管并不常用)。
[*]SPARC V8是开放的标准。
[*]ALPHA:DEC公司定义的RISC ISA在90年代。Alpha省略了第一个商业RISC ISA的许多最不吸引人的功能,包括分支延迟槽,条件码,寄存器窗口。同时创建了一个64位地址空间ISA,设计简洁,易于实现,并且具有高性能。提供了PALcode,隔离了很多特权结构和硬件平台的大部分细节。但是DEC为了一个按序的微体系结构过度优化了Alpha,增加了一些现代实现中不需要的功能:
[*]ISA的原始版本为了追求高频率,避开了8位和16位的load/store,有效的创建了一个按字索引的存储系统。同时为了在广泛使用这些操作的应用程序上恢复性能,添加了特殊的未对齐load/store指令和几个整数指令。但是这是个错误,尽管之后增加了 sub-word load/store,但是之前的对齐指令已经没有用处
[*]为了便于无序完成长延迟浮点指令,Alpha具有不精确的浮点陷阱模型。同时ISA也定义了异常标志和默认值(如果需要)必须由软件例程提供。 这种组合对于IEEE-754兼容程序是灾难性的:必须在大多数浮点算术指令之后插入陷阱屏障指令
[*]Alpha没有提供定点的除法指令,而是使用牛顿迭代法。这种方法大大的增加了指令数量,同时仅仅减少了很少的硬件。
[*]没有足够的编码空间用于扩展压缩指令
[*]包含条件move指令,因此会使得寄存器重命名更加的复杂。如果不满足移动条件,指令仍必须将旧值移动到新的寄存器中。Alpha 21264将这种指令分为两个微操作来执行条件移动指令,但是要求物理寄存器加宽一位,以保存中间结果。(MIPS实现条件move指令,增加了一位宽的寄存器文件,这种方法相对于21264更加简单,但是要求三个wakeup端口在issue window中,因此也会增加功耗和面积,甚至周期)
[*]ARMv7:流行的32位受RISC影响的ISA,目前是世界上最广泛的体系结构。ARMv7使用非常广泛,同时软件生态也很好,但是这是一个封闭的标准,明确禁止对ISA进行子集或者使用新指令进行扩展,同时进行微体系结构创新也需要付费。同时它也有一些技术缺陷:
[*]没有支持64位寻址,同时硬件没有支持IEEE 754-2008
[*]特权体系结构的细节渗透到用户级体系结构的定义中。ARMv7不是经典的虚拟化,因为return-from-exception指令,RFE在用户模式执行时,没有定义为陷阱。
[*]ARMv7有一个压缩ISA,固定为16位宽度的指令,称为Thumb。它能够提供更小的code size,但是性能不高,尤其在float-point-intensive的代码中。之后Thumb-2,一中可变长度的指令集被定义,提供了更高的性能,但是Thumb-2中的32位指令和基本32位指令的编码方式不同,这就意味着译码器必须能够翻译三种ISA,这将增加能耗,延迟和设计花费
[*]ARMv7有很多特点使得实现非常复杂。ARMv7并不算是一个真正的通用寄存器结构,PC成为一个可寻址的寄存器,意味着几乎所有指令都可以改变控制流。同时PC中的控制当前运行的ISA种类的一位也可以被指令更改。分支和预测的条件代码的使用进一步使高性能实现复杂化
[*]ARMv7非常庞大而复杂。ARM和Thumb之间,有超过600条定点指令,SIMD指令和浮点指令又增加了100多条指令
[*]ARMv8:2011年提出的一种重新设计的ISA,支持64位寻址,带有扩展的定点寄存器集合。v8删除了一些v7中使得设计复杂化的特征,例如PC不再是定点寄存器的一部分;指令不再被预测;load/store-multiple被移除;指令编码被规整。也有一些缺点被遗留下来:使用条件码和不非常通用的寄存器(某些寄存器具有特殊用处)。同时也增加了一些新的问题:包括一个庞大的子字SIMD架构。总体上,v8非常复杂,笨重,1070条指令,53种格式,8种数据寻址模式。但是仍旧没有compare-and-branch指令。随着v8的出现,ARM放弃了对压缩指令编码的支持。v8无法子集化,必须完整实现,因此对于嵌入式处理器或者加速器的控制单元而言过于笨重
[*]OpenRISC:一个开源处理器设计,源自于DLX架构。OpenRISC有一些问题限制了它的可用性:
[*]OpenRISC项目主要是开放式处理器设计,而不是开放的ISA规范。 ISA和实现紧密耦合
[*]32位固定的编码格式,16位立即数限制了压缩指令的扩展
[*]硬件不支持2008年修订的IEEE 754标准
[*]分支指令和条件move,使用了条件码,使得高性能的实现更加复杂
[*]OpenRISC不是经典虚拟化的,因为异常返回指令L.RFE被定义为在用户模式下正常运行,而不是陷阱
[*]2010年时,OpenRISC强制使用分支延迟槽,不支持64位索引。之后得到了改进,延迟槽变为可选,增加了64位指令,但是没有实现
[*]80x86:2015,x86包含了1300条指令,非常多的访存模式,几十种特殊用处的寄存器和多种地址转换机制。
[*]ISA不是经典的可虚拟化,因为某些特权指令在用户模式下静默失败而不是进入陷阱
[*]ISA具有任意整数个字节的指令长度,最多15个,但是少数多个短操作码被反复使用。
[*]ISA只有很少的寄存器。IA-32只有8个定点寄存器,行x86-64定点寄存器达到16个
[*]大多数整数寄存器在ISA中执行特殊功能,加剧了体系结构寄存器的缺乏
[*]大多数x86指令只有一个破坏性的形式,用结果覆盖其中一个源操作数。这意味着指令执行过程中,需要一直保存源操作数
[*]一些ISA特性,包括隐式条件代码和预测的移动,在激进的微体系结构中实现是繁重的。 然而,它们的复杂性通常不会导致更高的性能,因为它们的语义是错误的。
[*]IA-32 is only marginally denser than the fixed-width 32-bit ARMv7 encoding, and x86-64 is quite a bit less dense than ARMv8
[*]作者提出的现代通用ISA的必要特征
页:
[1]