计算机体系结构
体系结构的概念用于描述计算机系统设计的技术,方法和理论
主要包括计算机指令系统,计算机组成和计算机硬件实现三个方面
涵盖处理器和多处理器,存储器,输入输出系统,互联和通信等计算机系统设计的主要内容
还涉及到性能评价,编译和操作系统技术
通过定量分析的途径,学习掌握现代计算机体系结构研究的基本方法
计算机体系结构是程序员所看到的计算机的属性,即概念性结构与功能特性
程序员所看到的计算机的属性
对于通用寄存器型机器,这些属性主要是指
数据表示:硬件能直接辨认和处理的数据类型 (数据类型在我们学程序设计中碰到的实数,整数,还有些抽象数据,比如记录,数组等等,像这种数据类型不一定所有的计算机能识别,硬件一般能识别整数,浮点数,字符串,十进制)
寻址规则:最小寻址单元,寻址方式及其表示(寻址就是寻找操作数的地址)
寄存器的定义:寄存器的定义,数量和使用方法()
指令系统:机器指令的操作类型和格式,指令间的排序和控制机构等
中断系统:中断的类型和中断响应硬件的功能(与外部的交互)
机器工作状态的定义和切换:如管态和目态(比如现在不同的操作系统的保护机制)
存储系统:程序员可用的最存储容量
信息保护:信息的保护方式和硬件的支持
I/O结构:I/O寻址方式,数据传送的方式
计算机组成
指令集结构的逻辑结构
数据通路宽度
各种操作对功能部件的共享程度
专用功能部件的设置
功能部件的并行型(比如部件能不能同时进行减法,加法,或者乘法 这些机器的并行性能决定有效工作的效率)
缓冲和排队技术
预测技术
可靠性技术
控制机构的组成
计算机体系结构的逻辑实现
包括机器级内的数据流和控制流的组成以及逻辑设计
着眼于机器级内部各事件的排序方式与控制机构,各部件的功能和各部件间的联系
计算机系统设计与分析
-
成本与价格
一般我们装一台个人计算机时,显卡与显示器占计算机的百分之五十(主要我们现在的机器主要用于媒体处理,视频处理等等)CPU占百分之十左右,
总的来说,机器产品的价格会随时间呈下降趋势
-
基准测试程序(测试计算机体系性能)
性能与测试程序的程序时间相关,那么用什么做测试程序呢?
五类测试程序
1 真实程序 2 修正的应用程序 3 核心程序(如果真实程序太庞大,选取其中一小部分,称为核心程序,用这一小部分测试) 4 小测试程序 5 合成测试程序
测试程序包
选择一组各个方面有代表性的测试程序组成
极可能测试一个计算机体系的性能
量化设计的基本原则
-
大概率时间的优先原则
追求全局的最优结果
最常见的事件,赋予它优先处理权和资源使用权,以获得全局的最优结果
-
Amdahl定律
系统性能加速比,受限于该部件在系统中所占的重要性
假设我们对机器某种部件进行改进,那么机器系统的加速比就是 系统加速比 = 改进后的系统性能 / 改进前的系统性能 = 改进前的总执行时间 / 改进后的总执行时间 性能加速比能告诉我们改进后的机器比改进前的机器快多少 系统加速比依赖两个因素 “可改进比例”:可改进部分在原系统计算时间所占的部分,总是小于1 “部件加速比”:可改进部分改进以后的性能提高,一般是大于1
Amdahl系统执行时间
总执行时间(改进后) = 总执行时间(改进前)*【(1 - 可改进比例)+ 可改进比例 / 部件加速比 】
由上述式子推出
系统性能加速比 = 1 / (1 - 可改进比例)+ 可改进比例 / 部件加速比
-
性能增加的递减规则
仅仅对计算机中的一部分做性能改进,则改进越多,系统获得的效果越小
-
重要推论
针对整个的一部分任务优化,则最大加速比不大于 1 / 1 - 可改进比例
-
-
程序的局部性原理
程序执行时所访问存储器在时-空间上是相对的地簇聚(这种簇聚包括指令和数据两部分)
就是说程序的访问地址不是随机的,而是相对簇聚的
-
包括时间局部性和程序的空间局部性
程序的时间局部性:程序即将用到的信息很可能就是目前使用的信息
程序的空间局部性:程序即将用到的信息很可能与目前用到的信息在空间上相邻或者临近
-
指令系统
-
指令集结构概述
指令集(操作码,寻址方式,操作数,寻址方式,操作数 包括数学运算、逻辑操作、内存访问和控制流程)
-
一些指令的集合
-
每条指令都是直接由CPU硬件执行
指令的表示方式
-
二进制格式
-
物理存储空间组织方式是位,字节,字,多字
-
当前指令字长 16 32 64
-
可变长格式 固定长度格式
-
操作数是一些存储单元的地址
典型的存储单元通常有主存,寄存器,堆栈,和累加器
指令集与计算机的性能
Tcpu (CPU时间)= CPI x IC x Tclk
CPI :指令执行的平均时钟周期数 = 执行程序所需的时钟周期数/IC
IC:执行的指令条数
Tclk:CPU的时钟周期的时间或者CPU的主频
2 指令集结构的分类
五种分类方法
-
在CPU中操作数的存储方法
存储操作数的存储单元主要有
-
堆栈
-
累加器
-
一组寄存器
通用寄存器型指令集结构的分类
优点:在表达式求值方面,比其他类型指令集结构都具有更大的灵活性
寄存器可以存放变量
寄存器-寄存器型:数据都来自通用寄存器中
寄存器-存储器型:数据可来自存储器中
存储器-存储器型:
-
-
指令中显式表示操作数个数
-
操作数的寻址方式
-
指令集所提供的操作类型
-
操作数地类型和大小
3 RISC指令:尽可能把指令系统简化,指令条数少功能简单
CISC指令:增强指令功能,把越来越多功能给硬件实现存在以下不足
指令频度相差悬殊
指令系统庞大,条数太多,太复杂占用CPU面积,成本高
操作繁琐,规整性不好
寻址技术
在通用寄存器型指令集结构中,一般是利用寻址方式指明指令中的操作数是一个常数,一个寄存器操作数,或者存储器操作数
寻址实际上是从指令里面给出的形式地址到实际地址的转换,形式地址有指令描述,实际地址也称为有效地址
有效地址指明的是存储器单元的地址或者寄存器的地址
常用的操作数寻址方式
寄存器寻址
-
指令实例 Add R4 , R3
-
含义: Regs[R4] <-- Regs[R4] + Regs[R3]
立即值寻址
-
指令实例 Add R4 , #3
-
含义 :Regs[R4] <-- Regs[R4] + 3 这里一个操作数直接编码到指令里面的,当我们取指令的时候,这个操作数直接在指令里面,所以接下来的话,我们直接在指令的立即数字段里取出这个操作数,就是这个立即数3
偏移寻址
-
指令实例 Add R4 , 100(R1)
-
含义: Regs[R4]<-- Regs[R4] + Mem[100+Regs[R1]] (Mem是对计算机内存的常见缩写)
指令操作码设计
某处理机的指令字长为16位,有二地址指令,单地址指令和零地址指令三类,每个地址字段的长度均为16位。 (1) 如果二地址指令有15条,单地址指令和零地址指令的条数基本相同,那么单地址指令和零地址指令各有多少条?为三类指令分配操作码 (2) 如果指令系统要求这三类指令条数的比例为1:9:9,那么三条指令各有多少条?为三类指令分配操作码
MIPS指令集结构
具有一个简单的Load/Store指令集
注重指令流水效率
简化指令译码
高效支持编译器
支持 寄存器 立即值 偏移 寄存器间接寻址 这四个寻址方式
对Load/Store指令的解释
Load/Store指令是计算机体系结构中的一类指令,用于处理数据在内存和寄存器之间的传输。这些指令通常在程序中用于读取数据(Load)或写入数据(Store)到内存位置。 Load指令用于将数据从内存加载到寄存器中,以供处理器进一步操作。Load指令指定了要加载的内存地址,将该地址处的数据读取到指定的寄存器中。这样,处理器就可以在寄存器上执行各种操作,如算术运算、逻辑运算等。 Store指令则用于将数据从寄存器写入到内存中的指定位置。Store指令指定了要存储的内存地址和要存储的数据值,将数据写入指定的内存单元。这样,处理器就可以将计算结果或其他需要保存的数据存储到内存中,以供后续使用或传输。 Load/Store指令在计算机体系结构中起着重要的作用,因为它们允许处理器与内存之间进行高效的数据传输。通过将数据加载到寄存器中,处理器可以在寄存器级别上执行更快速的操作,而不必每次都从内存中读取数据。类似地,通过将数据从寄存器存储到内存中,处理器可以将结果保存在内存中,以便其他组件或外部设备进行访问。
MIPS指令操作类型
-
Load和Store操作:
-
ALU操作:
-
分支和跳转操作:
-
浮点操作:
符号“<--” 表示:数据传送操作,其后附带一个下标n,即“<--n”表示传送一个n位数据
符号"##"用来表示:两个两个域的串联操作,它可以出现在数据传送操作的任何一边
域的下表:用来表明从该域中选择某一位,域中位的标记是从最高位开始标记,并且起始标记为0.下标可以是一个单独的数字,如Regs[R4]0(该0是右下的小下表)下标也可以是一个范围如 Regs[R4]24....31表示选择寄存器R3中的内容的最低一个字节
上标:表示复制一个域,如0^24可以得到一个24位全为0的域
变量Mem用来表示存储器中的一个数组,存储器按照字节寻址,它可以传送任何数目的字节
MPIS基本流水线
MIPS(Microprocessor without Interlocked Pipeline Stages)是一种经典的RISC(Reduced Instruction Set Computer)指令集架构,它以简洁和规范的指令集设计而著称。下面是一些常见的MIPS指令及其功能:
-
1. 加法指令: - ADD:将两个寄存器中的值相加,并将结果存储到目标寄存器中。 - ADDI:将一个寄存器中的值与一个立即数相加,并将结果存储到目标寄存器中。 2. 减法指令: - SUB:将一个寄存器中的值减去另一个寄存器中的值,并将结果存储到目标寄存器中。 - SUBI:将一个寄存器中的值减去一个立即数,并将结果存储到目标寄存器中。 3. 逻辑运算指令: - AND:对两个寄存器中的值进行逻辑与操作,并将结果存储到目标寄存器中。 - OR:对两个寄存器中的值进行逻辑或操作,并将结果存储到目标寄存器中。 - XOR:对两个寄存器中的值进行逻辑异或操作,并将结果存储到目标寄存器中。 - ANDI:对一个寄存器中的值与一个立即数进行逻辑与操作,并将结果存储到目标寄存器中。 - ORI:对一个寄存器中的值与一个立即数进行逻辑或操作,并将结果存储到目标寄存器中。 4. 移位指令: - SLL:将一个寄存器中的值左移指定的位数,并将结果存储到目标寄存器中。 - SRL:将一个寄存器中的值右移指定的位数(逻辑右移),并将结果存储到目标寄存器中。 - SRA:将一个寄存器中的值右移指定的位数(算术右移),并将结果存储到目标寄存器中。 5. 分支和跳转指令: - BEQ:如果两个寄存器中的值相等,则跳转到目标地址。 - BNE:如果两个寄存器中的值不相等,则跳转到目标地址。 - J:无条件跳转到目标地址。 - JR:无条件跳转到寄存器中保存的地址。 - JAL:跳转到目标地址,并将当前指令的地址保存到寄存器中。
MIPS是一种非流水方式
非流水线方式:指令在执行过程中不通过流水线进行分阶段处理,而是逐条顺序执行指令,在该方式中,每条指令的执行必须完成之后才能执行下一条指令,没有指令重叠执行的能力
流水线方式:将指令执行过程划分为多个阶段,并行处理多条指令,以提高指令的吞吐量和执行效率。每个阶段都专注于不同的任务,并且在同一时钟周期内可以同时处理多个指令。
将指令执行划分为5个阶段
-
取指令周期(IF)
根据PC值从存储器中取出指令,并将指令送入指令寄存器(IR)中,PC值增加4指向顺序的下一条指令,并将下一条指令的地址放到临时寄存器NPC中
IR<--Mem[PC]
NPC<--PC + 4
问题解决
将PC值加4是因为:在大多数计算机体系结构中,指令的长度通常是固定的,通常为4个字节(32位)。每个字节表示指令中的一个部分,因此,每次取指令时,PC的值都需要增加指令的长度,以跳转到下一条指令的地址。
通过将PC增加4,可以确保在每个取指令周期结束后,PC指向下一条顺序的指令地址。
-
指令译码/读寄存器周期(ID)
进行指令译码,读IR寄存器,按照相应寄存器号读寄存器文件(锁存器),并将读出结果放入两个临时寄存器A和B中,同时对IR寄存器中内容的低16位进行符号扩展,然后将符号扩展之后的32位立即保存在临时寄存器Imm中.
问题解决
按照相应寄存器号读寄存器文件:指令中可能包含需要读取的寄存器编号。在这一步,处理器根据指令中的寄存器编号,从寄存器文件(Register File)中读取相应寄存器的值。寄存器文件通常是一个包含多个通用寄存器的存储器,用于存储程序执行过程中的数据。
将读出结果放入临时寄存器A和B中:读取寄存器文件中相应寄存器的值后,这些值会被放入两个临时寄存器A和B中。这样,后续的执行阶段就可以使用这些寄存器的值进行操作。
-
执行/有效地址计算周期(EX)
存储器访问:ALUoutput <-- A + Imm 将寄存器A和立即数送到ALU寄存器中形成访存地址
寄存器-寄存器ALU:ALUoutput<--A op B
寄存器-立即数ALU:ALUoutput<--A op Imm 将A寄存器的结果和立即数的和送到ALU寄存器中形成访存地址
-
存储器访问/分支完成周期(MEM)
Load(访存):LMD <-- LMDMEM[ALUoutput] 通过上个周期得到的ALUoutput这个地址所指的单元内容 读出来送到LMD这个寄存器中
Store (写):Mem[ALUputput] <-- B 将寄存器B的内容送到内存地址为ALUoutput的单元里
-
写回周期(WB)
操作为:寄存器-寄存器型ALU指令
Red[IR16...20] <-- ALUoutput
流水线分析
吞吐率:是的单位时间内流水线所完成的任务数
最大吞吐率:假设流水线各端时间都相等,均为t0 , 则 TPmax = 1 / t0
假设不相同: 则 TPmax = 1 / max(ti)
加速比:指m段流水线的速度和等功能非流水速度之比
效率:流水设备的利用率
在数据通路上
分支指令需要4个时钟周期
其他指令需要5个时钟周期
假设分支指令占总指令数12%,问CPI等于多少
CPI = 4*12% + 5*(1-12%) =4.88
流水技术应解决的问题
-
应保证流水线各段不会在同一时钟周期内使用相同的寄存器通路资源
-
例如:不能要求ALU做有效地址计算,又做减法操作
-
IF与Mem两个阶段都要访问存储器,怎样避免访存冲突?
-
ID与WB两个阶段都要访问存储器,是否存在冲突?
-
-
PC计算问题
为了能够在每个时钟周期启动一条新的指令,流水线必须在IF段获得下一条指令的地址,并将保存在PC中,但是在执行分支指令会改变PC的值,只有在Mem结束时,这个新值才会写入PC的值
流水线中的相关
-
结构相关:当指令在重叠执行中,硬件资源满足不了指令重叠执行的要求,发生资源冲突时,将产生结构相关
导致结构相关的常见原因
-
功能部件不是全流水
-
-
数据相关: 因一条指令需要用到前面指令的结果,而无法与产生结果的指令重叠执行时,就发生了数据相关
当指令在流水线中重叠执行时,流水线有可能改变指令读/写操作数的顺序,使之不同于它们在非流水线实现时的顺序,这将导致数据相关
写后读相关:一个指令(指令A)在读取某个数据之后,后面紧跟着的另一个指令(指令B)又对同一数据进行写入操作,那么指令A的执行结果可能会受到指令B的影响。
写后写相关:第一个写操作没有第二个写操作快,原本写入的数为操作二,结果由于速度比操作一块,实际写入的数据为操作一的
读后写相关:本应该先读后写,结果写的操作速度比读的操作速度快,原本读到的数据被写入的数据覆盖掉,读到了错误的数据
-
控制相关:当流水线遇到分支指令和其他会改变pc值的指令时就发生控制相关
存储层次
-
多级存储层次:寄存器-Cache-主存-辅存
两种存储层次的关系:在CPU和主存之间增加cache弥补主存速度不足的缺陷,另一个是在主存外面增加一个容量更大,价格更低的辅存。
改进cache性能的三种方式:
(1)降低失效率:调节cache块的大小,提高相联度,Victim cache,硬件预取,编译优化
(2)减少失效开销:写缓冲写合并,读失效优先于写,请求字处理,多级cache,非阻塞cache
(3)减少cache命中时间:用小容量结构简单的cache,虚拟cache,访问流水,多体cache等等
三种映射的特点:
直接映射:主存块只能被放置到唯一的一个cache的方式。
全相联映射:主存块可以被放置到任意一个cache块位置
组相联映射:主存块可以放到cache中唯一一个组的任何一个位置.
输入输出系统
1.I/O系统可以通过(响应时间)和(可靠性)参数衡量其性能
2.磁盘阵列
RAID0:数据直接分布在多个磁盘上,无冗余。(速度快,容量大,可靠差) RAID1:数据采用镜像,拥有一个冗余。(读写操作快,容量小,可靠性高) RAID5:交叉分布式奇偶校验(冗余小,读写快,但是设计复杂)
3.DMA访问方式
1.使操作系统在I/O的传输过程中确保DMA设备访问的页面都位于物理存储器中,这些页面都是锁定在主存的页面。 2.采用“虚拟DMA技术”,它允许DMA设备直接使用虚拟地址,DMA期间由硬件将虚拟地址映射到物理地址。
4.通道:为减轻CPU负担管理外设的I/O
1通道的功能:接受来自cpu的i/o指令,根据指令与指定的外设进行连接 2执行CPU为通道组织的通道程序 3为主存和外设设置传输控制信息。 4指定后才能送工作结束时进行的操作 5检查外设的工作方式 6在传输数据过程中完成必要的数据格式变换。