文章目录
前言
通过慕课学习整理了CPU中的流水线技术,记录学习点滴。
一、流水线原理
1.指令的串行执行
a. 假设指令的执行分为2各阶段:取指令和执行指令,其中取指令由取指令部件完成,执行指令由执行指令部件完成;在这个过程中,无论是取指令还是执行指令,都有一个部件是空闲的,那么这样效率没有达到最高,所以需要优化。
2.指令的二级流水
a. 把取指和执行两个指令并行起来,提高系统的工作效率;
b. 取指令部件执行取指令1,这个时候执行部件一定是空闲的,接下来执行部件执行指令1,这个时候取指令部件是空闲的,那么执行取指令2,当执行部件执行完指令1后,执行部件空闲,接着执行指令2,依次类推。
这里采用了指令预取技术,也就是说,当前指令还没有执行完,但是下一条指令已经在取指了;
c. 如果取指和执行阶段在时间上完全重叠,那么理论上就可以把执行速度提高到原来的2倍;
3.指令的六级流水
设指令的执行分六个阶段:
(1) 取指:指令的读取;
(2) 译码:分析指令的功能;
(3) 计算操作数地址:计算操作数的地址以便后续读取;
(4) 取数;
(5) 执行:完成指令的主要功能;
(6) 写回:把运算的结果写回到寄存器中
图中横向格表示时间,纵向格表示每一条指令的执行过程,14各周期就可以执行完9条指令,且在第6个时间单位之后,每个时间单位执行完一条指令;
4.影响指令流水效率加倍的因素
(1) 执行时间>取指时间
也就是说执行会比较慢,当执行完取指命令后,执行部件迟迟没有完成它的工作,那么这样可以在取指令部件和执行指令部件之间设置一个指令缓冲区;取指令部件将源源不断取得的指令先放入指令缓冲区,等执行部件执行完后再从缓冲区获得下一条指令来执行;
(2) 条件转移指令对指令流水的影响
当执行到条件转移指令时,那么这条指令执行完会转到另一个地方去执行指令,但是在执行这条指令的过程中,后续的若干条指令已经取得,并且在流水线中已经进行到不同的阶段,但是现在要跳转了,只能将已经预取得的指令和执行到一半的指令全部扔掉,这是非常大的浪费。
5.描述流水线性能的指标
(1) 吞吐率:单位时间内流水线所完成的指令或输出结果的数量;
设有m级流水线,各段时间为Δt,那么最大吞吐率为(m=1时):
当未考虑相关问题时,连续处理n条指令的实际吞吐率为
如果n趋近于无穷大,那么Tp则为1/Δt,即为最大吞吐率。
(2) 加速比Sp:m段流水线的速度与等功能的非流水线的速度之比;
设流水线各段时间为Δt,那么完成n条指令在m段流水线上共需:
完成n条指令在等效的非流水线上共需:
那么
当n趋于无穷,Sp=m,所以当指令趋于无穷时,加速比就等于流水线级数。
(3) 效率:流水线中各功能段的利用率;
a. 时空图横坐标表示时间,纵坐标表示流水线功能段,各个功能段所处的空间位置不同;
b. 第一行的数字1表示第一条指令在第一个周期时间在流水线第一个功能段执行(假设为取指阶段),第二行的1表示第一条指令在第二个时钟周期进入流水线的第二个功能段执行…依次类推,那么时空图就表明了流水线当中若干条指令的重叠执行的情况;由于流水线有建立时间和排空时间,因此各功能段的设备不可能一直处于工作状态。
c. 时空图的左上方和右下方有一片空白区域,表明在这一段流水线的若干个段是不工作的,是排空时间,比如第一行的1上面一格,由于正在进行取指工作,那么后续的功能自然无法执行;同样在第二行的n下面有个空格,由于这是最后一条指令,后门没有指令再需要进行取指工作,所以取指部件自然不需要工作。
那么效率为:
在时空图中,就是标数字的面积除以整个面积(高度为m级流水线),长度为第一条指令执行m级流水线的时间加上n-1条指令执行时间(后n-1条指令完成只需要一个时钟周期);如果n趋于无穷大,那么效率为1。
二、流水线的相关问题
由于相近指令之间出现某种关联,使得指令流水出现停顿(后面的指令不得不等前面的指令用完再进行),影响效率;
第一条指令在第四个周期进行取数操作,同时第四个周期第四条指令要进行取指操作,无论取指还是取数都要访问内存,而内存一次只能做一件事,不能同时支持取指和取数,二者就产生了冲突;且在第五个周期,第二条指令要进行取数操作,第5条指令要进行取指操作,那么这两者又会发生冲突;在第六个周期,第一条指令要写回也需要访问内存,第三条指令要取数,第六条指令要取指,那么这三者又会产生冲突;这样使得流水线不能按照理想情况执行。
1.结构相关
指不同指令争用同一功能部件产生资源冲突;比如在上面所讲的不同指令争用内存这一部件产生的冲突。
对于这一问题的解决办法有
(1) 后续指令停顿(直接导致流水线性能下降,但是流水线本身是为了提高性能,因此这不是一个好办法);
(2) 指令存储器与数据存储器分开,采用多部件的方式(一个存储器用来存储指令,另一个存储器专门用来存储数据),这样在上面谈到的取数指令和取指指令产生的冲突就可以避免,取指指令访问指令存储器,取数指令访问数据存储器;
(3) 指令预取技术(适用于访存周期短的情况),如果某台计算机访问速度比较快,在指令执行的过程中,只要取指部件空闲,那么它就一直从内存中取指令,然后放到指令预取队列中,如果发送取指令和取数据冲突的情况,那么就要以取数据为优先,这个时候取指就暂停,由于已经有很多指令取到CPU内部了,所以即使取指暂停也不会影响到后面流水线的正常进行。
2.数据相关
指不同指令因重叠操作,可能改变操作数的读/写访问顺序,从而导致逻辑错误。数据相关分为三种类型:
(1)写后读相关(WAR)
假设现在有两条指令,第一条SUB是指把R2和R3的内容相减,把差送给R1,第二条指令是做加法,把R1和R5相加的结果送给R4,在程序顺序执行的时候,这两条指令不会有错误,但如果流水执行,就会出现问题:
a. 假设指令的执行分为五个阶段:取指,译码,取数,执行和写回,并且取数和写回都是对寄存器Ri进行操作,在第一条指令的执行过程中,我们发现他执行到第五个阶段才会执行写回的操作,也就是这时R1的值才会被更新为R2和R3的差,但是在第二条指令的执行过程中,第三个阶段就要到R1中取数了,但此时R1中的数还没有更新,还是原来的值,那么最终得到的结果也是错误的,这样的相关问题就叫写后读相关。
b. 可以采用旁路技术来解决,左边梯形部件为算术逻辑单元,其有两个入口分布连接两个寄存器,出口就是连接到目的寄存器;按照上面的描述,需要等第一条指令把结果送回到算术逻辑单元入口才能执行第二个指令,造成写后读的数据相关;通过旁路技术,不从R1取结果而是从算术逻辑单元出口处直接取第一条指令的结果;那么在执行阶段的结束时刻实际上第一条指令的差就已经到达了算术逻辑单元出口处,那么这个时候第二条指令的取数(注意只从算术逻辑单元左边入口取R5的数,右边入口等第一条指令执行阶段结束直接输入更新的R1值),那么在第二条指令的执行阶段得到的就是更新后的数值,这样就可以得到正确的结果。
(2) 当指令乱序执行时,会出现读后写相关和写后写相关问题。
3.控制相关
只有转移指令引起的相关问题。
a. 假设指令3是条件转移指令,但是它要等到指令2执行完后才知道转移地址;在指令3执行的过程中,指令4已经执行了4个阶段,指令5已经执行了3个阶段,指令6已经执行了2个阶段,指令7已经执行了1个阶段;但是执行完指令2后才发现下一条要执行的是第15条指令,接下来取第15条指令处进行取指操作,前面指令4/5/6/7已经执行的指令只能扔掉,从第15条指令开始又进行正常的流水线运行;
b. 原本第6个周期后,每个周期都可以流出一条指令,但是由于指令3是一条转移指令,就造成了第9/10/11/12个周期实际没有指令完成,直到第13个周期才有新的指令完成,这样导致流水线性能降低,这就是由控制相关引起的相关问题
c. 可以采用分支预测技术解决,比如对于100次的循环,不用管循环的内容是什么,只要知道前99次到循环的末尾都需要跳转到循环的上部继续往下走,每次循环执行到末尾,接下来预取的指令不从程序的外部取,而是预取循环上部的指令,每次都这样操作,前99次都可以猜对,第100次猜错,这样只要第100次执行的时候预取的指令会浪费,是可以接受的。
总结
简单梳理了一下流水线技术的原理、具体内容,对流水线技术有了大致的了解,这样以后关于流水线技术的问题也可以知道从哪里进行深入学习。