本文仅供学习使用,严禁转载。本文参考资料来自中国科学院大学计算机体系结构课程PPT,以及计算机体系结构量化研究方法(第6版)
本文主要对计算机组成原理做一个简要的复习,方便后续深入整个计算机体系结构。
Processor (CPU): 执行指令集架构中的指令。
处理器内部的数据通路和控制设计将对时钟周期(clock cycle time)和每条指令所花的时钟数(clock cycles per instruction/CPI) 产生影响。
CPUTime = InstructionCount × CPI × Cycle Time (ET = IC × CPI × Cycle Time)
CPU的执行时间表示成指令数乘以每条指令所花的时间
指令数目(InstructionCount/IC)由编译器和ISA决定
时钟周期(Cycle Time)和CPI主要由CPU的设计与实现决定
设计一个处理器的五个步骤:
MIPS:无内部互锁流水级的微处理器(Microprocessor without Interlocked Piped Stages)
具体关于MIPS的ISA可以点击传送门:MIPS指令集架构(需要魔法访问)
MIPS的特点:
我们先了解如何实现仅包含以下指令的简化 MIPS CPU
下面列出几个典型的指令
2. SW:将寄存器堆里的一个数存到存储器中。
3. ADD:将两个存储在寄存器堆的数相加,结果存到寄存器堆。
示例: add rd, rs, rt
R[rd] <- R[rs] op R[rt]
通过rs和rt这两个地址索引从寄存器堆中获取要相加的数,将相加的结果送回rd所指向的寄存器堆中的地址。
示例: lw rt, rs, imm16
R[rt] <- Mem[R[rs] + SignExt[imm16]]
示例:sw rt, rs, imm16
Mem[R[rs] + SignExt[imm16]] <- R[rt]
注意,Load和Store操作的立即数都是往存储器地址上加的
示例: beq rs, rt, imm16
Z <- (rs == rt); if Z, PC = PC+4+imm; else PC = PC+4
注意这是单周期处理器,数据通路里面不包含寄存器,所有的指令都在一个时钟周期内完成。
下图是支持9条指令的单周期处理器 (add, sub, and, or, slt, lw, sw, beq, j)
这张图要能画出来
ISA确定后,进行处理器设计的大致步骤
第一步:分析每条指令的功能,并用RTL(Register Transfer Language)
来表示
第二步:根据指令的功能给出所需的元件,考虑时钟方案
第三步:将数据通路互连
第四步:确定每个元件所需控制信号的取值。汇总所有指令所涉及到的
控制信号,生成一张反映指令与控制信号之间关系的表
第五步:根据表得到每个控制信号的逻辑表达式,据此设计控制器电路
相较于单周期的好处:
• 每条指令分成多个阶段,每个阶段在一个时钟内完成
• 不同指令包含的时钟个数不同
• 阶段的划分要均衡,每个阶段只能完成一个独立、简单的功能,如:
一次ALU操作
一次存储器访问
一次寄存器存取
• 需加临时寄存器存放指令执行的中间结果
• 同一个功能部件能在不同的时钟中被重复使用
• 可用有限状态机来表示指令执行流程,并以此设计控制
°程序执行过程中CPU会遇到一些特殊情况,使正在执行的程序被“打断”
• 此时,CPU中止原来正在执行的程序,转到处理异常情况或特殊事件的程序去执行,执行后再返回到原被中止的程序处(断点)继续执行
° 程序执行被 “打断” 的事件有两类
• 内部“异常”:在CPU内部发生的意外事件或特殊事件
按发生原因分为硬故障中断和程序性中断两类
硬故障中断:如电源掉电、硬件线路故障等
程序性中断:执行某条指令时发生的“例外”,如算术溢出、缺页、越界、越权、非法指令、除数为0、堆栈溢出、访问超时、断点设置、单步、系统调用等
• 外部“中断”:在CPU外部发生的特殊事件
通过“中断请求”信号向CPU请求处理。如实时钟、控制台、打印机缺纸、外设准备好、采样计时到、DMA传输结束等
° 通常,异常指控制流中任何意外改变,中断特指来自外部事件
° 中断处理(Interrupt handling,或称中断服务程序)用来处理异常和中断
° CPU周而复始执行指令
• 执行指令过程中,若发现异常,则立即转异常处理(或作出检测标记,记录原因,并到指令最后阶段再处理)
• 每个指令结束,查询有没有中断请求,有则响应中
在实现一个应用程序的并行化时,理想加速比应当等于处理器的个数。但它受到两个因素的限制:可并行化的应用程序百分比和通信成本。Amdahl 定律考虑了前者,但没有考虑后者。
解:
Amdahl定律 S p e e d _ u p = o r i g i n _ t i m e o p t i m a l _ t i m e = t t × s + t × p n = 1 s + p n Speed\_up=\frac{origin\_time}{optimal\_time}=\frac{t}{t\times s+\frac{t\times p}n}=\frac{1}{s+\frac{p}n} Speed_up=optimal_timeorigin_time=t×s+nt×pt=s+np1,其中s表示只能串行的比例,p表示并行的比例,n表示处理器个数。
修改版Amdal定律: S p e e d _ u p = o r i g i n _ t i m e o p t i m a l _ t i m e + c o m m u n i c a t i o n _ t i m e = t t × s + t × p n + t ′ = 1 s + p n + t ′ Speed\_up=\frac{origin\_time}{optimal\_time+communication\_time}=\frac{t}{t\times s+\frac{t\times p}{n}+t'}=\frac{1}{s+\frac{p}{n}+t'} Speed_up=optimal_time+communication_timeorigin_time=t×s+nt×p+t′t=s+np+t′1,公式中的 t ′ t' t′表示通信所用时间。
a. S p e e d _ u p = 1 0.8 + 0.2 N \begin{aligned}Speed\_up=\frac{1}{0.8+\frac{0.2}{N}}\end{aligned} Speed_up=0.8+N0.21
b. S p e e d _ u p = 1 0.8 + 0.2 8 + 8 × 0.005 Speed\_up=\frac{1}{0.8+\frac{0.2}8+8\times0.005} Speed_up=0.8+80.2+8×0.0051
c. S p e e d _ u p = 1 0.8 + 0.2 8 + ( log 2 8 ) × 0.005 Speed\_up=\frac{1}{0.8+\frac{0.2}{8}+(\log_{2}8)\times0.005} Speed_up=0.8+80.2+(log28)×0.0051
d. S p e e d _ u p = 1 0.8 + 0.2 N + ( log 2 N ) × 0.005 Speed\_up=\frac{1}{0.8+\frac{0.2}{N}+(\log_{2}N)\times0.005} Speed_up=0.8+N0.2+(log2N)×0.0051
e. S p e e d _ u p = 1 ( l − P % ) + P % N + ( log 2 N ) × 0.005 Speed\_up=\frac{1}{(l-P\%)+\frac{P\%}N+(\log_2N)\times0.005} Speed_up=(l−P%)+NP%+(log2N)×0.0051,对此式求导令其等于0得最大值 N = 2 P l n 2 N=2Pln2 N=2Pln2
我们首先考虑一个采用单周期实现的计算机。在按功能分制流水级时,这些流水级需要的时间不一定相同。原机器的时钟周期时间为 7 ns。在流水线被分之后,测得的时间数据为:IF,1ns; ID,1.5s; EX,1ns; MEM,2ns; WB,1.5ns。流水线寄存器延迟为0.1ns。
a.5 级流水化机器的时钟周期时间为多少?
b.如果每4条指令有一次停顿,则新机器的 CPI为多少?
c.流水化机器相对于单周期机器的加速比为多少?
d.如果流水化机器有无限个流水级,那它相对于单周期机器的加速比为多少?
解:
我们假定流水线的CPI=1.
a. 找最大延迟时间的阶段为MEM,所以周期为2+0.1=2.1ns。
b.CPI为每条指令平均所花费的时钟周期数。这道题我们假设流水线已经流起来了,也即每个周期都能执行一条指令。所以 C P I = 5 4 = 1.25 CPI=\frac{5}{4}=1.25 CPI=45=1.25
c. S p e e d _ u p = ( I C × C P I × c y c l e _ t i m e ) s i n g l e ( I C × C P I × c y c l e _ t i m e ) m u l i i = 7 1.25 × 2.1 = 2.67 Speed\_up=\frac{(IC\times CPI\times cycle\_time)_{single}}{(IC\times CPI\times cycle\_time)_{mulii}}=\frac{7}{1.25\times2.1}=2.67 Speed_up=(IC×CPI×cycle_time)mulii(IC×CPI×cycle_time)single=1.25×2.17=2.67
d. S p e e d _ u p = ( I C × C P I × c y c l e _ t i m e ) s i n g l e ( I C × C P I × c y c l e _ t i m e ) m u l t i = 7 0.1 = 70 Speed\_up=\frac{(IC\times CPI\times cycle\_time)_{single}}{(IC\times CPI\times cycle\_time)_{multi}}=\frac7{0.1}=70 Speed_up=(IC×CPI×cycle_time)multi(IC×CPI×cycle_time)single=0.17=70
以上就是本篇博文,下一篇我们来讲复杂CPU流水线与乱序执行