20230609 计算机系统结构复习
明昧 Lv7

20230609 计算机系统结构复习

cache

基本知识

  • 影响cache命中率的因素

cache 三种映射

1686279099518

  • 分别的特点

全相关联映射的优点是:

冲突率小,cache的利用率高

缺点是比较器难实现,需要一个访问速度很快代价很高的相连存储器(多路比较器);

因为CPU给定存储单元的地址之后,需要首先拿CPU给定地址记为add1的块号和所有的cache的块号进行比较,如果命中(就是cache中存在和add1的块号相等的标记),那么就把块号+便宜地址(add1的偏移地址部分)就得到了在cache中的位置;否则的话就是未命中,未命中的话地址必定存在内存中;于是使用同样的方法去遍历,然后找到(一定能找到);
————————————————

1686280568685


组关联映射

1686280587042

改进

Cache的作用是弥补主存在速度上的不足,因此Cache的性能重点关注的是它对访存时间的提升

【在提升和改进某个部件的性能时要考虑这个部件存在的意义是什么,这个部件有什么作用,再去考虑如何提升性能】

平均访存时间=命中时间+不命中率x不命中时间

所以可以从三个方面来改进Cache的性能:

降低不命中率、减少不命中开销、减少命中时间

复述

三种问题

1686395030618

1.第一次要访问的块不在cache中

2.程序需要m块,但是访问的块是n,m《n

3.太多需要被访问的块被映射到同一组


3.2 增加Cache块的大小

问题1:不命中率为什么会降低?
首次访问,Cache是空的,所以发生强制失效。发生失效只有要从主存调入一块。块越大,调入的字节越多,下次访存的时候不失效的可能性就越大。所以强制性不命中率降低。

问题2:不命中率为什么后来又升高了?

块大了,块数少了。所以带来强制性不命中降低的同时,带来了冲突不命中的增加。两者共同作用,导致总的不命中率增加。看来,块大小设置多大,是需要好好设置一下的。

问题3:增加块大小,会不会对其他性能参数有影响?

当然有影响,块大了,调块的时间长,所以会增加不命中的开销。


3.3 增加Cache的容量

1686395136359


3.4 提高相联度

2条经验规则:

  1. 采用相联度超过8的方案的实际意义不大

  2. 2:1Cache经验规则——容量为N的直接映像Cache的不命中率和容量为N/2的两路组相联Cache的不命中率差不多相同。

1686395171504

这里到底在讲什么东西????

什么是增加命中时间??


chatgpt

在计算机系统中,缓存是一种用于加快数据访问速度的高速存储器。相联度是指缓存中每个缓存块可以映射到主存中的多少个可能位置。常见的相联度包括直接映射、全相联映射和组相联映射。

当提高相联度时,意味着一个缓存块可以映射到更多的主存位置,从而增加了缓存命中的可能性。

**因为更多的主存位置可以与缓存块关联,所以在进行缓存查找时,命中的概率会增加。**这意味着在相联度较高的缓存中,可以更频繁地找到需要的数据,从而减少了从主存读取数据的时间。

然而,提高相联度也会带来一些代价。首先,相联度增加会引入更多的比较逻辑和额外的存储开销。例如,在全相联映射中,需要比较缓存中的所有块标签与要查找的标签进行匹配。这增加了查找的复杂性和延迟。其次,增加相联度会导致更多的替换策略开销。当缓存已满时,需要选择一个缓存块进行替换,而高相联度可能导致更多的冲突,从而增加了替换算法的开销。

(相联度怎样提高呢?我感觉这几种方法都是?能提高相联度的吗?)


3.5 伪相联Cache

又称列相联,既能获得多路组相联的低不命中率又能保持直接映像Cache的命中速度。

基本思想:首先按与直接映像相同的方式访问,如果命中直接给CPU;如果不命中,检查将索引字段的最高位取反的位置去寻找另一个位置(块),如果这一块的标识匹配,称发生伪命中。

伪相联Cache有两种访问时间,分别对应于正常命中和伪命中。要能够指出在同一组的两个块中访问哪个块才更可能是快速命中。解决方法:当出现伪命中时交换两个块的内容,把最近刚访问过的块放到第一位置(直接映像所对应的块上)

【因为局部性原理,刚访问过的块很可能就是下一次要访问的块】

降低不命中率

减少不命中开销

减少命中时间

  • 容量小,结构简单的cache
  • 虚拟cache(比第一种方法多了PID)
  • 虚拟索引-物理标识方法(5.5的题目看知识看不懂,厌倦了)

20.“虚拟索引+物理标识”Cache的基本思想是什么?

答:

直接用虚地址中的页内位移(页内位移在虚拟地址的转换中保持不变),作为访问Cache的索引,但标识确实物理地址,Cpu发出访存请求后,在进行虚地址转换的同时,可并行进行标识的读取,在完成地址变换后,再把得到的物理地址和标识进行比较。


http://thebeardsage.com/virtual-memory-cache-tlb-interaction/

别有图人博客写的三种方法(fq)


1686414258514

s

1686414283780

s

image-20240710115040611

5

1

某存储系统中,主存容量是Cache容量的4096倍,Cache被分为64个块。当主存地址采用直接映射时,地址映射表的大小应该是 64 * 13bit.
PS:b不考虑一致性维护位和替换算法位。

地址映射表

单单是主存完整地址,是能够解析出对应cache地址的

2^12记录多出来的主存

因为不考虑一致性和替换算法位

只考虑有效位

一个cache块除了cache标识位,主存看高位即可

cache地址映射表

2

1686281311436

3

1686304165308

5.4

image-20240710115030163

image-20240710115007650

课本156/课本170

1686410062586

说实话还是没太理解

5.5

某虚拟Cache采用虚拟索引-物理标识方法,其主存页面大小为4KB,那么如果采用4路组相联映像,用虚拟索引最多可以对多少KB的Cache进行寻址的这个问题中,我不太理解的是,虚拟地址,和页面主存大小的关系和虚拟索引和cache寻址之间的关系是什么,你能否用表格或者图片给我解释一下他们之间的关系

看看看课本192来直接硬记好了,累了

5.6

设主存每个分体的存取周期为2μs,宽度为4个字节。采用模m多分体交叉存取,但实际频宽只能达到最大频宽的0.6倍。现要求主存实际频宽为4MB/s,问主存分体数为

首先,我们需要计算主存的最大频宽。

每个分体的存取周期为2μs,宽度为4个字节,可以计算出每个分体的带宽为:

带宽 = 宽度 / 存取周期 = 4字节 / 2μs = 2MB/s

根据题目中的信息,实际频宽只能达到最大频宽的0.6倍,所以实际频宽为:

实际频宽 = 0.6 * 2MB/s = 1.2MB/s

要求主存的实际频宽为4MB/s,所以我们可以列一个方程:

1.2MB/s * 模m = 4MB/s

解这个方程可以得到:

模m = 4MB/s / 1.2MB/s ≈ 3.33

由于分体数必须是整数,所以最接近3.33的整数为4。

因此,主存分体数为4个。

基本计算机体系结构和改进

16

并发 并行 同时

1686455351126


image-20240710114953113

看起来是同时发生,但是实际上不是同时发生的


同时性(Concurrency):同时性指的是在同一时间段内,多个任务或事件都在进行,但不一定是真正的同时进行。**这种情况下,任务之间可能会交替执行或者通过时间片轮转等方式进行切换。**例如,在一个多线程的程序中,多个线程可以同时执行,但在任意时刻只有一个线程在真正运行。

并发性(Parallelism):并发性指的是多个任务或事件在同一时间段内真正地同时进行,通常需要多个物理或逻辑处理单元(如多核处理器)来实现。**在并发性中,每个任务都在独立的处理单元上执行,而不需要进行切换或者等待。**例如,在一个多核处理器的计算机上,不同的核心可以同时执行不同的任务,实现真正的并发性。

并行性(Parallelism):并行性指的是同时执行多个任务或事件,每个任务都在独立的处理单元上进行,**并且彼此之间没有依赖关系。**在并行性中,任务之间可以独立地执行,不需要相互等待或进行切换。例如,在一个分布式系统中,不同的计算节点可以同时进行独立的计算任务,实现真正的并行性。

并行性这个是我认可的独立的同时性

并行的时件或者活动一定是幷发的,但是反之并发的时间或者活动未必是并行的。并行性是并发性的特例,而并发性是并行性的拓展。

综上所述,同时性是指在同一时间段内多个任务或事件进行,但不一定是真正的同时进行;并发性是指多个任务或事件在同一时间段内真正地同时进行,通常需要多个处理单元来实现;并行性是指同时执行多个独立的任务或事件,每个任务在独立的处理单元上进行。


自我总结一下:

同时性:在同一时间段内,多个任务或者时间都在进行

并行性:每个单元相互独立,每个任务可以在独立的处理单元上进行,任务彼此之间没有依赖关系,并行一定是并发,但是并发不一定是并行

并发性:每个任务可以在独立的处理单元上进行,不需要切换或者等待


感觉还是理解不够清楚

还是得看看时间线之类的东西阿


同时性(Concurrency)并发性(Parallelism)并行性(Parallelism)

image-20240710114925174


1686456660250

有点懂了

很直观

但是文字描述又是另一回事

https://i.stack.imgur.com/ZqHC3.gif(这个图真的很好)


https://stackoverflow.com/questions/1050222/what-is-the-difference-between-concurrency-and-parallelism

精辟论述

826

为什么存在混乱

存在混淆是因为这两个词的字典含义几乎相同:

  • 并发:同时存在、发生或完成(dictionary.com
  • 并行:非常相似并且经常同时发生(韦氏词典)。

然而,它们在计算机科学和编程中的使用方式却大不相同。这是我的解释:

  • 并发性:可中断性
  • 并行性:独立性

那么上面的定义是什么意思呢?

我将用现实世界的类比来澄清。假设您必须在一天内完成 2 项非常重要的任务:

  1. 拿到护照
  2. 完成演示

现在,问题是任务 1 要求你去一个极其官僚的政府办公室,让你排队等候 4 个小时才能拿到护照。同时,task-2是你办公室需要的,是一个critical task。两者都必须在特定的一天完成。

后面例子懒得看了

1

加速计算题

在计算机系统中,某一功能的处理时间为整个系统运行时间的10%,如果要使整个系统的性能提高到原来的1.6倍,则该功能的处理速度应加快( )倍

本题疑惑是

在改变了该功能的处理时间后

这个时间就不会再是50%了

这该怎样子计算呢

加速计算题+带宽

在一台服务器上运行一段I/O密集型基准测试程序,该测试程序共有3,000,000条指令,运行时间为5毫秒,其中CPU时间占20%,I/O时间占80%。为提高性能,将服务器CPU从1.5GHz升级为3GHz,服务器内存和磁盘升级为访问速度更快的内存和固态硬盘,使得I/O访问速度提高至原来的4倍;升级后,该服务器运行同一段基准测试程序的执行时间为_____毫秒。

两个等级

image-20240710114907562

从执行程序的角度来看,并行性等级可以按照以下顺序从低到高排列:

  1. 无并行性(No Parallelism):程序中不存在可以并行执行的任务或操作。所有的任务按照顺序依次执行,没有并行执行的机会。
  2. 任务级并行性(Task-level Parallelism):程序中存在多个独立的任务,这些任务之间没有依赖关系,可以同时执行。每个任务可以在独立的处理单元上并行执行,从而提高整体的执行效率。
  3. 数据级并行性(Data-level Parallelism):程序中的某些任务涉及对大规模数据集的操作,这些数据可以被分成多个部分,并且这些部分之间没有依赖关系。这样,多个处理单元可以同时对不同部分的数据执行相同的操作,从而实现数据级的并行性。
  4. 指令级并行性(Instruction-level Parallelism):程序中的不同指令之间存在独立性,可以在同一时间点上同时执行多个指令。通过流水线技术、乱序执行等方式,处理器可以同时执行多个指令的不同阶段,从而实现指令级的并行性。
  5. 线程级并行性(Thread-level Parallelism):程序中使用多个线程来执行不同的任务或操作,这些线程可以在多个处理单元上同时执行。每个线程可以独立地执行自己的任务,并且线程之间可以通过同步机制来实现通信和协作。
  6. 进程级并行性(Process-level Parallelism):程序通过多个进程来执行不同的任务或操作,这些进程可以在多个处理器或计算节点上同时运行。每个进程有自己的地址空间和执行环境,通过进程间通信来实现任务的划分和协作。

请注意,以上是一种一般的排序,具体情况可能因程序特性、硬件平台和并行编程模型等因素而有所不同。


image-20240710114857749

2

寻址方式和操作数位置关系

在不同的寻址方式下,操作数可以位于不同的位置。以下是常见的几种寻址方式及其操作数的位置:

  1. 立即寻址(Immediate Addressing):操作数直接包含在指令中,指令本身就包含了要操作的数据。在这种寻址方式下,操作数位于指令中。
  2. 直接寻址(Direct Addressing):操作数的地址直接指定在指令中,指令中包含了要操作的数据的内存地址。在这种寻址方式下,操作数位于内存中,指令中只包含了操作数的地址。
  3. 寄存器寻址(Register Addressing):操作数位于寄存器中,指令中直接指定要使用的寄存器。在这种寻址方式下,操作数位于寄存器中。
  4. 寄存器间接寻址(Register Indirect Addressing):操作数的地址存储在寄存器中,指令中指定要使用的寄存器。在这种寻址方式下,操作数位于内存中,地址存储在寄存器中。
  5. 寄存器相对寻址(Register Relative Addressing):操作数的地址由寄存器的内容和指令中的偏移量计算得出。在这种寻址方式下,操作数位于内存中,地址由寄存器和偏移量计算得出。
  6. 基址寻址(Base Addressing):操作数的地址由基址寄存器和指令中的偏移量相加得出。在这种寻址方式下,操作数位于内存中,地址由基址寄存器和偏移量相加计算得出。
  7. 相对基址寻址(Relative Base Addressing):操作数的地址由基址寄存器、指令中的偏移量和程序计数器(PC)相加得出。在这种寻址方式下,操作数位于内存中,地址由基址寄存器、偏移量和PC相加计算得出。

需要注意的是,不同的处理器和指令集架构可能支持不同的寻址方式,而且可以有更多特定的寻址方式。在程序执行时,处理器会根据指令中指定的寻址方式来确定操作数所在的位置,并进行相应的数据访问。

取指令基本的运作

对于一个16位的机器字长,存储器按字编址,那么每个存储器地址单元可以存储一个字,即16位的数据。

对于双字指令来说,它需要使用两个连续的存储器地址单元来存储指令的两个字。当程序计数器(PC)指向当前要执行的指令时,双字指令的第一个字存储在PC指向的存储器地址单元,而第二个字存储在PC指向的存储器地址单元的下一个地址单元中。

因此,为了获取双字指令的两个字,PC的值需要自动增加2个存储器地址单元的偏移量,即增加2。这样,当执行完当前指令后,PC会自动指向下一条指令的起始地址,以便顺序执行程序。

这种PC自动增加的机制是为了保证程序的正确执行和顺序访问存储器中的指令。通过增加2个存储器地址单元的偏移量,可以确保每次PC的变化都指向下一条指令的起始地址,避免出现指令跳过或重复执行的错误情况。

总结起来,对于双字指令,在16位机器字长的情况下,PC的值需要自动加2,以便顺序获取指令的两个字,并确保程序的正确执行和顺序访问存储器中的指令。

3

流水线概念/what

流水线技术

把一个重复的过程分解为若干个子过程,每个子过程由专门的功能部件来实现。
把多个处理过程在时间上错开,依次通过各功能段,这样,每个子过程就可以与其它的子过程并行进行。

流水线的段

流水线中的每个子过程及其功能部件称为流水线的级或段,段与段相互连接形成流水线。
流水线的段数称为流水线的深度。

3.1.2 流水线的分类

部件级、处理机级及处理机间流水线

按照流水技术用于计算机系统的等级不同进行分类

部件级流水线(运算操作流水线):把处理机中的部件分段,再把这些分段相互连接起来,使得各种类型的运算操作能够按流水方式进行。

处理机级流水线(指令流水线):把指令的执行过程按照流水方式处理。把一条指令的执行过程分解为若干个子过程,每个子过程在独立的功能 部件中执行。

系统级流水线(宏流水线):把多台处理机串行连接起来,对同一数据流进行处理,每个处理机完成整个任务中的一部分。

单功能流水线与多功能流水线

按照流水线所完成的功能来分类

单功能流水线:只能完成一种固定功能的流水线。

多功能流水线:流水线的各段可以进行不同的连接,以实现不同的功能。

静态流水线与动态流水线

按照同一时间内各段之间的连接方式对多功能流水线作进一步的分类(对多功能流水线的深入)

静态流水线:在同一时间内,多功能流水线中的各段只能按同一种功能的连接方式工作。
    对于静态流水线来说,只有当输入的是一串相同的运算任务时,流水的效率才能得到充分的发挥。
    例如:ASC的8段流水线

动态流水线:在同一时间内,多功能流水线中的各段可以按照不同的方式连接,同时执行多种功能。
    优点:灵活,能够提高流水线各段的使用率,从而提高处理速度。
    缺点:控制复杂。

image-20240710114827773

线性流水线与非线性流水线

按照流水线中是否有反馈回路来进行分类
线性流水线:流水线的各段串行连接,没有反馈回路。数据通过流水线中的各段时,每一个段最多只流过一次。
非线性流水线:流水线中除了有串行的连接外,还有反馈回路。
    非线性流水线的调度问题
    确定什么时候向流水线引进新的任务,才能使该任务不会与先前进入流水线的任务发生冲突——争用流水段。

顺序流水线与乱序流水线

根据任务流入和流出的顺序是否相同来进行分类
顺序流水线:流水线输出端任务流出的顺序与输入端任务流入的顺序完全相同。每一个任务在流水线的各段中是一个跟着一个顺序流动的。
乱序流水线:流水线输出端任务流出的顺序与输入端任务流入的顺序可以不同,允许后进入流水线的任务先完成(从输出端流出)。也称为无序流水线、错序流水线、异步流水线

标量处理机与向量流水处理机

把指令执行部件中采用了流水线的处理机称为流水线处理机。

标量处理机:处理机不具有向量数据表示和向量指令
    仅对标量数据进行流水处理。

向量流水处理机:具有向量数据表示和向量指令的处理机。
    向量数据表示和流水技术的结合。

指标

吞吐率

吞吐率:在单位时间内流水线所完成的任务数量或输出结果的数量。计算公式如下

1686494738973

其中:

  • n :任务数
  • Tk:处理完成 n 个任务所用的时间

各段时间均相等的流水线

1686497097340

各段时间不完全相等的流水线

  • 各段时间不等的流水线及其时空图

image-20240710114736473

1686495930961

流水线瓶颈问题

解决流水线瓶颈问题的常用方法

  • 细分瓶颈段
    把流水线中的瓶颈段切分为几个独立的功能段,从而使流水线各段的处理时间都相等

  • 重复设置瓶颈段
    将处理时间较长的段重复设置,假设其他段处理时间为 Δ t ,瓶颈段处理时间为 n Δ t ,则设置n个

  • 缺点:控制逻辑比较复杂,所需的硬件增加了。

流水线的加速比

加速比:完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比。

image-20240710114638198

流水线各段时间相等

1686497103160

image-20240710114629174

流水线的各段时间不完全相等时

image-20240710114618899

1686496851821

流水线的效率

流水线的效率:流水线中的设备实际使用时间与整个运行时间的比值,即流水线设备的利用率。

由于流水线有通过时间和排空时间,所以在连续完成n个任务的时间内,各段并不是满负荷地工作。

不是这个勾八到底在说什么东西

各段时间相等

image-20240710114604922

可以写成这个结论就很能理解,上面这个两个推导什么鬼

第二步推导的意思是:???????

1686498505467

当我们考虑一个具有等段时间的流水线时,可以使用流水线的效率来评估其性能。流水线的效率是指在给定时间内有多少个时钟周期被用于执行实际的指令。

在一个等段时间的流水线中,

假设流水线有n个阶段(或段),每个阶段的时钟周期为T。在每个时钟周期内,每个阶段都会执行一个指令的部分工作。

流水线的效率可以通过以下公式计算:

效率 = 有效的时钟周期 / 总的时钟周期

有效的时钟周期是指流水线中实际执行指令的时钟周期数量。总的时钟周期是指在给定时间内的总时钟周期数量,可以表示为执行的指令数乘以每个指令的阶段数。

具体计算流水线的效率的步骤如下:

  1. 确定流水线中的阶段数n。
  2. 确定每个阶段的时钟周期数T。
  3. 计算总的时钟周期数量,即执行的指令数乘以每个指令的阶段数:总时钟周期 = 指令数 × n。
  4. 计算有效的时钟周期数量,即流水线中实际执行指令的时钟周期数。
  5. 使用公式计算流水线的效率:效率 = 有效的时钟周期 / 总的时钟周期。

请注意,这是一个理想情况下的计算,假设没有流水线的冲突和延迟等因素。在实际情况下,流水线效率可能会受到许多因素的影响,如流水线冒险、数据相关性、分支预测等。

通过计算流水线的效率,我们可以评估流水线的性能,并通过优化流水线的设计和处理冲突来提高效率,以达到更高的指令吞吐量和性能。

流水线设计中的若干问题

  1. 瓶颈问题

    理想情况下,流水线在工作时,其中的任务是同步地每一个时钟周期往前流动一段。
    当流水线各段不均匀时,机器的时钟周期取决于瓶颈段的延迟时间。
    在设计流水线时,要尽可能使各段时间相等。

  2. 流水线的额外开销

    • 流水寄存器延迟
      需要建立时间和传输延迟
      建立时间:在触发写操作的时钟信号到达之前,寄存器输入必须保持稳定的时间。
      传输延迟:时钟信号到达后到寄存器输出可用的时间。

    • 时钟偏移开销
      流水线中,时钟到达各流水寄存器的最大差值时间。(时钟到达各流水寄存器的时间不是完全相同)

    ⚠️几个关键问题

    • 流水线并不能减少(而且一般是增加)单条指令的执行时间,但却能提高吞吐率。
    • 增加流水线的深度(段数)可以提高流水线的性能。
    • 流水线的深度受限于流水线的额外开销。
    • 当时钟周期小到与额外开销相同时,流水已没意义。因为这时在每一个时钟周期中已没有时间来做有用的工作。

冲突问题

流水线设计中要解决的重要问题之一。

相关题型:从时空图求流水线的效率

1686499555549

61页的公式07

非线性流水线的调度*

在非线性流水线中,存在反馈回路,当一个任务在流水线中流过时,可能要多次经过某些段。

  • 流水线调度要解决的问题:

    应按什么样的时间间隔向流水线输入新任务,才能既不发生功能段使用冲突,

    又能使流水线有较高的吞吐率和效率?

3.3.1 单功能非线性流水线的最优调度

预约表

  • 横向(向右):时间(一般用时钟周期表示)
  • 纵向(向下):流水线的段

本教材的例子:一个5功能段非线性流水线预约表 P65

image-20240710114547174

image-20240710114535761

:一张预约表可能与多个流水线连接图相对应,可能有多种反馈回路对应一张预约表

流水线的相关与冲突

指令周期详解

一条指令的执行过程分为以下5个周期:

1.取指令周期(IF)

以程序计数器PC中的内容作为地址,从存储器中取出指令并放入指令寄存器IR;
同时PC值加4(假设每条指令占4个字节),指向顺序的下一条指令。

2.指令译码/读寄存器周期(ID)

对指令进行译码,并用IR中的寄存器地址去访问通用寄存器组,读出所需的操作数。

3.执行/有效地址计算周期(EX)

不同指令所进行的操作不同:

load和store指令:ALU把指令中所指定的寄存器的内容与偏移量相加,形成访存有效地址

寄存器-寄存器ALU指令:ALU按照操作码指定的操作对从通用寄存器组中读出的数据进行运算

寄存器-立即数ALU指令:ALU按照操作码指定的操作对从通用寄存器组中读出的操作数和指令中给出的立即数进行运算。

分支指令:ALU把指令中给出的偏移量与PC值相加,形成转移目标的地址

同时,对在前一个周期读出的操作数进行判断,确定分支是否成功

4.存储器访问/分支完成周期(MEM)/Memory

该周期处理的指令只有load、store和分支指令。

其它类型的指令在此周期不做任何操作。

load指令:用上一个周期计算出的有效地址从存储器中读出相应的数据;

store指令:把指定的数据写入这个有效地址所指出的存储器单元。

分支指令:分支“成功”,就把转移目标地址送入PC。分支指令执行完成。

5.写回周期(WB)

ALU运算指令和load指令在这个周期把结果数据写入通用寄存器组

ALU运算指令:结果数据来自ALU。

load指令:结果数据来自存储器。

1686503725725

在这个实现方案中:

分支指令需要4个时钟周期(如果把分支指令的执行提前到ID周期,则只需要2个周期);

store指令需要4个周期;

其它指令需要5个周期才能完成。

将上述实现方案修改为流水线实现:

  • 每一个周期作为一个流水段;

  • 在各段之间加上锁存器(流水寄存器)。

    image-20240710114506684

    采用流水线方式实现时,应解决的问题

    1.要保证不会在同一时钟周期要求同一个功能段做两件不同的工作。

    例如:不能要求ALU同时做有效地址计算和算术运算。
    

    2.避免IF段的访存(取指令)与**MEM段的访存(读/写数据)**发生冲突。

    可以采用分离的指令存储器和数据存储器;
    一般采用分离的指令Cache和数据Cache。
    

    3.ID段和WB段都要访问同一寄存器文件。

    ID段:读、WB段:写
    
    解决对同一寄存器的访问冲突:
    

    把写操作安排在时钟周期的前半拍完成,把读操作安排在后半拍完成。

    4.对PC的处理

    流水线为了能够每个时钟周期启动一条新的指令,就必须在每个时钟周期进行PC值的加4操作
    

    (默认一条指令长度为4字节),并保留新的PC值。

    这种操作必须在IF段完成(需设置一个专门的加法器),以便为取下一条指令做好准备。

    但分支指令也可能改变PC的值,而且是在MEM段进行,这会导致冲突。

段流水线的两种描述方式

  • 第一种描述(类似于时空图)

1686505108079

  • 第二种描述(按时间错开的数据通路序列)

image-20240710114453884

相关

相关

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

如果两条指令相关,**则它们就有可能不能在流水线中重叠执行或者只能部分重叠执行**。

3种类型

数据相关(也称真数据相关)

名相关

控制相关

数据相关

对于两条指令i(在前,下同)和j(在后,下同),如果下述条件之一成立,则称指令j与指令i数据相关。

指令j使用指令i产生的结果,指令j与指令i数据相关;

指令j与指令k数据相关,而指令k又与指令i数据相关。

数据相关具有传递性。

数据相关反映了数据的流动关系

当数据的流动是经过寄存器时,相关的检测比较直观和容易。

当数据的流动是经过存储器时,检测比较复杂。

相同形式的地址其有效地址未必相同;

形式不同的地址其有效地址却可能相同。

例:下面这一段代码存在数据相关。

Loop: L.D F0,0(R1) // F0为数组元素

   ADD.D   F4,F0,F2		 // 加上F2中的值

   S.D     F4,0(R1)		// 保存结果

   DADDIU  R1,R1,-8		// 数组指针递减8个字节

   BNE     R1,R2,Loop	 // 如果R1≠R2,则分支 

名相关

指令所访问的寄存器或存储器单元的名称。

如果两条指令使用相同的名,但是它们之间并没有数据流动,则称这两条指令存在名相关。

指令j与指令i之间的名相关又分为两种(j后进入)

反相关:如果指令j写的名与指令i读的名相同,则称指令i和j发生了反相关。

指令j写的名=指令i读的名

输出相:如果指令j和指令i写相同的名,则称指令i和j发生了输出相关。

指令j写的名=指令i写的名

名相关的两条指令之间并没有数据的传送。

因此,如果一条指令中的名改变了,并不影响另外一条指令的执行。

换名技术

通过改变指令中操作数的名来消除名相关。
对于寄存器操作数进行换名称为寄存器换名。
既可以用编译器静态实现,也可以用硬件动态完成。

1686506144144

控制相关

控制相关是指由分支指令引起的相关它需要根据分支指令的执行结果来确定后面该执行哪个分支上的指令。
为了保证程序应有的执行顺序,必须严格按控制相关确定的顺序执行。

JMP 跳转可以引起全局相关

示例:典型的“if-then”结构

if p1 与S1控制相关、if p2 与S2控制相关
S与p1和p2均无关

控制相关带来了以下两个限制:

与一条分支指令控制相关的指令不能被移到该分支之前。否则这些指令就不受该分支控制了。
    对于上述的例子,then 部分中的指令(如S1)不能移到if语句之前。

如果一条指令与某分支指令不存在控制相关,就不能把该指令移到该分支之后。
    对于上述的例子,不能把S移到if语句的then 部分中。

流水线冲突

流水线冲突是指对于具体的流水线来说,由于相关的存在,使得指令流中的下一条指令不能在指定的时钟周期执行。

流水线冲突有3种类型:

结构冲突:因硬件资源满足不了指令重叠执行的要求而发生的冲突。
数据冲突:当指令在流水线中重叠执行时,因需要用到前面指令的执行结果而发生的冲突。
控制冲突:流水线遇到分支指令和其它会改变PC值的指令所引起的冲突。

流水线冲突带来的问题:

导致错误的执行结果。
流水线可能会出现停顿,从而降低流水线的效率和实际的加速比。
我们约定:当一条指令被暂停时,在该暂停指令之后流出的所有指令都要被暂停,而在该暂停指令之前流出的指令则继续进行(否则就永远无法消除冲突)。

结构冲突

在流水线处理机中,为了能够使各种组合的指令都能顺利地重叠执行,需要对功能部件进行流水或重复设置资源。

如果某种指令组合因为资源冲突而不能正常执行,则称该处理机有结构冲突。

  • 常见的导致结构冲突的原因:

    功能部件不是完全流水

    资源份数不够

  • 举例:访存冲突

有些流水线处理机只有一个存储器,将数据和指令放在一起,访存指令会导致访存冲突。

image-20240710114436974

image-20240710114428459

  • 解决方法Ⅱ: 设置相互独立的指令存储器数据存储器、或设置相互独立的指令Cache数据Cache

有时流水线设计者允许结构冲突的存在

主要原因:减少硬件成本
如果把流水线中的所有功能单元完全流水化,或者重复设置足够份数,那么所花费的成本将相当高。

数据冲突

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

根据指令读访问和写访问的顺序,可以将数据冲突分为3种类型。

考虑两条指令i和j ,且i在j之前进入流水线,可能发生的数据冲突有:

  1. 写后读冲突(RAW)

        在 i 写入之前,j 先去读。 j 读出的内容是错误的。
        这是最常见的一种数据冲突,它对应于真数据相关。
    
  2. 写后写冲突(WAW)

    在 i 写入之前,j 先写。最后写入的结果是i写入 的。错误!

    这种冲突对应于输出相关。

    写后写冲突仅发生在这样的流水线中:

    流水线中不只一个段可以进行写操作;

    指令被重新排序了。

前面介绍的5段流水线不会发生写后写冲突。原因:只在WB段写寄存器

3.读后写冲突(WAR)

在 i 读之前,j 先写。i 读出的内容是错误的!

由反相关引起。

发生的情况

    有些指令的写结果操作提前了,而且有些指令的读操作滞后了;

    指令被重新排序了。

(这几种冲突的名字实际上是正确执行的顺序,冲突的含义是这一顺序被颠倒了)

解决方案

1.通过定向技术减少数据冲突引起的停顿

定向技术也称为旁路或短路

关键思想:

在计算结果尚未出来之前,后面等待使用该结果的指令并不真正立即需要该计算结果,如果能够将该计算结果从其产生的地方直接送到其它指令需要它的地方,那么就可以避免停顿。

解释如下:

image-20240710114401484

采用定向技术后的流水线数据通路前后对比

image-20240710114025166

image-20240710114241637

定向的实现:

EX段和MEM段之间的流水寄存器中保存的ALU运算结果总是回送到ALU的入口。

当定向硬件检测到前一个ALU运算结果写入的寄存器就是当前ALU操作的源寄存器时,那么控制逻辑就选择定向的数据作为ALU的输入,而不采用从通用寄存器组读出的数据。

结果数据不仅可以从某一功能部件的输出定向到其自身的输入,而且还可以定向到其它功能部件的输入。

⚠️并不是所有的数据冲突都可以用定向技术来解决

例如:无法将LD指令的结果定向到DADD指令

程序员的看得见与看不见

image-20240710113936254

CISC RISC

image-20240710113951066

 Comments
Comment plugin failed to load
Loading comment plugin
Powered by Hexo & Theme Keep
Unique Visitor Page View