• 流水线技术概述


    本文是对流水线技术地基本概念、冒险处理、硬件实现的基本概述。首先我们介绍流水线的工作原理、组成要求、分类和性能指标,接下来讨论流水线的冒险处理,最后我们以MIPS为例,介绍流水线数据通路和控制器的实现。

    1. 流水线概念

    针对串行执行过程中的冗余和瓶颈,我们提出,可以将指令执行过程划分为多个阶段,各个阶段可以同时处理操作,这样,每条指令按序通过各段,不同指令的执行过程重叠,得到的就是流水线。

    流水线由多个功能段按序组成。例如,在RISC中,通常包括IF,ID,EX,MEM,WB五个功能段,而在CISC中,通常包括IF,ID,OF,EX,WB五个功能段。

    理想状况下,流水线可以对程序执行起到显著的加速作用。例如,有n条指令在m段流水线上执行,串行执行的时间为mnt,而采用流水线后,其执行时间为(m+n-1)t。

    流水线在组成上,有三个基本要求。

    第一,各个段的操作要相互独立、相互分离。因此,每个段的源数据必须来自时序部件,结果也要存到时序部件。实现上,我们设置段间寄存器,其中保存本段的所有后续段需要的本段的数据、地址、命令等。

    第二,各个流水段的操作要同步执行。实现上,我们会设置公共拍时钟,使得段间寄存器被同时写入。拍时钟的周期需要取为各个段长的最大值。

    第三,各个流水段的操作必须无冲突,以保证结果正确。具体而言,就是消除冒险。实现上,通过增设部件和控制器,来消除各种冒险。

    流水线可以按其属性进行多种分类。

    按处理的级别,可以分为操作级流水线、指令级流水线、处理机级流水线。

    按功能,可以分为单功能和多功能流水线。多功能流水线的各流水段可以进行不同的连接,从而完成不同的功能。

    按工作方式,可以分为静态流水线和动态流水线。静态流水线在进行功能切换时,必须排空。显然,动态流水线一定是多功能流水线。

    按结构,可以分为线性流水线和非线性流水线。所谓非线性流水线,就是其中有部件的复用。

    按流入流出的次序,可以分为顺序流水线和乱序流水线。

    流水线的性能指标包括吞吐率、加速比、效率等。

    吞吐率指的是单位时间内完成的任务数量,即TP=n/T_流水 →1/t,因此优化吞吐率的方法是降低段长,通过细分瓶颈段或重复设置部件的方式完成。

    加速比指的是串行执行时间和流水执行时间的比值,即S=nm/(m+n-1)→m,因此优化加速比的方法是增加段数。

    效率即部件利用率E,为部件利用时间占总流水执行时间的比值,即任务所占时空区与所有段总时空区的比值,实际效率为E=n/(m+n-1)→1,因此增加任务数量就能提高效率。对于线性流水线,效率与吞吐率、加速比有关系E=S/m=TP⋅t。

    流水线段数的选择主要有两条思路。针对额外开销考虑,应当使段长远大于段间寄存器偏移和时钟偏移。针对性价比考虑,由吞吐率TP=(T/m+d)^(-1),总价格C=a+bm,最大化性价比PCR=TP/C。

    2. 流水线的冒险处理

    指令之间的依赖关系称为相关,具体包括数据相关、名相关(反相关/输出相关)、控制相关。由相关引起的流水异常称为冒险。因此,冒险也分为结构冒险、数据冒险、控制冒险。

    由争用硬件资源产生的冒险称为结构冒险。为阻止其产生,要求每个部件只能使用一次且使用时间固定。具体处理时,对于高频冲突,重复设置部件;对于低频冲突,分时使用部件。

    因重叠执行,指令所需的数据暂时不可用,称为数据冒险。数据冒险通常包括RAW、WAR、WAW等,处理方法通常包括阻塞、转发、乱序执行。

    阻塞法的策略是阻塞冲突指令及其后续指令直到RAW冒险消除。实现上,只要检测到RAW,就通过不写PC和IF/ID寄存器来暂停IF段,通过将nop写入ID/EX寄存器来产生气泡。停顿的时长为数据从请求读出到实际可读的间隔拍数。

    转发法的策略是让冲突指令从数据产生段获取数据来消除冒险。实现上,为了简化实现,通常在使用时获取,需要增设转发线路。在能成功转发时不停顿,否则停顿时长与阻塞法一致。转发法通常只能处理运算指令,对于load-use冒险无能为力,只能通过阻塞来消除冒险。

    乱序执行法的策略是只停顿冲突指令,而后续没有RAW冒险的指令可以先执行。要实现支持乱序流动的流水线,需要增设指令窗口并采用动态调度方法。乱序执行引入了WAR/WAW冒险。

    在遇到跳转分支指令时,因指令执行顺序改变,引起流水线停顿,产生的冒险称为控制冒险。处理控制冒险的方法有阻塞法、分支预测法、延迟分支法。

    阻塞法的策略是阻塞分支指令之后的指令,直到分支指令执行完,即控制冒险消除。实现上,一旦ID段检测到控制冒险,就立即暂停IF段,ID段从下拍起产生气泡。停顿的时长为ID段到PC可用的间隔拍数。为优化性能,通常需要尽早判断是否转移,尽早确定转移目标地址。

    分支预测法的基本思想是预测转移方向并执行该方向的指令,猜对时继续执行后续指令,猜错时回头执行另一方向的上的指令。实现上,在IF段或ID段进行预测,猜对时不写PC,猜错时清空流水线,即各段都写入气泡。通常在猜对时停顿时长为0拍或1拍,猜错时比阻塞法多停一拍。

    延迟分支法的基本思想是将分支指令提前。维护一个延迟槽,即延迟分支之后必须要执行的指令,既然如此,尽可能在其中放入有用的指令。实现时,通常通过编译阶段重排序指令序列来完成。通常在延迟槽大小为1条指令时使用延迟分支,否则更适合用分支预测。

    3. 流水线的实现

    流水线实现基于多周期数据通路,其工作周期为n个时钟周期,Tc为各个基本操作时长的最大值。相比单周期数据通路,多周期数据通路支持部件服用,并增设了一些附加寄存器。

    流水线数据通路在实现时,为处理结构冒险,不允许部件复用,并要求固定使用时间;为实现操作分离,设置段间寄存器;为处理数据冒险,增设检测逻辑和转发线路。为处理控制冒险,需要设置从对应段写PC的线路。

    流水线控制器需要在ID段产生当前指令所需的微操作控制信号,此时冒险处理已经融入其中。各段只需使用并向后传递控制信号。

    流水线分析例题:https://www.cnblogs.com/mollnn/p/14748217.html

  • 相关阅读:
    c++ this *this
    名称空间
    c++ 静态持续变量
    c++ 数组
    c++ 头文件
    实例化和具体化详解
    在linux下安装eclipse以及运行c++程序的安装步骤
    在centos (linux) 搭建 eclipse c++开发分环境
    Linux上使用Qt Creator进行C/C++开发
    使用Qt Creator 2.60编写C/C++程序
  • 原文地址:https://www.cnblogs.com/mollnn/p/14745696.html
Copyright © 2020-2023  润新知