👉个人主页:highman110
👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容
目录
参考资料
前言
流水线
提高流水线效率的技术
超级流水线
超标量
分支预测
乱序执行
参考资料
(21条消息) 流水线、超流水线、超标量(superscalar)技术对比(转)_沉迷科研刘昊然的博客-CSDN博客
图解|30张图,带你深入理解CPU流水线和分支预测的那些事儿 - 知乎 (zhihu.com)
计算机体系结构基础(第3版)-胡伟武等-微信读书 (qq.com)
前言
我们从某CPU官网可以看到某芯片的简介:
上图中的乱序四发射超标量流水线是什么意思呢?这些都是CPU指令执行中的名词,本文一次性讲清楚。
流水线
流水线这个词相信大家都不陌生了,很好理解,把一个耗时较长的操作,分成一段一段的小操作,两个不同大操作下的小操作可以并行执行,这样就比一个完整操作执行完再做下一个操作的耗时更小,操作效率更高。比如说,把洗车分成喷水、打泡沫、刷洗、擦拭、吹干几个工站,在第一辆车喷完水进入打泡沫的工站后,下一辆车就可以进来喷水了,而不用等前一辆全部洗完再进来,这样效率大大提升,赚钱更多了。
计算机执行指令一般包含以下过程:从存储器取指令并对取回的指令进行译码,从存储器或寄存器读取指令执行需要的操作数,执行指令,把执行结果写回存储器或寄存器。上述过程称为一个指令周期。计算机不断重复指令周期直到完成程序的执行。以上指令执行的各个小步骤就是流水线操作,常规的5级流水线如下:
1、取指令IF
取指令(Instruction Fetch,IF)阶段是将一条指令从主存中取到指令寄存器的过程。
2、指令译码ID
取出指令后,计算机立即进入指令译码(Instruction Decode,ID)阶段。
在指令译码阶段,指令译码器按照预定的指令格式,对取回的指令进行拆分和解释,识别区分出不同的指令类别以及各种获取操作数的方法。
3、指令执行EX
在取指令和指令译码阶段之后,接着进入执行指令(Execute,EX)阶段。
此阶段的任务是完成指令所规定的各种操作,具体实现指令的功能。为此,CPU的不同部分被连接起来,以执行所需的操作。
4、访存取数阶段MEM
根据指令需要,有可能要访问主存读取操作数,这样就进入了访存取数(Memory,MEM)阶段,此阶段的任务是:根据指令地址码,得到操作数在主存中的地址,并从主存中读取该操作数用于运算。
5、结果回写WB
作为最后一个阶段,结果写回(Writeback,WB)阶段把执行指令阶段的运行结果数据写回到某种存储形式。
为了提升效率,通过流水线操作将顺序执行的指令操作并行起来执行,如下图:
总结起来CPU流水线技术就是一种将指令分解为多步,并让不同指令的各步操作重叠,从而实现几条指令并行处理,以加速程序运行过程的技术。指令的每步有各自独立的电路来处理,每完成一步,就进到下一步,而前一步则处理后续指令,属于CPU硬件电路层面的并发。
总结起来CPU流水线技术就是一种将指令分解为多步,并让不同指令的各步操作重叠,从而实现几条指令并行处理,以加速程序运行过程的技术。指令的每步有各自独立的电路来处理,每完成一步,就进到下一步,而前一步则处理后续指令,属于CPU硬件电路层面的并发。
提高流水线效率的技术
在标准流水线基础上,还想再继续提高操作效率该怎么办呢?
常见的提高流水线效率的技术包括超级流水线、转移预测技术、乱序执行技术、超标量(又称为多发射)技术等,技术很多,这里只是简单介绍,后面争取专门写几篇文章。
超级流水线
超级流水线以增加流水线级数的方法来缩短机器周期,相同的时间内超级流水线执行了更多的机器指令。采用简单指令以加快执行速度是所有流水线的共同特点,但超级流水线配置了多个功能部件和指令译码电路,采用多条流水线并行处理,还有多个寄存器端口和总线,可以同时执行多个操作,因此比普通流水线执行的更快,在一个机器周期内可以流出多条指令。
一般而言,CPU执行一条指令需要经过以下阶段:取指->译码->地址生成->取操作数->执行->写回,每个阶段都要消耗一个时钟周期,同时每个阶段的计算结果在周期结束以前都要发送到阶段之间的锁存器上,以供下一个阶段使用。所以,每个时钟周期所消耗的时间就是由以上几个阶段中的耗时最长的那个决定的。假设耗时最长的阶段耗时为s秒,那么时钟频率就只能设计到1/s赫兹(这里不考虑阶段间信号传递的时间和锁存器的反应时间)。
那么,要提高时钟频率,一种可能的方法就是减小每个阶段的时间消耗。其中一种最简单的办法,就是将每个阶段再进行细分成更小的步骤,同样是细分后的每个阶段,单个阶段的运算量小了,单位耗时s也就减少,这样实际上就是提高了时钟频率。这种将标准流水线细分的技术,就是超级流水线技术。当然,流水线和超级流 水线之间并没有很明显的区别。这样的技术,虽然提高了CPU的主频,但是也带来了很大的副作用:
首先,假设不使用流水线情况下,某指令的执行时间为s,指令执行结果保存在寄存器中的时间为d,将其改为N级流水线,由于细分后的每一个阶段都要在其后使用寄存器保存结果,因此将一个阶段细分为N个子阶段并不能让单位时间减少到s/N, 而是s/N + d, 其中d为寄存器的保存结果时间。这实际上就是增加了多余的时间消耗。
其次,随着流水线级数的加深,一旦分支预测出现错误,会导致CPU中大量的指令作废,这样的消耗是十分巨大的。
以上原因,也就是什么Pentium IV具有31级的流水线,指令的执行效率却赶不上只有14级流水线的Pentium M,高流水线级数的处理器是追求更高的主频,以获取更高的吞吐率和性能,而低流水线级数的处理器的功耗更低,提高能效比。
超标量
超标量技术。初看的时候容易把超标量和超级流水线搞混。工艺技术的发展使得在20世纪80年代后期出现了超标量处理器。超标量结构允许指令流水线的每一阶段同时处理多条指令,换句话说,可以理解为同时有多条流水线在处理指令。其实质是以空间换取时间。而超流水线是通过细化流水、提高主频,使得在一个机器周期内完成一个甚至多个操作,其实质是以时间换取空间。类似上文提到的5级单流水线被称为标量流水技术,而CPU中有多条并行执行的流水线技术称为超标量流水技术。举个简单的例子,一个洗车店,如果喷水、打泡沫、刷洗、擦拭、吹干这几个工站都是只有一个,那就是标量流水,如果这些工站都各有一个以上,那就是超标量流水。
在单流水线结构中,指令虽然能够重叠执行,但仍然是顺序的,每个周期只能发射(issue)或退休(retire)一条指令。超级标量结构的cpu支持指令级并行,每个周期可以发射多条指令(2-4条居多,文章开头列的某CPU简介中的4发射指的就是每个周期可以发射4条指令),从而提高cpu处理速度。超级标量机能同时对若干条指令进行译码,将可以并行执行的指令送往不同的执行部件,在程序运行期间,由硬件(通常是状态记录部件和调度部件)来完成指令调度。超级标量机主要是借助硬件资源重复(例如有两套译码器、ALU、访存部件等)来实现空间的并行操作。
分支预测
转移预测技术,又叫分支预测。先解释一下为什么要做分支预测。假设有如下一段程序要执行:
int a = 某输入值;
int b = 某输入值;
if(a>3)
int c = b + a;
else
int c = b - a;
上面涉及到条件判断带来的转移,上面的各条语句虽然名义上是顺序执行,但是CPU是流水线执行指令操作的,一些步骤是并行走,同时某些步骤之间有先后依赖关系,加上条件的判断,就会发生指令的转移,一旦发生指令转移,就要排空后面的流水线,且要从转移的目标地址重新取指令,这就是转移开销。
转移指令或分支指令会打断流水线中指令的处理,因为处理器无法确定该指令的下一条指令,直到分支执行完毕。流水线越长,处理器等待的时间便越长,因为它必须等待分支指令处理完毕,才能确定下一条进入流水线的指令。这显然也流水线处理的初衷是相悖的,为了解决这一问题,就需要分支预测技术。
冯·诺依曼结构指令驱动执行的特点,使转移指令成为提高流水线效率的瓶颈。典型应用程序平均每5~10条指令中就有一条转移指令,而转移指令的后续指令需要等待转移指令执行结果确定后才能取指,导致转移指令和后续指令之间不能重叠执行,降低了流水线效率。随着主频的提高,现代处理器流水线普遍在10~20级之间,由于转移指令引起的流水线阻塞成为提高指令流水线效率的重要瓶颈。
转移预测技术可以消除转移指令引起的指令流水线阻塞。转移预测器根据当前转移指令或其他转移指令的历史行为,在转移指令的取指或译码阶段预测该转移指令的跳转方向和目标地址并进行后续指令的取指。转移指令执行后,根据已经确定的跳转方向和目标地址对预测结果进行修正。如果发生转移预测错误,还需要取消指令流水线中的后续指令。为了提高预测精度并降低预测错误时的流水线开销,现代高性能处理器采用了复杂的转移预测器。
例如,可以在取指部件中设置一位标志记录上一条转移指令的跳转方向,碰到转移指令,不用等该转移指令执行结果,就根据该标志猜测跳转方向进行取指。对于C语言中的“for(i=0,i<N,i++)”类的循环,这种简单的转移猜测就可以达到(N-1)/(N+1)的准确度,当N很大时准确度很高。
乱序执行
乱序执行技术。如果指令i是条长延迟指令,如除法指令或Cache不命中的访存指令,那么在顺序指令流水线中指令i后面的指令需要在流水线中等待很长时间。乱序执行技术通过指令动态调度允许指令i后面的源操作数准备好的指令越过指令i执行(需要使用指令i的运算结果的指令由于源操作数没有准备好,不会越过指令i执行),以提高指令流水线效率。为此,在指令译码之后的读寄存器阶段,应判断指令需要的操作数是否准备好。如果操作数已经准备好,就进入执行阶段;如果操作数没有准备好,就进入称为保留站或者发射队列的队列中等待,直到操作数准备好后再进入执行阶段。为了保证执行结果符合程序规定的要求,乱序执行的指令需要有序结束。为此,执行完的指令均进入一个称为重排序缓冲(Re-Order Buffer,简称ROB)的队列,并把执行结果临时写入重命名寄存器。ROB根据指令进入流水线的次序,有序提交指令的执行结果到目标寄存器或存储器。CDC6600和IBM 360/91分别使用记分板和保留站最早实现了指令的动态调度。文章来源:https://www.toymoban.com/news/detail-771675.html
就像保留站和重排序缓冲用来临时存储指令以使指令在流水线中流动更加通畅,重命名寄存器用来临时存储数据以使数据在流水线流动更加通畅。保留站、重排序缓冲、重命名寄存器都是微结构中的数据结构,程序员无法用指令来访问,是结构设计人员为了提高流水线效率而用来临时存储指令和数据的。其中,保留站把指令从有序变为无序以提高执行效率,重排序缓存把指令从无序重新变为有序以保证正确性,重命名寄存器则在乱序执行过程中临时存储数据。重命名寄存器与指令可以访问的结构寄存器(如通用寄存器、浮点寄存器)相对应。乱序执行流水线把指令执行结果写入重命名寄存器而不是结构寄存器,以避免破坏结构寄存器的内容,到顺序提交阶段再把重命名寄存器内容写入结构寄存器。两组执行不同运算但使用同一结构寄存器的指令可以使用不同的重命名寄存器,从而避免该结构寄存器成为串行化瓶颈,实现并行执行。文章来源地址https://www.toymoban.com/news/detail-771675.html
到了这里,关于【计算机体系结构】什么是流水线?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!