首页 > 其他分享 >学习笔记1-指令级并行

学习笔记1-指令级并行

时间:2023-09-02 17:36:56浏览次数:33  
标签:依赖 并行 笔记 指令 流水线 数据 冒险

指令级并行

1.概念

1.1.指令级并行(ILP)有两种实现方法:

(1)依靠硬件来动态发现并实现并行; (2)依靠软件技术在编译时静态发现并行。

1.2.数据依赖与冒险

数据依赖(三种类型):数据依赖、名称依赖和控制依赖。

1.数据依赖:1)指令 i 生成的结果可能会被指令 j 用到。 2)指令 j 数据依赖于指令 k ,指令 k 数据依赖于指令 i 。

2.名称依赖:1)当指令 j 对指令 i 读取的寄存器或存储地址执行写操作时,就会在指令 i 和指令 j 之间发生反依赖。 2)当指令 i 和指令 j 对同一个寄存器或存储器地址进行写操作时,发生输出依赖

3.数据冒险:只要存在名称依赖或者数据依赖,而且非常相近,以至于在执行期间的重叠能改变对应依赖中操作数的访问顺序,就会存在冒险。可能的数据冒险如下: 1)RAW(读后写) 2)WAW(写后写) 3)WAR(写后读)

4.控制依赖:控制依赖决定了指令 i 相对于分支指令的顺序,使指令 i 按正确的程序执行顺序执行,而且只会在应当执行时执行。

# 2.动态调度

 

简单流水线的一个主要限制是:如果一个指令停顿在流水线中,后续指令都不能执行。 在经典的五级流水线中,可在指令译码阶段(ID)检查结构冒险和数据冒险:当一个指令可以无冒险执行时,它就会从ID发射出去,并确认所有的数据冒险都已解决。 在动态调度流水线中,所有的指令都顺序经历发射阶段;但是,它们可能在第二阶段(读取操作数阶段)停顿或者相互旁路,从而进入乱序执行状态。记分板(scoreboarding)技术允许有足够资源且不存在数据依赖时乱序执行指令。 Tomasulo算法:通过对寄存器进行有效的动态重命名来处理反依赖和输出依赖。此外,还可以对算法进行扩展,用来进行推测。

3.以多发射和静态调度来利用ILP

多发射的目标就是允许在一个时钟周期内发射多条指令。多发射处理器主要有以下3类。 1)静态超标量处理器 2)VLIW(超长指令字)处理器 3)动态调度超变量处理器

 

 

标签:依赖,并行,笔记,指令,流水线,数据,冒险
From: https://www.cnblogs.com/lane-yang/p/17673931.html

相关文章

  • Leetcode刷题笔记——二分法
    二分法是搜索算法中极其典型的方法,其要求输入序列有序并可随机访问。算法思想为输入:有序数组nums,目的数值target要求输出:如果target存在在数组中,则输出其index,否则输出-1将原数组通过[left,right]两个索引划分范围,初值left=0,right=数组的最后一个元素当left<=right时mid......
  • 旧笔记本秒变web服务器---nat123 一款优秀的内网穿透服务器
    2014买的第一台笔记本,win7系统,加过内存,重装过多次系统但是无法运行win10,用来开发已经相当吃力,但运行还是比较流畅的,扔掉可惜,卖二手也卖不了多少,后来经过多次的思考与尝试,将厚重的光驱位扩展了500G硬盘,安装了winNAS,将其改装成了私有NAS网盘,但是客户端只有手机端app,对于我这做web开......
  • [学习笔记] 莫队
    一、普通莫队莫队是一种基于分块的算法,由莫队提出(orz)。莫队可以解决一类查询序列区间信息的题。可以使用该算法的前提是维护的信息必须可以在\(O(1)\)(如果用map/set可以带\(\log\),或者优化成\(O(1)\))内将\([l,r]\)的答案扩展到\([l-1,r],[l+1,r],[l,r-......
  • windows10,编译rust程序到so文件,供android调用,笔记
    1、用D:\myProgram\android_sdk\ndk\ndk-22.0.7026061\ndk-build.cmd编译,全路径,只写ndk-build,似乎不行2、在androidas里编译,提示soisnotaABI,其实是so放错地方了。应该放在src\main\jniLibs\arm64-v8a目录下(其他cpu类似),我就是缺少arm64-v8a目录,导致这个错误,新建arm64-v8......
  • Flink 1.17教程:任务槽Task Slots和并行度的关系
    任务槽TaskSlots在ApacheFlink中,任务槽(TaskSlots)是指可用于执行并行任务的资源单元。每个任务槽可以看作是一个可用的执行线程或处理单元,用于并行执行作业的不同部分。通俗来说,可以将任务槽想象成一个工作台,而每个工作台上都可以同时进行一项任务。任务槽的数量决定了同时可以......
  • Flink 1.17教程:Standalone会话模式运行时架构及并行度
    运行时架构——Standalone会话模式为例并行度并行度是指在计算过程中同时执行多个任务或操作的能力。在ApacheFlink中,并行度是指同时执行作业中的多个任务或算子的能力。并行度的引入是为了解决以下问题:提高计算速度:通过将任务拆分成多个子任务,并行执行它们,可以大大提高计算速度......
  • Flink 1.17教程:并行度设置&优先级
    并行度设置&优先级并行度(Parallelism)并行度的设置在Flink中,可以用不同的方法来设置并行度,它们的有效范围和优先级别也是不同的。代码中设置我们在代码中,可以很简单地在算子后跟着调用setParallelism()方法,来设置当前算子的并行度:stream.map(word->Tuple2.of(word,1L)).setParall......
  • 『学习笔记』狄利克雷生成函数
    定义一般地,对于一个函数\(f\),定义它的狄利克雷生成函数(简写为DGF)为:\[\tilde{F}(x)=\sum_{i\ge1}^\infty\dfrac{f_i}{i^x}.\]即:\[\tilde{F}(x)=f_1+\dfrac{f_2}{i^2}+\dfrac{f_3}{i^3}+\dfrac{f_4}{i^4}+\cdots.①\]性质若\(f\)是积性函数,则一定满足:......
  • 《C++并发编程实战》读书笔记(1):线程管控
    1、线程的基本管控包含头文件<thread>后,通过构建std::thread对象启动线程,任何可调用类型都适用于std::thread。voiddo_some_work();structBackgroundTask{voidoperator()()const;};//空的thread对象,不接管任何线程函数std::threadt1;//传入普通函数std::thr......
  • 前端学习笔记202308学习笔记第七十捌天-Map之8
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Map</title></hea......