计算机系统层次:应用语言机、高级语言机、汇编语言机、操作系统机、传统机、微程序机
相同指令集体系结构可以有不同的组织(不同的内存系统、总线、CPU等),相同的指令集体系结构何组织在硬件实现上可以不同。
体系结构属性:指令集、I/O机制、寻址技术、数据类型的位数
体系结构在组织方面对程序员是不可见的(transparent)。
体系结构的设计考虑速度、成本、物理器件大小和功耗(power),如乘法单元(成本高、物理器件较大,但速度快)和加法单元迭代使用(相对速度低,但廉价)用以实现乘法。
摩尔定律:晶体管密度及性能每18-24个月翻一番。(已不再适用)
性能(performance)的影响因素:响应时间(response time, elapsed time)(反应快慢)、执行时间(运行快慢,评价性能的主要因素)、吞吐量(throughput)(一次性处理数据多少)
执行时间是性能的倒数。
反应时间的定义:硬盘访问、内存访问、I/O操作、系统开销(operating system overhead)所造成的延迟。
执行时间的定义:
使用程序评估性能的方法:
比较性能方法:
总体执行时间:各测试程序总的执行时间,该方法在计算机执行程序次数相同时可用。
平均执行时间: 1 n ∑ i = 1 n T i m e i \frac{1}{n}\sum^{n}_{i=1}Time_i n1∑i=1nTimei
加权执行时间:程序执行频率不同时可用。
归一化执行时间:选定参考机,进行归一化,再利用归一化后的数值进行平均,求平均数可使用算数平均数或几何平均数( ∏ i = 1 n E x e c u t i o n t i m e r a t i o n \sqrt[n]{\prod_{i=1}^{n}Execution\ time\ ratio} n∏i=1nExecution time ratio),最终:
实 际 性 能 = 归 一 化 数 × 参 考 机 性 能 实际性能=归一化数\times 参考机性能 实际性能=归一化数×参考机性能
阿姆达尔定律(Amdahl’s Law):由某些部分加速所得到的性能提高受加速部分的百分率所限。
加 速 比 = 增 强 后 的 性 能 增 强 前 的 性 能 加速比=\frac{增强后的性能}{增强前的性能} 加速比=增强前的性能增强后的性能
执 行 时 间 n e w = 执 行 时 间 o l d × ( ( 1 − 未 增 强 部 分 占 比 ) + 增 强 部 分 占 比 加 速 部 分 加 速 比 ) 执行时间_{new}=执行时间_{old}\times((1-未增强部分占比)+\frac{增强部分占比}{加速部分加速比}) 执行时间new=执行时间old×((1−未增强部分占比)+加速部分加速比增强部分占比)
总 加 速 比 = 执 行 时 间 o l d 执 行 时 间 n e w = 1 ( 1 − 未 增 强 部 分 占 比 ) + 增 强 部 分 占 比 加 速 部 分 加 速 比 总加速比=\frac{执行时间_{old}}{执行时间_{new}}=\frac{1}{(1-未增强部分占比)+\frac{增强部分占比}{加速部分加速比}} 总加速比=执行时间new执行时间old=(1−未增强部分占比)+加速部分加速比增强部分占比1
回报递归法则(the law of diminishing returns):对于一部分性能的提高,总体加速比的提高呈递减状态,即贡献越来越少、有上界。
CPU性能方程:
C P U 时 间 = 时 钟 周 期 数 ( C P U c l o c k c y c l e s ) × 时 钟 周 期 时 间 ( C l o c k c y c l e t i m e ) CPU时间=时钟周期数(CPU\ clock\ cycles)\times时钟周期时间(Clock\ cycle\ time) CPU时间=时钟周期数(CPU clock cycles)×时钟周期时间(Clock cycle time)
C P U 时 间 = C P U 时 钟 周 期 数 时 钟 频 率 ( C l o c k r a t e ) CPU时间=\frac{CPU时钟周期数}{时钟频率(Clock\ rate)} CPU时间=时钟频率(Clock rate)CPU时钟周期数
CPI:
C P I = 程 序 所 需 总 C P U 时 钟 周 期 数 指 令 数 ( I n s t r u c t i o n c o u n t , I C ) CPI=\frac{程序所需总CPU时钟周期数}{指令数(Instruction\ count, IC)} CPI=指令数(Instruction count,IC)程序所需总CPU时钟周期数
从而可推出:
C P U 时 间 = 指 令 数 × C P I × 时 钟 周 期 时 间 CPU时间=指令数\times CPI\times 时钟周期时间 CPU时间=指令数×CPI×时钟周期时间
由于改变时钟周期时间、CPI、指令数其一时,很难不改变其他部分,故有以下计算CPI方法:
C P U 周 期 数 = ∑ i = 1 n I C i × C P I i CPU周期数=\sum_{i=1}^{n}IC_i\times CPI_i CPU周期数=i=1∑nICi×CPIi
测量CPU性能的各组成部分:
C P I i = P i p i l i n e C P I i + M e m o r y s y s t e m C P I i CPI_i=Pipiline\ CPI_i+Memory\ system\ CPI_i CPIi=Pipiline CPIi+Memory system CPIi
引用局部性:程序倾向于重用刚使用过的数据和指令。
指令数据流类型:
传统顺序机器为SISD的。
向量计算机(vector computer,流水线结构的计算机)为SIMD的。
并行计算机(parallel computer)为MIMD的。
MISD的计算机仅存在于实验,尚无实际应用。
体系结构分类:
通用寄存器计算机(GPR,general-purpose register machine)优势:
GPR结构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9kInLVnf-1655391892109)(https://s1.ax1x.com/2022/06/14/X5nfSO.png)]
所有指令集都是按字节寻址(byte addressed),可访问字节(8 bits)、半字(16 bits)、字(32 bits),多数计算机也可访问双字(64 bits)。
字节排序:
**对齐(align)**问题:某些存储可能要求对齐,⚠️需要注意
寻址时可使用常数(constant)、寄存器、存储地址(有效的存储地址为有效地址(effective address))。
一个指令集体系结构最少需支持位移寻址(displacement addressing)、立即数寻址(immediate addressing)、寄存器间址(register deferred)。
指令格式构建主要使用哈夫曼编码(Huffman coding)。
每个字符平均最少所需位:
H = − ∑ i = 1 n P i ⋅ log 2 P i H=-\sum_{i=1}^{n}P_i\cdot \log_{2}{P_i} H=−i=1∑nPi⋅log2Pi
固定长度编码冗余度(redundancy):
R = 1 − − ∑ i = 1 n P i ⋅ log 2 P i ⌈ log 2 n ⌉ R=1-\frac{-\sum_{i=1}^{n}P_i\cdot \log_{2}{P_i}}{\lceil\log_{2}{n}\rceil} R=1−⌈log2n⌉−∑i=1nPi⋅log2Pi
构造哈夫曼树,从而得到前缀码(prefix )。
由于前缀码结构不整齐,故使用扩展码(extended opcodes)折中。扩展码保证了一定范围内的编码长度相同。
操作数 × {\times} ×寻址模式的组合最大时,每个操作数用寻址标识符(address specifier)。
指令集编码方式:
控制流指令:
控制流指令最常用的是PC相对(PC-relative)寻址。
条件转移选项:
条件码(CC)就是汇编里学的CF、OF、ZF,条件寄存器就是使用寄存器判断跳转,比较与分支就是直接将比较和跳转合二为一。
过程调用选项:
RISC(reduced instruction set computer,精简指令集计算机)特点:
CISC(complex instruction set computer,复杂指令集计算机)特点:
指令执行步骤:取指(instruction fetching)、译码(decoding phase)、取操作数(operand fetching phase)、执行(execution phase)、写回(write-back phase)
MIPS是RISC体系结构的一种:
⚠️MIPS使用的是大端序,需对齐
MIPS指令格式(32位指令,6位操作码):
⚠️上图中的高低位标号应该相反(31-0)。
平衡流水段长度:
非 流 水 线 机 器 上 每 条 指 令 的 所 用 时 间 流 水 段 数 量 \frac{非流水线机器上每条指令的所用时间}{流水段数量} 流水段数量非流水线机器上每条指令的所用时间
MIPS流水线的五个步骤:IF、ID、EX、MEM、WB
IF阶段:取指到指令寄存器,PC+1。
ID阶段:对指令进行解码,从寄存器中取值。
EX阶段:ALU指令(ADD之类)进行计算,LOAD-STORE指令计算地址,Branch指令计算地址。
MEM阶段:ALU指令啥也不做,LOAD指令访问数据存入LMD,STORE指令访存存入数据。
WB阶段:ALU指令写回,LOAD指令将数据写入寄存器。
时钟周期与CPI取舍:降低CPI会导致电路复杂,进而时钟周期增加。
流水线结构:
流水线的基本性能问题:
影响流水线性能的因素:
解决冒险(hazards)最简单的方法:阻塞(stall)
加 速 比 = 未 流 水 化 C P I 或 流 水 线 段 数 1 + 流 水 线 阻 塞 周 期 加速比=\frac{未流水化CPI或流水线段数}{1+流水线阻塞周期} 加速比=1+流水线阻塞周期未流水化CPI或流水线段数
结构冒险(structural hazards):
通过加入硬件结构,可以解决数据冒险:
数据冒险:使用前送(forwarding)解决数据冒险。特别需要注意的是,在同一阶段使用同一寄存器,也可能产生前送 。前送可以是相同时间,前送可以先获得数据旧数据,后续比较进行更新。
由于某些冲突过于频繁,故可以通过调度来解决冲突。
发射(instruction issue):ID→EX,对于MIPS整数流水线,所有冒险都能在ID阶段检测出来。
解决LOAD指令的RAW:
堵塞的实现:ID/EX流水线寄存器的控制部分(control portion)全部置零,做空操作(no-op);IF/ID寄存器内容循环(recirculate),保持停顿。
控制冒险可能比数据冒险造成的性能损失更大(great performance loss)。
最简单的方法:直接阻塞,知道到达MEM计算出新的PC
MIPS中将转移测试移动到了ID阶段(增加了额外的加法器和零测试),并且在IF阶段写PC,ID阶段计算出目标地址。从而转移在ID结束后就完成,未使用EX、MEM、WB。
降低转移造成的惩罚:
浮点操作会占用多个周期,需要充分很多次EX。
潜伏期(latency):从产生结果(假定在EX阶段第一周期产生结果)到使用结果之间的周期数。
初始/重复间隔(initiation/repeat interval):发射两个给定类型操作之间必须经过的周期数。
潜伏期和初始间隔:
其中,除法未完全流水化。其他则在EX中进行流水化。
长延迟流水线(Longer Latency Pipelines)的冒险和前送:
EX阶段多种操作单元可以并行进行。
写寄存器冲突:可增加端口,从而解决结构冲突。
解决结构冲突的途径:
解决WAW途径:
检测所有可能的冲突:在ID阶段做三个检测
解决冲突的途径:
具体操作如下图:
使用基本转移预测(Basic Branch Prediction)和转移预测缓冲器(Branch Prediction Buffers)。
基本转移预测:
转移目标缓冲器(Branch-Target Buffers):存储所预测的转移后的下条地址。
转移预测缓冲器和转移目标缓冲器的区别:
图中,命中但预测错误、未命中但预测正确都要更新缓冲器并且重新取指,需消耗2个周期。
超标量处理器(superscalar processors):
超长指令字处理器(VLIW processors)
局部性原理(principle of locality):程序在任意时刻都是访问地址空间的一小部分。
存储器层次理论基础是局部性原理。
存储器:
当命中率足够大,则访问时间接近最高层,大小接近最底层。
cache中寻找/储存数据的方法:
此处的块位数其实就是块内偏移,由于机器是32位机,有4 Bytes,所以2位。
cache缺失问题解决:阻塞CPU,冻结所有寄存器中的内容;从存储器中取出数据放入cache;重新在导致缺失的地方进行执行。
对cache进行写操作时,可能遇见写缺失(write miss),仅需将数据写入cache并更新cache和数据。在写入cache时,可能需要将数据送回到内存:
若要利用局部性原理,则cache可以使用类似组相联的结构,但其区别是该cache中同一行的数据必须同时写入。
⚠️减小CPI和提高时钟频率是不一样的,减小CPI是减小的指令执行的周期数,提高时钟频率是降低一个周期的时间。
直接映像:一个块对应cache中一个位置;
全相联:一个块对应cache(只有一行)中一行中的任意位置;
组相联:一个块对应cache中某一行中的任意位置。
C a c h e 大 小 = 组 数 × 相 连 性 Cache大小=组数\times 相连性 Cache大小=组数×相连性
多级Cache中初级专注于命中时间,二级专注于命中率
虚拟存储器和Cache类似,只不过Cache中存储的是数据,但是虚拟存储器中存储的是部分物理地址。
虚拟页可能在外存中,导致会发生缺页。
页表采用全相联。
页最开始存储在磁盘中,由OS决定所要的页存储在主存储器哪里。然后访问页时,页在内存中。
页表还有对应的TLB(快表)。
TLB采用随机替换策略,全相联。
不可能出现TLB命中,页表中缺失的情况。
每个进程都有自己的虚拟空间。
降低缺失率的技术:
LRU可以采用硬件(移位寄存器)实现,或近似实现,甚至随机替换。
虚拟存储器只有回写是现实的,因为从内存想磁盘写数据用时太长。
3C模型:理解存储层次行为的直觉模型