【从零开始学习计算机科学】计算机体系结构(一)计算机体系结构、指令、指令集(ISA)与量化评估
【从零开始学习计算机科学】计算机体系结构(一)计算机体系结构、指令、指令集(ISA)与量化评估
-
- 概论
- 计算机体系结构简介
- 计算机的分类
- 并行体系结构
- 指令集体系结构(ISA)
-
- 分类
- 存储器寻址
-
- 寻址模式
- 操作数大小
- 指令
- ISA的编码
- 程序的优化
- 计算机体系结构
- 量化评估
- 存储器体系结构
概论
计算机体系结构与计算机组成原理之间的联系非常紧密,其研究范畴基本一致,计算机体系结构与计算机组成原理两者是相辅相成的。但是,计算机体系结构更加注重从理论和整体上把握计算机设计的思想,即如何设计一种计算机,而计算机组成原理更加注重如何具体实现一台计算机,其更加偏向于实践层面。
计算机体系结构简介
自第一代通用计算机出现至今,计算机的计算能力已得到大大的提升。在1978到1986年之间,计算机的性能每年平均增长25%,在1986年到2003年,计算机的性能平均增长52%,在2003年至2010年,性能平均增长22%。
计算机性能的提升,受到多方面的影响。但是,其本质上的提升在于其物理设备的制造技术的进步以及体系结构的发展。对于第一代到第四代计算机的划分,就是从其物理基础上划分的,即电子管,晶体管,集成电路。基本上,整个计算机体系中的飞跃式的进步,绝大多数都是由计算机的物理基础和体系结构的发展所造成的。比如,基于硅的集成电路的发展,使得计算机体积越来越小,单位面积的逻辑门电路越来越大。
我们知道,一个计算机程序,可以看作是一组计算机指令组成的集合,程序的执行过程,可以看作是一条条的计算机指令的执行。对于一条指令,其本质上只是一种特殊的二进制串,这种二进制串可以控制物理机器去进行一系列特定的操作。因此,对于计算机体系结构在整个计算机体系中的地位和功能,可以看作是向上提供一组指令集,人们可方便的应用指令集去控制底层物理设备实现相应的功能。计算机体系结构也是处于发展之中的。
旧有的计算机体系结构主要关注于指令集体系结构(ISA)设计,即关于寄存器、内存寻址、寻址模式、指令操作数、可用操作、控制流指令、指令编码。而如今的计算机体系结构更多关注于目标机器的具体要求,设计可在约束因素下实现性能最大化:成本、功耗和可用性。不仅包括ISA,更包含微体系结构、硬件等等与计算机性能存在联系的多个方面。
计算机体系结构的发展,并不仅仅是由自身产生的,其也受到上层应用以及下层物理设备的影响,也就是说,计算机体系结构的发展是受到与计算机存在联系的方方面面所影响的,我们不能只看体系结构的发展,而忽略体系结构为什么这样发展。尽管技术是不断进步的,但是只有当技术发展到一定程定的时候才能引起质变,导致新的体系结构出现,而一个体系结构也要有其技术支持,在技术发展到一定程度之前,这种体系结构是无法实现的。
在计算机的发展历程中,存在着两个重大的变化,第一,高级编程语言的开发,人们越来越少的去直接使用汇编语言去编写计算机程序,人们使用高级编译语言,可以更高效的开发复杂的计算机程序,可以实现更加复杂的算法,比如动态规划,插值法,以及各种AI算法。对于由高级语言编写的程序,一般是由编译器将其编译成汇编语言组成的汇编程序,然后通过汇编器将汇编语言转变为0和1组成的二进制机器指令流。第二,是独立的操作系统的应用。对于操作系统,其可以屏蔽具体的体系结构细节,仅仅向上提供用户友好的接口,方便各种人群快捷,便利的使用计算机。操作系统的应用降低的体积结构商业化应用的风险。
并且,受到计算机物理设备(比如晶体管)的制约,我们现今可以从物理设备得到的性能提升已到达一个瓶颈,因此,由于上层软件和下层硬件的多重影响,人们在20世纪80年代开发出了一种新式的体系结构——精简指令集计算机(RISC)体系结构。对于RISC体系结构,其主要关注于指令级并行(ILP)去实现性能的提升(主要是流水线(pipeline),多发射和缓存的使用)。对于RISC体系结构,可以实现更大的指令级的性能提升。并且,由于微处理器和具体物理设备的发展,越来越多的使用复杂指令集的计算机体系结构逐渐向RISC体系结构发展,比如intel的x86体系结构,其内部的80x86指令可以以很低的消耗转换成RISC指令。在当下,应用广泛的一种RISC体系结构便是ARM。
半导体技术的改进(集成电路逻辑、DRAM、闪存、磁盘),晶体管的缩放(特征尺寸、时钟速度),计算机体系结构的改进,HLL编译器启用,UNIX, RISC 架构共同促进了轻量级计算机的发展和用户友好的编译/解释编程语言的使用。
然而,由于受到最大功耗的限制(散热技术)和指令级并行技术的开发瓶颈的制约,使得ILP的发展缓慢。如今,人们更多的将关注重点转变为数据级并行(DLP)和线程级并行(TLP),以及对于一些应用场景下的请求级并行(RLP)。
对于ILP,其对开发人员是屏蔽的,是隐式实现的,而对于DLP,ILP以及RLP,是显式实现的,需要开发人员的关注。
计算机的分类
由于计算机的应用场景不同,我们可以将计算机分为以下几类,个人移动设备(PMD),桌面计算,服务器,集群仓库级计算机,嵌入式计算机。
对于不同类型的计算机,其关注的主要性能是存在差异的。对于PMD,其主要关注于响应速度和实时性能,即应用程序的一个程序段必须有一个确定的最大执行时间。对于桌面计算,主要关注于性价比,即性能和成本的比例。对于服务器,主要关注于可用性,吞吐量和可扩展性。对于集群仓库级计算机(WSC(仓库级计算机)和超级计算机),主要关注于性价比和功耗,对于超级计算机,还关注于浮点计算能力。对于嵌入式计算机(我们可以按照能否运行第三方软件划分嵌入式和非嵌入式计算机),其主要关注于价格。
不同的应用场景对于计算机的要求也是不同的,因此,要结合具体的应用场景选择最合适的计算机。
并行体系结构
并行是对于提高计算能力的一种有力的手段。并行主要有ILP,DLP,TLP,RLP。以下几章将详细介绍。
对于一个计算机,我们可以按照并行关系将其划分为以下四类,单指令流、单数据流(SISD),此类计算机包含使用ILP的单处理器顺序计算机;单指令流、多数据流(SIMD),此类计算机包含应用DLP技术(向量体系结构,多媒体扩展,GPU等等)的多数据流计算机,;多指令流、单数据流(MISD);多指令流、多数据流(MIMD),此类计算机主要包含使用任务级并行的计算机。这种划分标准仅仅是按照并行关系,因此是一种粗粒度的划分。
指令集体系结构(ISA)
ISA通常包含以下几个部分:寄存器,操作访问,操作数的类型和大小,指令集,寻址模式,指令编码。一个ISA应该设计为与微处理器的硬件实现分离,与具体的应用程序分离。计算机体系结构的重大进步通常与地标性指令集设计相关。
分类
ISA可以看作是软件和硬件的界限,其将编程语言抽象于机器,是高级语言最终通过编译器/解释器的最终可执行的目标。对于计算机体系结构,ISA其重要的一部分。目前,常用的ISA主要有两大类,一是通用寄存器体系结构,其指令存在两个显式操作数,通用寄存器体系结构主要有两种,一种是寄存器-储存器ISA,比如80x86,其指令可以直接访问存储器;另一种是载入-存储ISA,比如MIPS和ARM,其只能通过载入和存储指令访问存储器。二是堆栈体系结构,比如JVM(java虚拟机),堆栈结构采用两个隐藏操作数。三是AC(累加器)架构,比如EDSAC,IAS。AC架构的指令采用1个显示操作数,1个隐藏操作数。
存储器寻址
寻址的过程是通过地址从存储器中获取操作数(数据)的过程。大多数的体系结构的存储器寻址采用字节寻址,但是有些体系结构采用的是对齐的方式,比如ARM和MIPS,而有些则不要求强制对齐。对于一个大小为s的对象,其字节地址为A,若A mod s