• 流水线的dependence问题(指令相关性)


    今天被问到了流水线的dependence问题,一开始没听懂,然后硬猜应该问的是指令相关性,之后查询了一下,硬猜满分(手动狗头),顺便总结一下。

    指令的相关性

            指令流水线的一个特点是流水线中的各条指令之间存在一些相关性,使得指令的执行受到影响。要使流水线发挥高效率,就要使流水线连续不断地流动,尽量不出现断流情况。然而,由于流水过程中存在的相关性冲突,断流现象是不可避免的。

            而指令的相关性也会导致流水线冒险(Hazard):在流水线中我们希望当前每个时钟周期都有一条指令进入流水线可以执行。但在某些情况下,下一条指令无法按照预期开始执行,这种情况就被称为冒险

    1、数据相关

            在流水计算机中,指令的处理是重叠进行的,前一条指令还没有结束,第二、三条指令就陆续开始工 作。由于多条指令的重叠处理,当后继指令所需的操作数刚好是前一指令的运算结果时,便发生数据相关冲突。由于这两条指令的执行顺序直接影响到操作数读取的内容,必须等前一条指令执行完毕后才能执行后一条指令。在这种情况下,这两条指令就是数据相关的。因此,数据相关是由于指令之间存在数据依赖性而引起的。根据指令间对同一寄存器读和写操作的先后次序关系,可将数据相关性分为写后读(Read-AfterWrite,RAW)相关、读后写(Write-After-Read,WAR)相关、写后写(Write-After-Write,WAW)相关三种类型。

    例如先写后读RAW:

    1. ADD BX, AX; 将AX和BX相加,存放到BX中
    2. ADD CX, BX; 将BX和CX相加,存放到CX中

    这两条指令都用到BX,指令1输出BX给指令2用,它们之间有数据流动,存在依赖性,因此称为数据相关。

    解决数据相关冲突的办法如下:

    • 采用编译的方法 编译程序通过在两条相关指令之间插入其他不相关的指令(或空操作指令)而推迟指令的执行,使数据相关消失,从而产生没有相关性的程序代码。这种方式简单,但降低了运行效率。
    • 由硬件监测相关性的存在,采用数据旁路技术设法解决数据相关 当前一条指令要写入寄存器而下一条指令要读取同一个寄存器时,在前一条指令执行完毕、结果数据还未写入寄存器前,由内部数据通路把该结果数据直接传递给下一条指令,也就是说,下一条指令所需的 操作数不再通过读取寄存器获得,而是直接获取。这种方式效率较高,但控制较为复杂。

    2、资源相关

            所谓资源相关,是指多条指令进入流水线后在同一机器周期内争用同一个功能部件所发生的冲突。 例如,在上图 所示的标量流水计算机中,在第 4 个时钟周期时,第 1 条指令处于访存取数(MEM) 阶段,而第 4 条指令处于取指令(IF)阶段。如果数据和指令存放在同一存储器中,且存储器只有一个端口,这样便会发生这两条指令争用存储器的资源相关冲突。 因为每一条指令都可能需要 2 次访问存储器(读指令和读写数据),在指令流水过程中,可能会有 2 条指令同时需要访问存储器,导致资源相关冲突。

    • 解决资源相关冲突的一般办法是增加资源,例如增设一个存储器,将指令和数据分别放在两个存储器中。

    3、控制相关

            控制相关冲突是由转移指令引起的。当执行转移指令时,依据转移条件的产生结果,可能顺序取下一 条指令,也可能转移到新的目标地址取指令。若转移到新的目标地址取指令,则指令流水线将被排空,并等待转移指令形成下一条指令的地址,以便读取新的指令,这就使得流水线发生断流。

    为了减小转移指令对流水线性能的影响,通常采用以下两种转移处理技术:

    • 延迟转移法:由编译程序重排指令序列来实现。其基本思想是“先执行再转移”,即发生转移时并不排空指令流水线,而是继续完成下几条指令。如果这些后继指令是与该转移指令结果无关的有用指令(就是说这些后继指令对之后的代码运行有用,但是并不影响该转移指令的运行结果),那么延迟损失时间片正好得到了有效的利用。
    • 转移预测法:用硬件方法来实现。依据指令过去的行为来预测将来的行为,即选择出现概率较高的分支进行预取。通过使用转移取和顺序取两路指令预取队列以及目标指令 Cache,可将转移预测提前到取指令阶段进行,以获得良好的效果。
  • 相关阅读:
    爬虫反爬:JS逆向实战2
    Android 11.0 Launcher3桌面显示多个相同app图标的解决办法
    Java学习之SpringBoot项目打包成可执行jar
    开放式耳机百元价位怎么选、公认最好的百元开放式耳机
    【数据分享】上海市共享单车数据
    qt qprocess获取控制台输出(注意踩坑)
    STL容器——string
    CentOS7 自带防火墙+Nginx封堵高频访问的恶意IP
    自动化您的Instagram帐户的程序InstaBot Pro 7.0.2
    【数据结构】算法的时间复杂度和空间复杂度
  • 原文地址:https://blog.csdn.net/weixin_42294124/article/details/126448459