第六级 虚拟机 应用语言机器
↓
第五级 虚拟机 高级语言机器
↓
第四级 虚拟机 汇编语言机器
↓
第三级 虚拟机 操作系统机器
↓
第二级 物理机 传统机器语言机器
↓
第一级 物理机 微程序机器
微程序解释指令系统又称作“仿真”
计算机系统结构经典定义:传统程序员所看到的计算机属性,即概念性结构和功能特性
计算机系统结构广义的定义: 指令系统结构、组成、硬件
计算机组成指的是计算机系统结构的逻辑实现,包含物理机器级中的数据流和控制流的组成以及逻辑设计等。
计算机实现指的是计算机组成的物理实现。
具有相同计算机系统结构的计算机因为速度、价格等方面的要求不同,可以采用不同的计算机组成。而同一种计算机组成又可以采用多种不同的计算机实现,即采用不同的物理结构来实现。
按照指令流和数据流的多倍性进行分类的
指令流:计算机执行的指令序列
数据流:指令调用的数据序列
多倍性:系统最受限的部件上,同时处于同一执行阶段的指令或者数据的最大数目
Flynn分类法把计算机系统的结构分为以下4类
用系统的最大并行度对计算机进行分类
最大并行度 P m P_m Pm 定义为:计算机系统在单位时间内能够处理的最大二进制位数
分为4类不同最大并行度的计算机系统结构
n表示字宽,m表示位片宽度,m×n为最大并行度
平均并行度 p a p_a pa
假设每个时钟周期内能够同时处理的二进制位数为 P i P_i Pi,则T个时钟周期内的平均并行度为 p a = ∑ i = 1 T P i T p_a = \frac{\sum_{i=1}^{T}P_i}{T} pa=T∑i=1TPi
平均利用率 μ \mu μ
系统在T个时钟周期内的平均利用率 μ = P a P m \mu = \frac{P_a}{P_m} μ=PmPa
将计算机硬件结构分为三个层次
一个计算机系统的结构用以下公式表示:
t ( 系 统 型 号 ) = ( k , d , ω ) t(系统型号) = (k,d,\omega) t(系统型号)=(k,d,ω)
进一步反映流水线的特性,可以将公式改进为
t ( 系 统 型 号 ) = ( k × k ′ , d × d ′ , ω × ω ′ ) t(系统型号)= (k\times k^{'}, d\times d^{'}, \omega \times \omega^{'}) t(系统型号)=(k×k′,d×d′,ω×ω′)
加 速 比 = 系 统 性 能 ( 改 进 后 ) 系 统 性 能 ( 改 进 前 ) = 总 执 行 时 间 ( 改 进 前 ) 总 执 行 时 间 ( 改 进 后 ) 加速比 = \frac{系统性能(改进后)}{系统性能(改进前)} = \frac{总执行时间(改进前)}{总执行时间(改进后)} 加速比=系统性能(改进前)系统性能(改进后)=总执行时间(改进后)总执行时间(改进前)
Fe,可改进比例,可改进部分的执行时间在总的执行时间中所占的比例
Se,加速比(改进部件),改进前的执行时间与改进后的执行时间的比值
改进后的执行时间为
T n = T 0 ( 1 − F e + F e S e ) T_n = T_0(1 - Fe + \frac {Fe}{Se}) Tn=T0(1−Fe+SeFe)
改进后的加速比为
S n = T 0 T n = 1 1 − F e + F e S e S_n = \frac{T_0}{T_n} = \frac{1}{1-Fe+\frac{Fe}{Se}} Sn=TnT0=1−Fe+SeFe1
C P U 时 间 = 执 行 程 序 所 需 的 时 钟 周 期 × 时 钟 周 期 时 间 CPU时间 = 执行程序所需的时钟周期 \times 时钟周期时间 CPU时间=执行程序所需的时钟周期×时钟周期时间
时钟周期时间是时钟频率的倒数
CPI即每条指令的平均时钟周期数
C P I = 执 行 程 序 所 需 的 时 钟 周 期 / 所 执 行 的 指 令 条 数 CPI = 执行程序所需的时钟周期 / 所执行的指令条数 CPI=执行程序所需的时钟周期/所执行的指令条数
所以
C P U 时 间 = I C × C P I × 时 钟 周 期 时 间 CPU时间 = IC \times CPI \times 时钟周期时间 CPU时间=IC×CPI×时钟周期时间
所以,CPU的性能取决于
C P U 时 间 = C P U 时 钟 周 期 数 × 时 钟 周 期 时 间 = ∑ i = 1 n ( C P I i × I C i ) × 时 钟 周 期 时 间 CPU时间 = CPU时钟周期数 \times 时钟周期时间 = \sum_{i=1}^{n}(CPI_i \times IC_i) \times 时钟周期时间 CPU时间=CPU时钟周期数×时钟周期时间=∑i=1n(CPIi×ICi)×时钟周期时间
∑ i = 1 n ( C P I i × I C i ) \sum_{i=1}^{n}(CPI_i \times IC_i) i=1∑n(CPIi×ICi)
C P I i CPI_i CPIi指的是第i种指令所需要的平均时钟周期数,n为指令的种数, I C i IC_i ICi为程序执行的过程中第i种指令出现的次数
C P I = 时 钟 周 期 数 I C = ∑ i = 1 n ( C P I i × I C i ) I C = ∑ i = 1 n ( C P I i × I C i I C ) CPI = \frac{时钟周期数}{IC} = \frac{\sum_{i=1}^{n}(CPI_i\times IC_i)}{IC} = \sum_{i=1}^{n}(CPI_i \times \frac{IC_i}{IC}) CPI=IC时钟周期数=IC∑i=1n(CPIi×ICi)=∑i=1n(CPIi×ICICi)
局部性包括时间局部性和空间局部性
时间局部性是指程序即将用到的信息很可能就是目前正在使用的信息。
空间局部性是指程序即将用到的信息很可能与目前正在使用的信息在空间上相邻或者很近
利用程序的局部性原理,可以根据程序最近的访问情况来比较准确地预测将要访问的指令和数据。
组成
主要特点
指的是同一厂家生产的具有相同的系统结构,但是具有不同组成和实现的一系列不同型号的计算机
系列机的软件兼容有四种:
向上兼容
按某档计算机编制的程序,不加修改就能运行于比它高档的计算机
向下兼容
按某档计算机编制的程序,不加修改就能运行于比它低档的计算机
向前兼容
按某个时期投入市场的某种型号计算机编制的程序,不加修改就能运行于在他之前投入市场的计算机
向后兼容
按某个时期投入市场的某种型号的计算机编制的程序,不加修改就能运行于在他之后投入市场的计算机
目前的计算机只需要保证向上兼容和向后兼容就可以。向后兼容一定要实现,它是系列机的根本特性
仿真:用一台现有计算机(称为宿主机)上的微程序去解释实现另一台计算机(称为目标机)的指令系统。
模拟:用软件的方法在一台现有计算机(宿主机)上实现另一台计算机(模拟机)的指令系统
仿真和模拟的主要区别在于解释执行所用的语言:
仿真使用微程序解释执行,解释程序存放在控制存储器中;模拟使用机器语言程序解释执行,模拟程序存储在主存中
仿真的运行速度快
频度的指令使用仿真实现,频度低使用模拟实现
计算机系统在同一时刻或者同一时间间隔内进行多种运算或操作。只要在时间上相互重叠,就存在并行性。并行性包含同时性和并发性两种含义。
同时性:两个或者两个以上的事件在同一时刻发生
并发性:两个或者两个以上的事件在同一时间间隔内发生
处理数据的角度:
①字串位串<②字串位并<③字并位串<④全并行
①:每次只对一个字的一位进行处理,不存在并行性
②:同时对一个字的全部位进行处理,不同字之间是串行的
③:同时对许多字的同一位进行处理
④:同时对许多字的全部位或者部分位进行处理
执行程序的角度:
Ⅰ指令内部并行<Ⅱ指令级并行<Ⅲ线程级并行<Ⅳ任务级或者过程级并行<Ⅴ作业或者程序级并行
Ⅰ:单条指令中各微操作之间的并行
Ⅱ:并行或者并发地执行两条或者两条以上的指令
Ⅲ:并行执行两个或者两个以上的线程,线程是进程内部一个相对独立、可独立调度和指派的执行单元,但是它基本上不拥有系统资源
Ⅳ:并行执行两个或者两个以上的任务或者过程,以子程序或者进程位调度单元
Ⅴ:并行执行两个或者两个以上的作业或者程序
时间重叠
流水线技术是时间重叠的典型实例
资源重复
重复设置硬件资源,大幅度提高计算机系统的性能
资源共享
软件方法,多个任务按一定的时间顺序轮流使用同一套硬件设备。多道程序、分时系统就是遵循这一途径而产生的。
指令由操作码和地址码构成
CPU中用来存放操作数的存储单元主要有三种:堆栈、累加器、通用寄存器组
指令系统的结构分为堆栈型结构、累加器型结构以及通用寄存器型结构
根据操作数来源不同,通用寄存器结构又可以分为寄存器-存储器型结构RM,寄存器-寄存器型结构RR
RM结构的操作数可以来自存储器,而RR结构的操作数则都是来自通用寄存器组,由于RR结构中只有load指令和store指令能够访问存储器,所以也被称为load-store结构
通用寄存器型结构又可以细分为
控制指令是用来改变控制流的
当指令是无条件改变控制流时,称为跳转指令;当控制指令是有条件改变控制流的时候,则称为分支指令
能够改变控制流的指令有4种,分支(brach)、跳转(jump)、过程调用(call)、过程返回(return)
改变控制流的大部分指令是分支指令(条件转移),三种表示分支的方法
控制指令中必须给出转移的目标地址,大多数情况下指令中显式地给出目标地址,但是过程返回指令无法显式给出目标地址,因为编译时不知道返回地址
指定转移目标地址最常用的方法是在指令中提供一个偏移量,该偏移量和程序计数器的值相加得到真实的目标地址,这种方式叫做PC相对寻址
+----+------------------------------+
|jump| offset | 相对跳转指令
+----+------------------------------+
(有效PC位址 = 下一條指令的位址 + offset,offset 可為負數)
PC对寻址的有效地址是下一条指令地址加上偏移参数。 通常对该偏移是有符号数,以允许跳转到指令之前和之后的代码。
这种寻址方式的跳转指令特别有用,因为常见的跳转指令的目标是是附近的指令(在高级语言中,大多数if或while语句相当短)。 实际程序的测量表明,对于大约90%的条件跳转(大约±128或±512字节),8或10位偏移就足够了。
PC相对寻址的另一个优点是代码可以是位置无关的 ,即它可以加载到存储器中的任何地方而无需调整任何地址。
这种寻址模式的某些版本可以是有条件的,这些条件例如两个寄存器之间的关系:“如果reg1 = reg2跳转”、一个寄存器自身:“跳转除非reg1 = 0”或者隐含地状态寄存器中某些位。
指令系统的设计包括:指令的功能设计和指令的格式设计
确定哪些基本功能使用硬件实现,考虑因素:速度、成本、灵活性
对指令系统的五个基本要求:完整性、规整性、正交性、高效率性和兼容性
定义:如何用最短的位数表示指令的操作信息和地址信息
赫夫曼编码:
对操作码进行赫夫曼编码,构建赫夫曼树的过程很简单
操作码的优化程度可以用信息熵来衡量:
H = − ∑ i = 1 n p i log 2 p i H=-\sum_{i=1}^{n}p_i\log_{2}p_i H=−i=1∑npilog2pi
构造的赫夫曼树的平均码长
L = ∑ i = 1 n p i l i L=\sum_{i=1}^{n}p_il_i L=i=1∑npili
信息冗余量
R = L − H L × 100 % R=\frac{L-H}{L}\times 100\% R=LL−H×100%
15/15/15
+----+----+----+------------+
|xxxx|xxxx|xxxx|
+----+----+----+------------+
对于15/15/15这种模式来说
+----+----+----+------------+
|0000|xxxx|xxxx|
+----+----+----+------------+
.
. 共15条
.
+----+----+----+------------+
|1110|xxxx|xxxx|
+----+----+----+------------+
**************************************
+----+----+----+------------+
|1111|0000|xxxx|
+----+----+----+------------+
.
. 共15条
.
+----+----+----+------------+
|1111|1110|xxxx|
+----+----+----+------------+
**************************************
+----+----+----+------------+
|1111|1111|0000|
+----+----+----+------------+
.
.共15条
.
+----+----+----+------------+
|1111|1111|1110|
+----+----+----+------------+
8/64/512
对于8/64/512这种模式来说
+----+----+----+------------+
|0000|xxxx|xxxx|
+----+----+----+------------+
.
. 共8条
.
+----+----+----+------------+
|0111|xxxx|xxxx|
+----+----+----+------------+
**************************************
+----+----+----+------------+
|1000|0000|xxxx|
+----+----+----+------------+
.
. 共8×8=64条
.
+----+----+----+------------+
|1111|0111|xxxx|
+----+----+----+------------+
**************************************
+----+----+----+------------+
|1000|1000|0000|
+----+----+----+------------+
.
.共8×8×8=512条
.
+----+----+----+------------+
|1111|1111|0111|
+----+----+----+------------+
复杂指令集 (Complex instruction set computer)
CISC指令系统特点
从三个方面对CISC指令系统进行改进
面向目标程序增强指令功能
提高计算机系统性能最直接的方式,对于使用频度高的指令,用硬件加快其执行;对于使用频度高的指令串,用一条新的指令来代替
面向高级语言的优化实现来改进指令系统
面向操作系统的优化实现改进指令系统
精简指令集 (Reduced instruction set computer)
CISC指令集结构存在的问题:
RISC原则
由寻址方式确定的存储器地址称为有效地址
寻址方式 | 指令实例 | 含义 |
---|---|---|
寄存器寻址 | ||
立即数寻址 | ||
偏移寻址 | ||
寄存器间接寻址 | ||
索引寻址 | ||
直接寻址 | ||
寄存器间接寻址 | ||
自增寻址 | ||
自减寻址 | ||
缩放寻址 |
寻址方式中,物理地址空间的信息存放问题
信息宽度不超过主存宽度的信息必须存放在一个存储字中,不能跨界,信息在主存中存放的起始地址必须是该信息宽度(字节数)的整数倍,即
字节信息的起始地址为:x…xxxx
半字信息的起始地址为:x…xxx0
单字信息的起始地址为:x…xx00
双字信息的起始地址为:x…x000
假设主存宽度为8字节,
现在可以理解下面这些话的含义了:
字节信息的起始地址为:x…xxxx
半字信息的起始地址为:x…xxx0
单字信息的起始地址为:x…xx00
双字信息的起始地址为:x…x000
把一个重复的过程分解成若干个子过程,每个子过程由专门的功能部件来实现。把多个处理过程在时间上错开,依次通过各功能段,这样每个子过程就可以与其他的子过程并行进行。
流水线中的每个子过程及其功能部件陈伟流水段的级或段,流水线的段数称为流水线的深度
流水线技术用于指令的解释过程,形成指令流水线
流水线技术用于运算的执行过程,形成运算操作流水线,
时间最长的段将称为流水线的瓶颈
流水线每一个段后面都要有一个缓冲寄存器,称为流水寄存器。
通过时间:第一个任务从进入流水线到流出结果所需要的时间
排空时间:最后一个任务从进入流水线到流出结果所需要的时间
单位时间内流水线所完成的任务数量或者输出结果的数量
流水线吞吐率计算:
T P = n T k TP=\frac{n}{T_k} TP=Tkn
n为任务数, T k T_k Tk是处理完n个任务所用的时间,k是一条流水线的段数
流水线技术的效果就是从通过时间之后,每段时间内都有一个任务结果流出
所以n个任务的执行时间为:
T k = k × △ t + ( n − 1 ) × △ t = ( k + n − 1 ) △ t T_k = k\times \triangle t + (n-1)\times \triangle t = (k+n-1)\triangle t Tk=k×△t+(n−1)×△t=(k+n−1)△t
所以:
T P = n ( k + n − 1 ) × △ t TP = \frac{n}{(k+n-1)\times\triangle t} TP=(k+n−1)×△tn
T P m a x = lim x → ∞ n ( k + n − 1 ) × △ t = 1 △ t TP_{max} = \lim_{x\to \infty}\frac{n}{(k+n-1)\times\triangle t}=\frac{1}{\triangle t} TPmax=limx→∞(k+n−1)×△tn=△t1
T P = T P m a x × n k + n − 1 TP=TP_{max}\times \frac{n}{k+n-1} TP=TPmax×k+n−1n
当n>>k,即n远大于k时,才有 T P ≈ T P m a x TP\approx TP_{max} TP≈TPmax
T k = ∑ i = 1 k △ t i + ( n − 1 ) m a x ( △ t 1 , △ t 2 , ⋯ , △ t k ) T_k = \sum_{i=1}^{k}\triangle t_i + (n-1)max(\triangle t_1, \triangle t_2,\cdots,\triangle t_k) Tk=∑i=1k△ti+(n−1)max(△t1,△t2,⋯,△tk)
T P = n ∑ i = 1 k △ t i + ( n − 1 ) m a x ( △ t 1 , △ t 2 , ⋯ , △ t k ) TP = \frac{n}{\sum_{i=1}^{k}\triangle t_i + (n - 1)max(\triangle t_1, \triangle t_2, \cdots, \triangle t_k)} TP=∑i=1k△ti+(n−1)max(△t1,△t2,⋯,△tk)n
T P m a x = 1 m a x ( △ t 1 , △ t 2 , ⋯ , △ t k ) TP_{max} = \frac{1}{max(\triangle t_1, \triangle t_2, \cdots, \triangle t_k)} TPmax=max(△t1,△t2,⋯,△tk)1
当流水线各段的时间不完全相等的时候,流水线的最大吞吐率和实际吞吐率由时间最长的那个段决定,这就成了整个流水线的瓶颈
消除瓶颈段的方式
都能让改进后的流水线吞吐率达到
T P m a x = 1 △ t TP_{max}=\frac{1}{\triangle t} TPmax=△t1
使用顺序处理方式处理一批任务所用的时间与流水线使用流水处理方式处理同一批任务所用的时间比。
设顺序执行所用的时间为 T s T_s Ts,按照流水线方式处理所用的时间为 T k T_k Tk,加速比设为S
S = T s T k S=\frac{T_s}{T_k} S=TkTs
T s = n k △ t T_s = nk\triangle t Ts=nk△t
T k = k △ t + ( n − 1 ) △ t T_k = k\triangle t + (n-1)\triangle t Tk=k△t+(n−1)△t
S = T s T k = n k k + n − 1 S=\frac{T_s}{T_k} = \frac{nk}{k+n-1} S=TkTs=k+n−1nk
S m a x = lim x → ∞ S = k S_{max} = \lim_{x \to \infty}S = k Smax=limx→∞S=k
当n>>k时,流水线的最大加速比等于段数。从这这个意义上来看,段数越多越好
S = T s T k = n ∑ i = 1 k △ t i ∑ i = 1 k △ t i + m a x ( △ t 1 , △ t 2 , ⋯ , △ t k ) S=\frac{T_s}{T_k} = \frac{n\sum_{i=1}^{k}\triangle t_i}{\sum_{i=1}^{k} \triangle t_i + max(\triangle t_1, \triangle t_2, \cdots,\triangle t_k)} S=TkTs=∑i=1k△ti+max(△t1,△t2,⋯,△tk)n∑i=1k△ti
流水线设备的利用率,它是指流水线中的设备实际使用时间与整个运行时间的比值
假设有n个任务,那么每个段被使用的次数应该是n,那么一个段在整个执行过程中实际使用时间为 n △ t n\triangle t n△t
整个执行过程的时间为 T k T_k Tk,那么对于各段时间相等的流水线来说,效率
e = e 1 = e 2 = e k = n △ t T k = n △ t ( k + n − 1 ) △ t = n k + n − 1 e=e_1=e_2=e_k=\frac{n\triangle t}{T_k} = \frac{n\triangle t}{(k + n - 1)\triangle t} = \frac{n}{k + n - 1} e=e1=e2=ek=Tkn△t=(k+n−1)△tn△t=k+n−1n
整条流水线的效率为
E = e 1 + e 2 + ⋯ + e k k = e = k e k = k n △ t k T k = n k + n − 1 E=\frac{e_1 + e_2+\cdots+e_k}{k} = e = \frac{ke}{k} = \frac{kn\triangle t}{kT_k} = \frac{n}{k+n-1} E=ke1+e2+⋯+ek=e=kke=kTkkn△t=k+n−1n
最高效率为1( n → ∞ n\to \infty n→∞)
T P ( 吞 吐 量 ) = n T k TP(吞吐量)=\frac{n}{T_k} TP(吞吐量)=Tkn
所以
E = T P △ t E=TP\triangle t E=TP△t
当流水线各段时间相等的时候,流水线的效率与吞吐量成正比
S ( 加 速 比 ) = T s T k = n k k + n − 1 S(加速比)=\frac{T_s}{T_k} = \frac{nk}{k+n-1} S(加速比)=TkTs=k+n−1nk
所以
E = S k E=\frac{S}{k} E=kS
流水线的效率是流水线的实际加速比与它的最大加速比k的比值
E = k n △ t k T k E=\frac{kn\triangle t}{kT_k} E=kTkkn△t
从时空图上看,效率就是n个任务占用的时空面积和k段总的时空面积之比
E = n ∑ i = 1 k △ t i k [ ∑ i = 1 k △ t i + ( n − 1 ) × m a x ( △ t 1 , △ t 2 , ⋯ , △ t k ) ] E=\frac{n\sum_{i=1}^{k}\triangle t_i}{k[\sum_{i=1}^{k}\triangle t_i + (n-1)\times max(\triangle t_1, \triangle t_2, \cdots, \triangle t_k)]} E=k[∑i=1k△ti+(n−1)×max(△t1,△t2,⋯,△tk)]n∑i=1k△ti
启动距离:一条非线性流水线的输入端连续输入两个任务之间的时间间隔称为非线性流水线的启动距离
禁用启动距离:引起非线性流水线功能段使用冲突的启动距离被称为禁用启动距离
一般都用时钟周期数表示,是正整数
二维表,横向量表示时间,纵向量表示流水的段。
如果在第n个时钟周期里面使用第k段,则在第k行和第n列的交叉处画一个√
F是禁用启动距离构成的集合
获得方式:
冲突向量 C C C是一个N位的二进制位串,
设 C 0 = ( c N c N − 1 ⋯ c i ⋯ c 2 c 1 ) C_0 = (c_{N}c_{N-1}\cdots c_i\cdots c_2c_1) C0=(cNcN−1⋯ci⋯c2c1)
KaTeX parse error: No such environment: equation at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ c_i=\left\{ \b…
c i c_i ci=1表示不允许间隔i个时钟周期后送入后续任务
初始冲突向量 C 0 C_0 C0决定了下一个任务需要间隔多少时钟周期才可以流入。
设当前冲突向量是 C k C_k Ck,j是其中所有允许的时间间隔,则新的冲突向量为KaTeX parse error: Undefined control sequence: \or at position 16: SHR^{(j)}(C_k) \̲o̲r̲ ̲C_0
SHR为逻辑右移,这样处理直到没有新的向量产生
由初始状态出发,任何一个闭合回路即为一种调度方案
想要找到一种最佳的调度方案,使流水线的吞吐率最高,只要列出所有可能的调度方案,计算出每种方案的平均时间间隔,从中找出最小者即可
取指令周期(IF)
从存储器中取出指令并放入指令寄存器(IR),同时PC值4,指向顺序执行的下一条指令
指令译码/读寄存器周期(ID)
对指令进行译码,并用IR中的寄存器地址去访问通用寄存器组,读出所需的操作数
执行/有效地址计算周期(EX)
存储器访问/分支完成周期(MEM)
写回周期(WB)
需要解决的问题
定义:两条指令之前存在某种依赖关系。
数据相关
两条指令i和j,i在j的前面,
名相关
“名”是指令所访问的寄存器或者存储单元的名称,两条指令使用了相同的名,但是它们之间没有数据流动
可以使用换名技术消除名相关,即改变指令中操作数的名来消除名相关,对于寄存器操作数进行换名称为”寄存器换名”
控制相关
分支引起的相关
结构冲突
硬件资源满足不了指令重叠执行的要求而发生的冲突
前一条指令访问存储器时,将流水线停顿一个时钟周期,推迟后面取指令的操作
或者采用分别设置独立的指令存储器和数据存储器方法
或者只设置一个存储器,但采用两个分离的cache,指令cache和数据cache
数据冲突
当指令在流水线中重叠执行的时候,需要用到前面指令的执行结果而发生冲突
写后读冲突RAW
使用定向技术解决,将计算结果从产生的地方直接送到其他指令需要它的地方
写后写冲突WAW,值得注意的是,之前介绍的五段流水是不会产生写后写冲突的,只有
这样的流水线中才会出现写后写冲突
读后写冲突WAR,i读之前,j将新值写入
控制冲突
流水线遇到分支指令或者其他会改变PC值的指令所引起的冲突
解决方式
Cache,主存储器,磁盘存储器(辅存)构成的三级存储系统
Cache-主存层次,弥补主存速度的不足
主存-辅存层次,弥补主存容量不足,常被用来实现虚拟存储器
两个层次的比较
Cache-主存层次 | 主存-辅存层次 | |
---|---|---|
目的 | 为了弥补主存速度的不足 | 为了弥补主存容量的不足 |
存储管理的实现 | 全部由专用硬件实现 | 主要由软件实现 |
访问速度的比值(第一级比第二级) | 几比一 | 几万比一 |
典型的块(页)大小 | 几十个到几百个字节 | 几千个以上字节 |
CPU对第二级的访问方式 | 可直接访问 | 均通过第一级 |
不命中时CPU是否切换 | 不切换 | 切换到其他进程 |
4个问题:
映像规则
查找算法
替换算法
写策略
主存中的任何一块都能被放到Cache的任意一个位置
主存中,每一个块只能被放置到Cache中唯一的一个位置,
一般情况下,如果主存的第i块映像到Cache块的第j块,则
j = i mod M
M为Cache的块数
设 M = 2 m M=2^m M=2m,则当表示为二进制的时候,j实际上是i的低m位,所以可以直接用主存块的低m位去选择直接映像Cache中的块
主存中的每一块都能映射到唯一的一个Cache分组,但是这个块可以被放入这个分组的任何一个位置。
组的选择使用位选择算法,即对于主存的第i块,若它所映像到Cache的组号为k,则
k = i mod G
G为Cache的组数
设 G = 2 g G=2^g G=2g
同样,可以使用主存块地址的低g位去选择Cahe中的相应组,这里的低g位以及直接映像里面的低m位都被称为索引
如果每个组中有n块,则称该映像为n路组相联,n代表相连度,n越大,Cache的空间利用率就越高,块冲突概率就越低
直接映像的不命中率最高,全相联映像的不命中率最低
执行写操作的时候,不仅把数据写到Cache对应的块中,同时也写到下一级存储器
采用写直达法的时候,若进行写操作时,CPU必须等待,直到写操作结束,则称之为“CPU写停顿”,减少写停顿的常用方法是采用写缓冲器
只把数据写入Cache中相应的块,不写入下一级存储器
这些数据块只有在相应的块被替换时,才被写回下一级存储器
按写分配法:写不命中的时候,先把所写单元所在的块从主存中调入Cache,然后再进行写入
不按写分配法:写不命中时,直接写入下一级存储器而不将相应的块调入Cache
写回法一般采用按写分配法
写直达法一般采用不按写分配法
平 均 访 存 时 间 = 命 中 时 间 + 不 命 中 率 × 不 命 中 开 销 平均访存时间 = 命中时间 + 不命中率\times 不命中开销 平均访存时间=命中时间+不命中率×不命中开销
C P U 时 间 = ( C P U 执 行 周 期 数 + 存 储 停 顿 周 期 数 ) × 时 钟 周 期 时 间 CPU时间 = (CPU执行周期数 + 存储停顿周期数)\times 时钟周期时间 CPU时间=(CPU执行周期数+存储停顿周期数)×时钟周期时间
C P U 时 间 = ( I C × C P I + 总 访 存 次 数 × 不 命 中 率 × 不 命 中 开 销 ) × 时 钟 周 期 时 间 CPU时间 = (IC\times CPI + 总访存次数\times 不命中率 \times 不命中开销)\times 时钟周期时间 CPU时间=(IC×CPI+总访存次数×不命中率×不命中开销)×时钟周期时间
= I C × ( C P I + 访 存 次 数 I C ( 指 令 数 量 ) × 不 命 中 率 × 不 命 中 开 销 ) =IC\times(CPI + \frac{访存次数}{IC(指令数量)} \times 不命中率 \times 不命中开销) =IC×(CPI+IC(指令数量)访存次数×不命中率×不命中开销)
= I C × ( C P I + 每 条 指 令 的 平 均 访 存 次 数 × 不 命 中 率 × 不 命 中 开 销 ) =IC\times(CPI + 每条指令的平均访存次数 \times 不命中率 \times 不命中开销) =IC×(CPI+每条指令的平均访存次数×不命中率×不命中开销)
一般用CPU时间用来反映存储系统的性能
强制性不命中
第一次访问一个块的时候,该块不在Cache中,必须去下一级中调入
容量不命中
程序执行时所需的块不能全部调入Cache,当某些块被替换时又被重新访问,发生不命中
冲突不命中
组相联或者直接映像Cache中,太多块映射到同一组中,会出现该组中某个块被别的块替代然后又被重新访问的情况
相联度越高,冲突不命中就越少
强制性不命中和容量不命中不受相联度的影响
强制性不命中不受Cache容量影响,但是容量不命中却随着容量的增加而减少
优化技术 | 不命中率 | 不命中开销 | 命中时间 | 硬件复杂度 |
---|---|---|---|---|
1.增加块大小 | 改进 | 变差 | ||
2.增加Cache容量 | 改进 | |||
3.提高相联度 | 改进 | 变差 | ||
4.牺牲Cache | 改进 | |||
5.伪相联Cache | 改进 | |||
6.硬件预取指令和数据 | 改进 | |||
7.编译技术减少Cache不命中次数 | 改进 | |||
8.读不命中优先于写 | 改进 | |||
9.写缓冲归并 | 改进 | |||
10.尽早重启和关键字优先 | 改进 | |||
11.非阻塞Cache | 改进 | |||
12.两级Cache | 改进 | |||
13.小而简单的Cache | 变差 | 改进 | ||
14.对Cache进行索引不必进行地址转换 | 改进 | |||
15.流水化Cache访问 | 改进 | |||
16.踪迹Cache | 改进 | |||
17.编译器控制的预取 | 改进 |
局 部 不 命 中 率 = 该 级 C a c h e 的 不 命 中 次 数 到 达 该 级 C a c h e 的 访 问 次 数 局部不命中率 = \frac{该级Cache的不命中次数}{到达该级Cache的访问次数} 局部不命中率=到达该级Cache的访问次数该级Cache的不命中次数
全 局 不 命 中 率 = 该 级 C a c h e 的 不 命 中 次 数 C P U 发 出 的 访 存 总 次 数 全局不命中率=\frac{该级Cache的不命中次数}{CPU发出的访存总次数} 全局不命中率=CPU发出的访存总次数该级Cache的不命中次数
第二级Cache L2的全局不命中率
全 局 不 命 中 率 L 2 = 不 命 中 率 L 1 × 不 命 中 率 L 2 全局不命中率_{L2} = 不命中率_{L1} \times 不命中率_{L2} 全局不命中率L2=不命中率L1×不命中率L2
每 条 指 令 的 平 均 访 存 停 顿 时 间 = 每 条 指 令 的 平 均 不 命 中 次 数 L 1 × 命 中 时 间 L 2 + 每 条 指 令 的 平 均 不 命 中 次 数 L 2 × 不 命 中 开 销 L 2 每条指令的平均访存停顿时间= 每条指令的平均不命中次数_{L1}\times 命中时间_{L2} + 每条指令的平均不命中次数_{L2}\times 不命中开销_{L2} 每条指令的平均访存停顿时间=每条指令的平均不命中次数L1×命中时间L2+每条指令的平均不命中次数L2×不命中开销L2
反映存储外设可靠性的参数
可靠性
用MTTF,即平均无故障时间,来衡量
MTTF的倒数是系统的失效率
系统整体的失效率是各个部件失效率之和
可用性
平均修复时间MTTR
衡量系统中断服务的时间
可用性使用 M T T F M T T F + M T T R \frac{MTTF}{MTTF + MTTR} MTTF+MTTRMTTF来衡量
MTTF + MTTR 可以使平均间隔失效时间MTBF代替
可信性
无法衡量
略