首页 > 其他分享 >指令级并行

指令级并行

时间:2023-06-12 23:56:10浏览次数:32  
标签:并行 指令 冲突 寄存器 流水线 执行 分支

流水线

相关与冲突

相关

两条指令之间存在某种依赖关系

  • 数据相关:真数据相关 RAW read after write
    前一条指令写,后一条指令读
  • 名相关:
    • 名:寄存器的名称
    • 两条指令使用相同的名,但之间没有数据流动
      • 反相关:WAR wirte after read
        • 读之后写
      • 输出相关:WAW wirte after write
        • 两个指令写同一个寄存器
    • Q:为什么出现名相关?A:物理寄存器数量有限
    • 执行顺序不可颠倒
    • 因为没有数据的流动,因此改变寄存器名字也无妨
    • 换名技术:改变操作数的名来消除名相关
      • 编译器静态实现,硬件动态实现(区别?)

冲突

指对于流水线来说,由于相关的存在,使得指令中下一条指令无法执行
* 结构、数据、控制冲突

  • 结构冲突:因硬件资源满足不了指令重叠执行的要求而发生的冲突。
  • 数据冲突:当指令在流水线中重叠执行时,因需要用到前面指令的执行结果而发生的冲突。
  • 控制冲突:流水线遇到分支指令和其他会改变PC值的指令所引起的冲突。
    冲突的问题:1.导致错误的执行结果
    2.流水线可能会出现停顿,从而降低流水线的效率和实际的加速比
结构冲突

在流水线处理机中,为了能够使各种组合的指令都能顺利地重叠执行,需要对功能部件进行流水或重复设置资源。
如果某种指令组合因为资源冲突而不能正常执行,则称该处理机有结构冲突。
原因:1. 功能部件不是完全流水(瓶颈段)
2. 资源份数不够
解决:停顿
eg.访存冲突
有些流水线处理机只有一个存储器,将数据和指令放在一起,访存指令会导致访存冲突。
解决方法:1. 插入暂停周期 2. 设置相互独立的指令存储器和数据存储器或设置相互独立的指令cache和数据cache
有时允许结构冲突存在,节省成本

数据冲突

当相关的指令靠得足够近时,它们在流水线中的重叠执行或者重新排序会改变指令读/写操作数的顺序,使之不同于它们非流水线实现时的顺序,则发生了数据冲突。
数据冲突的类型:

  • 写后读冲突(RAW),最常见,对应真数据相关
    • 在i写入之前,j先读,则j读出的结果是错误的
  • 写后写(WAW)对应输出相关
    • 在i写入之前,j先写
  • 读后写(WAR)由反相关引起
    • i读之前,j先写
      解决:
  • 定向传送技术
  • 定向传送技术+停顿
  • 指令调度(依靠编译器)(可能产生新的WAR或WAW冲突)
控制冲突
  • 处理分支指令最简单的方法:冻结或排空流水线。优点:简单

指令级并行

概念:是指存在于指令一级即指令间的并行性,主要是指机器语言一级,如存储器访问指令、整型指令、浮点指令之间的并行性等。
特点:是并行性由处理器硬件和编译程序自动识别和利用,不需要程序员对顺序程序作任何修改。正是由于这一优点,使得它的发展与处理器的发展紧密相连。

实际CPI=CPI理想+结构冲突+数据冲突+控制冲突
需要解决相关与冲突的问题。
两类解决方法:

  • 保持相关,但避免发生冲突
    • 指令调度(依靠编译器静态调度)
  • 通过代码变换,消除相关
    • 寄存器换名(消除WAR和WAW)

静态开发方法

基本编译技术:循环展开与指令调度

动态调度

乱序执行

  • 将ID阶段再分为两个阶段:
    • 流出(IS):指令译码,检查是否存在结构冲突
    • 读操作数(Read Operands):等待数据冲突消失,然后读操作数
      乱序执行会导致WAR and WAW冲突
      动态指令调度是在指令执行过程中进行调度,使得无关的指令得以先执行,减少阻塞。
      能处理一些在编译时情况不明的相关(存储器访问的相关)
      能使得本来是面向某一流水线优化编译的代码在其他的流水线(动态调度)上也能高效执行。
      使用换名技术消除名相关(包括反相关和输出相关)
      指令乱序->异常处理困难
      硬件复杂性显著增加

动态调度解决数据冒险

Tomasulo算法

记录和检测指令相关,操作数一旦就绪就立即执行,把发生RAW冲突的可能性减少到最小;通过寄存器换名来消除WAR和WAW冲突

  • 寄存器换名是通过保留站和流出逻辑来共同完成的。
    • 当指令流出时,如果其操作数还没有计算出来,则将该指令中相应的寄存器号换名为将产生这个操作数的保留站标识
    • 指令流到保留站后,其操作数或换成了数据本身,或换成了保留站标识,不再与寄存器有关系
  • 特点:
    • 冲突检测和指令执行控制是分布的
      每个功能部件的保留站中的信息决定了什么时候指令可以在该功能部件开始执行
    • 计算结果通过CDB直接从产生它的保留站传送到所有需要它的功能部件,而不用经过寄存器

动态调度解决控制冒险

动态分支预测技术

  • 所开发的ILP越多,控制相关的制约就越大,分支预测就要有更高的准确度。
  • 动态分支预测技术:通过硬件技术,在程序执行时根据每一条转移指令过去的转移历史记录来预测下一次转移的方向。通过提前预测分支方向,减少或消除控制相关导致的流水线停顿。
  • 优点:
    • 根据程序的执行过程动态地改变转移的预测方向,因此有更好的准确度和适应性
    • 程序每次执行时,可能预测的分支方向与前次相同或不同
  • 分支预测的有效性取决于:
    • 预测的准确性
    • 决定分支开销的因素:
      • 流水线的结构
      • 预测的方法
      • 预测错误时的恢复策略
  • 采用动态分支预测技术的目的:
    • 预测分支是否成功
    • 尽快找到分支目标地址(避免控制相关造成流水线停顿)
分支预测缓存器(BHT)

最简单的动态分支预测方法

用BHT来记录分支指令最近一次或几次的执行情况

  • 一个预测位
    • 只需要一位二进制单位
  • 两个预测位
    • 提高预测的准确度
  • 当分支指令到达译码段时,根据从BHT读出的信息进行分支预测,若预测正确,则继续处理后续的指令,流水线没有断流,否则,就要作废已经预取和分析的指令,恢复现场,并从另一条分支路径重新取指令
  • BHT只在以下情况下才有用:
    • 判定分支是否成功所需的时间大于确定分支目标地址所需的时间
    • 五段经典流水线中,由于判定分支和计算分支地址都是在ID阶段完成,所以BHT方法不会给流水线带来好处
分支目标缓冲器(BTB)

目标:将分支的开销降为0

方法:分支目标缓冲

将分支成功的分支指令的地址和它的分支目标地址都放到一个缓冲区中保存起来,缓冲区以分支指令的地址作为标识。

预测不成功的话延迟2个周期

基于硬件的前瞻执行

前瞻执行基本思想:

​ 对分支指令的结果进行猜测,并假设这个猜测总是对的,然后按这个猜测结果继续取、流出和执行后续的指令。只是执行指令的结果不是写回到寄存器或存储器,而是放到一个称为ROB(ReOrder Buffer)的缓冲器中。等到相应的指令得到“确认”(commit)(即确实是应该执行的)之后,才将结果写入寄存器或存储器。

实现前瞻的关键思想:允许指令乱序执行,但必须顺序确认

  • 在分支指令的结果出来后,对相应指令的前瞻执行给予确认。如果前面所做的猜测是对的,把在ROB中的结果写到寄存器或存储器。如果发现前面对分支结果的猜测是错误的,那就不予以确认,并从那条分支指令的另一条路径开始重新执行。

在Tomasulo算法基础上改进。Tomasulo算法的保留站换名功能由ROB完成。

标签:并行,指令,冲突,寄存器,流水线,执行,分支
From: https://www.cnblogs.com/airjojo/p/17476380.html

相关文章

  • OpenMP中几个容易混淆的函数(线程数量/线程ID/线程最大数)以及并行区域线程数量的确定
    (1)并行区域数量的确定:在这里,先回顾一下OpenMP的parallel并行区域线程数量的确定,对于一个并行区域,有一个team的线程去执行,那么该分配多少个线程去执行呢?OpenMP的遇到parallel指令后创建的线程team的数量由如下过程决定:1.if子句的结果2. num_threads的设置3. omp_set_num_threads()......
  • 【计算机组成原理期末总预习-自顶向下方法】第4-6章 指令系统,CPU,流水线
    第4-6章指令系统,CPU,流水线一、指令系统设计指令结构与设计思想操作码:指定操作类型(操作码长度:固定/可变)源操作数或其地址:一个或多个源操作数所在的地址(操作数来源:主(虚)存/寄存器/I/O端口/指令本身)结果的地址:产生的结果存放何处(目的操作数)(结果地址:主(虚)存/寄......
  • 浅析串行与并行通讯
    在嵌入式领域,组件间的通讯是逃不掉的话题,因为仅仅只有处理器核心算不上完整的嵌入式系统,一个嵌入式系统往往是由处理器和众多外部设备组合而成的,而通讯则是处理器与外设,外设与外设之间的纽带。在嵌入式领域有成千上百的通讯协议,这些通讯协议有众多的分类方式,其中一个重要的分类方......
  • 9、Dockerfile指令与指令运行的阶段
    Dockerfile指令FROM(指定基础镜像)LABEL(贴标签)RUN(执行shell命令)ENV(设置环境变量,全局可用,但只能放在FROM后面)COPY(复制文本)ADD(复制和解包文件)CMD(容器启动命令)ENTRYPOINT(入口点,搭配脚本做初始化)ARG(在build阶段设置环境变量,可放在FROM前面,供FROM引用变量)VOLUME(匿名卷......
  • 通过指令的方式来实现元素加载过渡效果
    页面上如何使用给需要过渡的元素添加v-slide-in指令<template><divclass="continer"><divv-slide-inclass="item">1</div><divv-slide-inclass="item">2</div><divv-slide-inc......
  • C语言 #pragma指令
    简介#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的#pragma用于指示编译器完成一些特定的动作#pragma所定义的很多指示字是编译器特有的#pr......
  • apache 使用 mod_fcgid.so模块时 配置指令
    FcgidBusyScanInterval指令说明:扫描繁忙超时进程的间隔语法: FcgidBusyScanInterval seconds默认:FcgidBusyScanInterval120环境: 服务器配置状态:外部对应的老指令:BusyScanInterval该模块将执行FcgidBusyTimeout检查,在此区间。FcgidBusyTimeout指令说明:杀死处理请求超过Fcgi......
  • 计算机组成原理:指令系统、CPU数据通路信号(例题
    分析:由题目可知操作码占4位,所以支持的操作指令为\(2^4\)种指令操作数占6位,其中寻址3位,寄存器编号3位,所以最多有\(2^3\)个通用寄存器主存大小为128KB,机器字长为16位,且按字编址,所以有\(\frac{128KB}{2B}\quad=2^{16}\)个存储单元,即MAR至少16位机器字长为16为,那么MDR至少也......
  • 其他细节:并发并行
        ......
  • vue3实现自定义指令
    创建一个empty.jsimport{nextTick}from'vue';constemptyImgUrl=newURL('@/assets/images/empty-icon.jpeg',import.meta.url).href;//在vue3中不支持require引入静态图片,这是一种引入方式另外一种是直接importconstempty={install(app,options){app......