您的位置 首页 发布

关于处理器流水线,此流水线非彼流水线

本文将讨论处理器的一个重要的基础知识:“流水线”。熟悉计算机体系结构的读者一定知道,言及处理器微架构,几乎必谈其流水线。处理器的流水线结构是处理器微架构最基本的一个要素,犹如汽车底盘对于汽车一般具

  本文将评论处理器的一个重要的基础知识:“流水线”。了解核算机体系结构的读者必定知道,言及处理器微架构,简直必谈其流水线处理器流水线结构是处理器微架构最基本的一个要素,犹如轿车底盘关于轿车一般具有柱石性的作用,它承载并决议了处理器其他微架构的细节。本文将扼要介绍处理器的一些常见流水线结构,让您实在读懂处理器流水线。

  1 从经典的五级流水线说起

  流水线的概念来源于工业制作范畴,以轿车安装为例来解说流水线的工作办法,假定安装一辆轿车需求四个进程:

  第一步冲压:制作车身外壳和底盘等部件。

  第二步焊接:将冲压成形后的各部件焊接成车身。

  第三步涂装:将车身等首要部件清洗、化学处理、打磨、喷漆和烘干。

  第四步总装:将各部件(包含发动机和向外收购的零部件)组装成车。

  轿车安装则一起对应需求冲压、焊接、涂装和总装四个工人。最简略的办法是一辆轿车顺次经过上述四个进程安装完结之后,下一辆轿车才开端进行安装,最前期的工业制作就是选用的这种原始的办法,即同一时刻只要一辆轿车在安装。不久之后人们发现,某个时段中一辆轿车在进行安装时,其它三个工人都处于搁置状况,显着这是对资源的极大糟蹋,所以思考出能有用运用资源的新办法,即在第一辆轿车经过冲压进入焊接工序的时分,立刻开端进行第二辆轿车的冲压,而不是比及第一辆轿车经过悉数四个工序后才开端,这样在后续出产中就能够确保四个工人一向处于运转状况,不会形成人员的搁置。这样的出产办法就恰似流水络绎不绝,因而被称为流水线。

  核算机体系结构教材中被提及最多的经典MIPS五级流水线如图1所示。在此流水线中一条指令的生命周期分为:

  取指:

  指令取指(Instruction Fetch)是指将指令从存储器中读取出来的进程。

  译码:

  指令译码(Instruction Decode)是指将存储器中取出的指令进行翻译的进程。经过译码之后得到指令需求的操作数寄存器索引,能够运用此索引从通用寄存器组(Register File,Regfile)中将操作数读出。

  履行:

  指令译码之后所需求进行的核算类型都已得知,并且现已从通用寄存器组中读取出了所需的操作数,那么接下来便进行指令履行(Instruction Execute)。指令履行是指对指令进行实在运算的进程。比如,假如指令是一条加法运算指令,则对操作数进行加法操作;假如是减法运算指令,则进行减法操作。

  在“履行”阶段的最常见部件为算术逻辑部件运算器(Arithmetic Logical Unit,ALU),作为施行详细运算的硬件功用单元。

  访存:

  存储器拜访指令往往是指令集中最重要的指令类型之一,访存(Memory Access)是指存储器拜访指令将数据从存储器中读出,或许写入存储器的进程。

  写回:

  写回(Write-Back)是指将指令履行的成果写回通用寄存器组的进程。假如是一般运算指令,该成果值来自于“履行”阶段核算的成果;假如是存储器读指令,该成果来自于“访存”阶段从存储器中读取出来的数据。

  在工业制作中选用流水线能够进步单位时刻的出产量,相同在处理器中选用流水线规划也有助于进步处理器的功用。以上述的五级流水线为例,因为前一条指令在完结了“取指”进入“译码”阶段后,下一条指令立刻就能够进入“取指”阶段,顺次类推,如图2所示,假如流水线没有中止,理论上能够获得每个时钟周期都完结一条指令的功用。

  图1 MIPS五级流水线结构图

  图2 MIPS五级流水线运转图

  2 可不能够不要流水线——流水线和状况机的联系

  言及处理器微架构,简直必谈流水线。那么,咱们能否应战一下威望提出一个有意思的问题:处理器莫非就必定需求流水线吗?可否不要流水线呢?

  在答复这个问题之前,咱们先评论下贱水线的实质:

  流水线并不限于处理器规划,在一切的ASIC电路完结中都广泛选用流水线的思维。流水线实质上能够理解为是一种以面积换功用(Trade Area for Performance)、以空间换时刻(Trade Space for Timing)的手法。

  比如,以5级流水线为例,其增加了5组寄存器,每一个流水线级数内部都有各自的组合逻辑数据通路,彼此之间没有复用资源,因而,其面积开支是比较大的,可是因为能够让不同的流水线级数一起做不同的工作,而到达流水的作用,进步了功用,优化了时序,增加了吞吐率。

  与流水线相对应的别的一种战略是状况机,状况机是流水线的“取反”,相同在一切的ASIC电路完结中都广泛选用。状况机实质上能够理解为是一种以功用换面积(Trade Performance for Area)、以时刻换空间(Trade Timing for Space)的手法。

  “流水线”和“状况机”的联系,还有一种说法称之为“打开”和“折叠”的联系。实质上都是一种电路规划时,挑选偏重时刻(功用)仍是空间(面积)的一种取舍。

  经过上述剖析,假定处理器不选用流水线,而是运用一个状况机来完结,则需求多个时钟周期才干完结一条指令的一切操作,每个时钟周期完结状况机的一个状况(比如分别为取指、译码、履行、访存和写回)。经过运用状况机,能够省掉上述流水线中的寄存器开支,还能够复用组合逻辑数据通路,因而面积开支比较小,可是每条指令都需求5个周期才干完结,吞吐率和功用很差。

  谈及此处,就不得不提及8位单片机年代的传奇老炮儿8051内核,前期原始的8051内核微架构就是选用了相似状况机的完结办法而不是流水线。因而,回到最开端咱们提出的问题,处理器可否不要流水线,答案是:当然能够,传奇老炮儿8051内核就没有流水线。

  所以说从功用能上来讲,处理器完全能够不运用流水线,而运用状况机的办法来完结,只不过因为这种办法功用比较差,在现代处理器规划中比较稀有罢了。

  3 深处种菱浅种稻,不深不浅种荷花——流水线的深度

  流水线的级数(又称深度)多少最好呢?要答复这个问题,就需求了解流水线的深浅各自的好坏。此处有一个常见面试题,标题就是:处理器的流水线是否越深越好?在此咱们给出答案:

  前期的经典流水线是5级流水线,分别为取指、译码、履行、访存和写回。现代的处理器往往具有极深的流水线级数,比如高达十几级,或许二十几级的深度。流水线就像一根黄瓜,切五刀下去得到的每一截长度和切二十到下去得到的每一截长度肯定是不一样的。当流水线的级数越多,那么意味着流水线被切的很细,每一级流水线内包容的硬件逻辑便越少,了解数字同步电路规划的读者应该比较了解,在两级寄存器(每一级流水线由寄存器组成)之间的硬件逻辑越少,则意味能够运转到更高的主频。因而现代的处理器流水线极深首要是因为处理器寻求高频的目标所唆使,高端的ARM Cortex-A系列因为有十几级的流水线,所以能够运转到高达2GHz的主频,而Intel的x86处理器乃至选用几十级的流水线深度将主频推到3-4GHz的高度。主频越高也意味着流水线的吞吐率越高然后功用越高,这是流水线加深的正面含义。

  因为每一级流水线都由寄存器组成,那么意味着更多的流水线级数要耗费更多的寄存器,也意味着更多的面积开支。这是流水线加深的负面含义。

  一起流水线越深,因为每一级流水线需求进行握手,流水线最终一级的反压信号可能会一向串扰到最前一级形成严峻的时序问题,需求运用一些比较高档的技巧来处理此类反压时序问题。这是流水线加深的负面含义。

  较深的处理器流水线还有一个问题,因为在流水线的取指令阶段无法得知条件跳转的成果是跳仍是不跳,因而只能进行猜测,而到了流水线的结尾才干够经过实践的运算得知该分支是真的该跳仍是不应跳,假如发现实在的成果(比如该跳)与之前猜测的成果(比如猜测为不跳)不相符,则意味着猜测失利,需求将一切预取的过错指令流悉数丢掉掉,而从头取正确的指令流,这个进程叫做流水线冲刷(Pipeline Flush),尽管能够运用分支猜测器来确保前期的分支猜测尽可能的精确,可是也无法做到满有把握。那么,流水线的深度越深,则意味着现已预取了许多的过错指令流,需求将其悉数扔掉然后重启,不只白白的糟蹋了功耗,还形成了功用的丢掉。流水线越深则意味着糟蹋和丢掉越严峻,流水线越浅则糟蹋和丢掉越少。这是流水线加深的另一个首要的负面含义。

  综上,所谓深处种菱浅种稻,不深不浅种荷花,流水线的不同深度皆有其优缺点,需求依据不同的运用布景合理地进行挑选。

  因为处理器流水线深浅的不同好坏,依据不同的运用场景,当今处理器的流水线深度在向着两个不同的极点开展,一方面级数越来越深,另一方面又越来越浅,下面咱们结合不同的商用处理器比如予以评论。

  4 向上成长——越来越深的流水线

  现代的高功用处理器比较最前期的处理器显着存在着流水线越来越深的现象,其驱动要素很简略,那就是寻求更高的主频以获取更高的吞吐率和功用。

  以最闻名的ARM Cortex-A系列处理器IP为例,Cortex-A7主打的低功耗前提下的能效比,其流水线级数为8级;而Cortex-A15主打高功用,其流水线深度为15级。

  当然流水线越来越深也需有其极限,曾有某些商业处理器产品一味地寻求极点流水线深度(到达几十级)反而遭受失利的比如。现在最新的Intel处理器和ARM 高功用Cortex-A系列处理器的流水线深度都在十几级的规模左右。

  5 向下成长——越来越浅的流水线

  现代低功耗处理器的别的一个趋势也存在着流水线越来越浅的现象,其驱动要素相同很简略,那就是在功用够用的前提下寻求极低的功耗。

  以最闻名的ARM Cortex-M系列处理器IP为例,2004年发布的Cortex-M3处理器核的流水线级数只要3级,2009年发布的Cortex-M0处理器核的流水线级数也只要3级,而2012年发布的Cortex-M0+处理器核的流水线级数反而只要2级,变得越来越少了,正因为此ARM也宣扬Cortex-M0+处理器核为世界上能效比最高的处理器核。

  2级的流水线深度好像现已浅究竟了,读者可能会问,那是不是接下来要发布只要1级深度的流水线了?当深度变为1之后也就谈不上流水线了,其全体也就变成一个单周期的组合逻辑了,在许多的核算机体系结构教育事例中咱们的确见到过许多流水线深度为1的处理器核,从功用上来说其依然能够完结处理器的一切功用,只不过主频适当之低罢了。

  6 处理器流水线中的反压

  跟着流水线越深,因为每一级流水线都需求进行握手,流水线最终一级的反压信号可能会一向串扰到最前一级形成严峻的反压(Back-pressure)时序问题,需求运用一些比较高档的技巧来处理这些时序问题。在现代处理器规划中,一般有如下若干种办法:

  撤销握手:此办法能够完全根绝反压的发生,时序体现十分好。可是撤销握手即意味着流水线中的每一级并不会与其下一级进行握手,因而可能会形成功用过错或许指令丢掉。因而这种办法往往需求合作其他的机制,比如重履行(Replay),预留大缓存等等。简而言之,此办法比较急进,辅以一系列其他的装备机制,硬件整体的复杂度会比较大。只要在一些十分高档的处理器规划中才会用到。

  参加乒乓缓存:参加乒乓缓存(Ping-pong Buffer)是一种用面积换时序的办法,也是处理反压最简略的办法。经过运用乒乓缓存(有两个表项)替换一般的一级流水线(只要一个表项),能够使得此级流水线向上一级流水线的握手承受信号只是需求重视乒乓缓存中是否有一个以上有空的表项即可,而无需将下一级的握手承受信号串扰至上一级。

  参加前向旁路缓存:参加前向旁路缓存(Forward Bypass Buffer)也是一种用面积换时序的办法,这是在处理反压时一种十分奇妙的办法。旁路缓存仅有一个表项,因为增加了这一个额定的缓存表项,能够将后向的握手信号时序途径砍断,可是对前向途径不发生影响,因而,能够广泛运用于握手接口。蜂鸟E200即于规划中选用此办法,有用地处理了多处反压形成的时序瓶颈。

  以上处理反压的技能办法,不只在处理器规划中能够用到,并且在一般的AS%&&&&&%电路规划中也会经常用到。

  7 处理器流水线中的抵触

  处理器的流水线规划中别的一个问题就是流水线中的抵触(Hazards),首要分为资源抵触和数据抵触。

  7.1 流水线中的资源抵触

  资源抵触是指流水线中硬件资源的抵触,最常见的是运算单元的抵触,比如除法器需求多个时钟周期才干完结运算,因而在前一条除法指令运算完结之前,新的除法指令假如也需求除法器则会存在着资源抵触。在处理器的流水线中硬件资源抵触品种还有较多,在此不做逐个赘述。处理资源抵触的办法能够经过仿制硬件资源或许流水线中止等候硬件资源的办法处理。

  7.2 流水线中的数据抵触

  数据抵触是指不同的指令之间的操作数存在数据相关性形成的抵触。常见的数据相关性包含:

  WAR(Write-After-Read)相关性,又称先读后写相关性:表明“后序履行的指令需求写回的成果寄存器索引”与“前序履行的指令需求读取的源操作数寄存器索引”相同形成的数据相关性。因而,从理论上来讲,在流水线中“后序指令”必定不能比和它有WAR相关性的“前序指令”先履行,不然“后序指令”先写回了成果至通用寄存器组中,“前序指令”再读取操作数时,就会读到过错的数值。

  WAW(Write-After-Write)相关性,又称先写后写相关性:表明“后序履行的指令需求写回的成果寄存器索引”与“前序履行的指令需求写回的成果寄存器索引”相同形成的数据相关性。因而,从理论上来讲,在流水线中“后序指令”必定不能比和它有WAW相关性的“前序指令”先履行,不然“后序指令”先写回了成果至通用寄存器组中,“前序指令”再写回成果至通用寄存器组中就会将其掩盖。

  RAW(Read-After-Write)相关性,又称先写后读相关性:表明“后序履行的指令需求读取的源操作数寄存器索引”与“前序履行的指令需求写回的成果寄存器索引”相同形成的数据相关性。因而,从理论上来讲,在流水线中“后序指令”必定不能比和它有RAW相关性的“前序指令”先履行,不然“后序指令”便会从通用寄存器组中读回过错的源操作数。

  以上的三种相关性中,RAW归于真数据相关。

  处理数据抵触的常见办法如下:

  WAW和WAR能够经过寄存器重命名的办法将相关性去除,然后无需忧虑其履行次序。

  寄存器重命名技能在Tomasulo算法中经过保存站和ROB(Re-Order Buffer)完结,或许选用纯物理寄存器(而不必ROB)的办法完结。

  之所以RAW称之为真数据相关,是因为其没有办法经过寄存器重命名的办法将相关性去除。一旦发生RAW相关性,后序的指令必定要运用和它有RAW数据相关性的前序指令履行完结的成果,然后形成流水线的等候中止。为了能够尽可能的削减流水线中止带来的功用丢掉,能够运用“动态调度”的办法。动态调度的思维实质上能够归结于以下方面:

  一方面选用数据旁路传达(Data Bypass and Forward)技能尽可能的让前序指令的核算成果更快的旁路传达给后序相关指令的操作数;

  另一方面尽可能的让后序相关指令在等候的进程中不堵塞流水线而让其他无关的指令能够持续顺畅履行。

  前期的Tomasulo算法中经过保存站能够到达这两方面的成效,可是保存站因为保存了操作数无法做到很大的深度(不然面积和时序的开支巨大)。

  最新的高功用处理器遍及选用在每个运算单元前装备乱序发射行列(Issue Queue)的办法,发射行列仅追寻RAW相关性而并不寄存操作数,因而能够做的很深(比如16个表项)。在发射行列中的指令一旦相关性免除之后,再从发射行列中发射出来读取物理寄存器组(Physical Register File),然后发送给运算单元开端核算。

  有关处理器的数据相关性问题和包含动态调度技能在内的处理办法,假如论述清楚简直能够独自成书,本文限于篇幅只能纲举目张式的予以简述,感兴趣的读者能够自行查阅。

  本文企图以最通俗化的办法对处理器流水线进行介绍,首要评论了处理器流水线概述,包含:从经典的五级流水线说起、可不能够不要流水线——流水线和状况机的联系、深处种菱浅种稻,不深不浅种荷花——流水线的深度、向上成长——越来越深的流水线、向下成长——越来越浅的流水线。然后本文介绍了处理器流水线规划的两大难题及其多种处理办法:处理器流水线中的反压、处理器流水线中的抵触。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/158725.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部