研究内容
软硬之间游走,从晶体管到数电再到CPU微架构,再到指令集ISA,再到软件层的ABI和API。计算机体系结构追求从整体的角度来设计计算机,使计算机更好。
简而言之,计算机体系结构就是:在给定的制造工艺上,设计计算机的整体架构,以满足应用的需要。
评估标准
评估计算机好坏有几个指标:性能,成本,功耗,
完成一个任务所需要的时间可以由完成该任务需要的指令数、完成每条指令需要的拍数以及每拍需要的时间三个量相乘得到。完成任务需要的指令数与算法、编译器和指令的功能有关;
每条指令需要的拍数与编译器、指令功能、微结构设计相关;
每拍需要的时间,也就是时钟周期,与结构、电路设计、工艺等因素有关。
在指令系统确定后,结构设计需要重点考虑如何降低每条指令的平均执行周期(Cycles Per Instruction,简称CPI),或提高每个时钟周期平均执行的指令数(Instructions Per Cycle,简称IPC),这是处理器微结构研究的主要内容。
基本原则
计算机体系结构发展很快,但在发展过程中遵循一些基本原则,这些原则包括平衡性、局部性、并行性和虚拟化。
- 平衡性:要均衡各个部件的性能,电脑性能取决于最弱的那一个环节
- 局部性:充分利用局部性原理
- 并行性,
- 指令并行:流水线并行,超标量并行,10年以后指令级并行基本已经到极限了
- 数据并行:向量运算,
- 任务并行:多线程,多进程
- 虚拟化:虚拟内存(内存虚拟),多线程(CPU虚拟),同时多线程(更进一步的CPU虚拟)
指令集
计算机体系结构中非常重要的一部分就使指令集,指令集是计算机软硬件之间的桥梁,指令集以下硬件负责,指令集以上,软件负责,目前常见的指令集可以分为RISC精简指令集和CISC复杂指令集两种类型,RISC的特点是指令集简单,复杂计算通过简单指令组合而成,代表作是ARM架构和RISC-V架构。CISC的特点是指令集复杂,很多常见的运算通过硬件实现,代表作是X86架构。
影响指令集设计的主要因素有:
- 硬件因素(半导体工艺进步等)
- 软件因素(操作系统/编译技术,如:操作系统分为用户态和内核态,那就有必要设计状态切换指令)
- 应用因素(应用对于计算的需求,例如当大家都在搞AI,需要浮点运算时,那就有必要设计浮点运算指令)
指令集组成为: - 操作码(加减乘等)
- 操作对象(访存地址,立即数等)
指令码可以分为四大类:
- 运算类:ADD
- 访存类:LOAD
- 转移类:eg:JUMP
- 特殊指令
处理器可以访问的地址空间分为:
- 寄存器空间(通用寄存器,专用寄存器,控制寄存器,使用寄存器号寻址)
- 内存空间(分为内存空间和IO空间,使用地址寻址。CISC区分IO空间和内存空间,RISC不区分二者,处理器对IO空间的访问不能经过Cache,因此在使用相同的load/store指令既访问IO空间又访问内存空间的情况下,就需要定义load/store指令访问地址的存储访问类型,用来决定该访问能否经过Cache。)
根据指令使用数据的方式,指令系统可分为堆栈型、累加器型和寄存器型。寄存器型又可以进一步分为寄存器-寄存器型(Register-Register)和寄存器-存储器型(Register-Memory)
- 堆栈型:不需要操作数,操作数默认是堆栈,eg:PUSH A
- 累加器型:只需要一个操作数,另一个默认是累加器,eg:LOAD A
- 寄存器-存储器型/寄存器-寄存器型:指定两个操作数,eg: LOAD R1, A ; LOAD R1,R2;寄存器寄存器型指令更常用,便于进行优化
现代指令集都有运行权限等级划分,最少也有用户态和内核态两种等级,在用户态只能使用指令集的一部分指令,还有一部分特权指令只能在内核态使用。特权指令主要包括:
- 运行模式转换
- 虚拟存储管理
- 异常和中断处理
- 控制状态寄存器