.延迟槽指令
2.指令相关: 数据相关,控制相关,结构相关。
3.序关系
4.数据相关:3种相关:写后读相关RAW,也成为真相关。写后写相关WAW,也成为输出相关,即两条指令写同一个单元,乱序执行中,如果后一条指令先写,前面的指令后写,就会产生错误的结果。。 读后写相关,在乱序执行的结构或者读写指令流水及不一样时候,即读指令读到该单元未来的值,从而引起的错误。
5.阻塞(stall),5级静态流水线如何实现阻塞过程呢?:具体实现:将ID流水级指令的两个源寄存器号与EX.MEM,WB阶段的dest做比较,如果有一个相等且目的寄存器不是x0,就需要阻塞等待。
如何实现:第一步,将pc和指令寄存器使能信号控制好,使PC和IR保持当前值不变,而在EX阶段的流水线的输入无效的控制信号,利用bubble填充。

控制相关的避免:1。在译码阶段计算PC地址,2.延迟槽指令,避免流水线阻塞
3.如果转移指令在译码阶段根据寄存器值进行判断需要用到EX MEM WB阶段的目标寄存器时,则由于数据相关,会堵在ID或者IF流水级 和前面三条指令的目标寄存器相比较。
指令存在相关,相关引起冲突,冲突会引起流水线阻塞,阻塞影响流水线效率

流水线的前递技术

1.前递技术(旁路技术)。
1.将RS1和RS2递到EX流水级,与前面的MEM WB阶段的目标寄存器比较,如果是WB阶段,则直接选,如果是MEM阶段的目标寄存器,再判断是否MEM流水级上是否是load操作,如果是load操作,则MEM流水级的目的寄存器值还没有形成,则流水线停1拍,后面流水线暂停,往前面的流水线送bubble,,如果不是load,则可以直接去MEM流水级目标寄存器值

流水线和例外

例外信号EX和指令PC要增加到流水线中间寄存器,用来记录发生例外和例外发生时的指令的PC,作用:PC给操作系统进行例外处理时使用,比如当发生例外的指令处在写回阶段时,CPU要保存该指令的PC值到一个专用的寄存器EPC中,然后把PC置为例外处理程序的入口地址,因此需要再PC的输入端增加一个2选1逻辑,一个是正常的OC值,一个是例外程序的入口,由例外选通信号来选择。
缓存命中是什么意思

例外处理方法:
1.不要精确例外,一旦发生例外,就不恢复了,或者设置精确例外和非精确例外模式。
2.通过增加硬件 把指令执行结果先缓存起来,知道前面的指令都执行完了而且没有例外之后,再把结果写回,如果前面的指令发生例外,就把后面的指令取消掉。
3.硬件不负责精确例外现场,但发生例外时保留足够的信息以便软件可以恢复现场。


第六章 动态流水线

影响流水线效率的因素:

思想:允许超车,指令准备好了就执行,不用等候前面不相关的指令。
CPI:执行每条指令的平均周期数

数据相关:
1.真实相关: 寄存器的数据相关 存储器的数据相关 前面的指令因为相关而等待的时候,后面的指令可以继续执行。
2.名字相关:WAR和WAW相关,解决思想:寄存器重命名的思想
设计思想:指令产生结果后不立即修改寄存器,而是先存起来等前面的指令都执行结束,保证不会发生例外或者转移取消以后,才能修改寄存器。
控制相关:需要转移猜测技术,再转移条件确定前猜测某个分支取值并执行。转移指令是很关键的,因为它关系到后面从哪里取指。

指令调度技术

指令调度:在不影响程序正确性的前提下,通过改变指令的执行次序来避免由于指令相关引起流水线阻塞。
指令调度可以分为:静态调度和动态调度。
静态调度是由程序员或编译器在程序执行之前进行的指令调度
动态调度是在程序执行过程中由硬件自动进行的指令调度。

静态调度

1.循环开销:通过循环展开来降低循环开销。
循环展开:在程序中直接罗列多次循环的运算部分以消除和减少循环开销。
计算一个元素所需要的时钟周期素,可以从9拍降低到3.5拍,利用指令重排序技术,循环展开技术以及寄存器重命名技术。(寄存器重命名技术可以消除WAW和WAR)相关,但需要更多的寄存器。循环展开可以降低循环开销,但会增加代码空间,可能对指令cache的命中率产生影响

动态调度

1.指令调度的基本思想:为了提高指令级并行的效率,通过寄存器重命名和指令重排来避免由于指令之间的数据相关和名字相关而引起的冲突。
2.动态调度:为了解决静态调度中存在的一些问题。所谓动态调度,就是在指令的执行过程中由硬件自动对指令的执行次序进行调度以避免由于数据相关引起的流水线阻塞。为了保证程序的正确执行,硬件在动态调度时需要能够自动判断并遵循指令之间的相关关系。
3.动态调度的思想:前面指令的阻塞不影响后面的指令继续前进,具体做法:把译码分成两个流水级:译码和读操作数。
译码阶段:对指令进行译码并检查结构相关
读操作数阶段:检查指令的操作数是否准备好,准备好就读操作数并送去执行,否则在一个称为保留站或发射队列的地方等待。当一条在读操作数阶段的指令由于相关而在保留站中等待时,后面指令的发射可以继续进行。也就是说,通过把需要等待的指令暂存在保留站中,可以腾出指令执行的通路,后面的不相关的指令就可以继续执行。可见,保留站是把指令从有序变成乱序的结构。

如图所示:
在动态调度结构中,执行是可以乱序的,只要没有相关就可执行,多条指令还可以同时执行。结束可以乱序,也可以有序。
动态调度的代价

4个浮点寄存器 3个加法保留站 3个乘法保留站 定点/访存部件。

每个寄存器 划分为结果状态域 来表示寄存器是否口用 0表示可用,否则表示产生寄存器结果的保留站号。
保留站内容包括: Busy(忙位) Op(操作码) Vj Vk(源操作数的值) Qj Qk(在源操作数没有准备好的条件下表示产生源操作数的保留站号,如为0则表示操作数已经准备好)

第一步 在发射阶段

分两部分:
1.根据操作类型把指令送到相应的保留站(如果保留站有空)
2.在发射过程中读寄存器的值和结果状态域;如果寄存器的值处于可用状态就读出寄存器的值,如果寄存器的值处于不可用状态,则读出状态域中记录的写该寄存器的保留站号。

第二步 在执行阶段:
每个功能部件都要检查保留站中的指令,如果其中某条指令所需要的源操作数都准备好(Qj Qk都为0)了,则执行该指令;保留站中操作数没有准备好(Qj 或Qk不为0)了的指令侦听结果总线并接受结果总线的值;
指令执行完后写回时,不仅要写回指令运算的结果,而且要写回该指令的保留站号,保留站和寄存器侦听结果总线并根据结果总线的内容修改自己的状态,指令写回后释放保留站。

6.5例外和动态流水线

例外通路和数据通路相伴而行。
例外的原因: I/O请求,指令例外,运算部件的例外,存储管理部件的例外,保留指令错误以及硬件错等。

非精确例外:操作系统在处理例外时,只能假设例外指令之前的指令肯定执行完了,后面的指令肯定还没有开始执行,在非精确例外中,硬件没有给操作系统一个精确的现场,导致例外处理时,后面可能有指令已经执行完,但是例外恢复以后,加法和减法指令还要重新在做一遍。

精确例外:

1.定义:指在处理例外的时候,发生例外的指令之前的所有指令都已经执行完了,例外指令后面的所有指令都还没有执行。而实现精确例外处理的办法,就是把后面指令对机器状态的修改延迟到前面指令都已经执行完。
2.流水线中增加一个提交(commit)阶段,在这个阶段指令才真正修改计算机状态。在执行或者写回阶段,把指令的结果先写到被称为重排序缓存(ReOrder Buffer,ROB)的临时缓冲器中;在提交的时候,再把ROB的内容写回到寄存器或者存储器。指令提交是有序的,只有前面的指令都提交之后才能进行。
这种流水线叫做乱序执行,有序结束。指令执行是乱序的,但提交是有序的。程序员可见的机器状态在执行阶段是不能修改的,只有在提交阶段才能修改。

保留站和ROB是两个核心部件,作用恰好相反,保留站把有序变成乱序,ROB把乱序重新排成有序。指令有序地进入流水线,为了提高效率,先乱序执行;为了保证正确性,执行完了以后有序地结束。不只是例外处理,在后面章节介绍的转移指令猜测执行也要用上述乱序执行有序结束的机制。
猜测执行和精确例外处理的核心思想都是在某些不确定的情况下先执行,但是留有反悔的余地。

ROB里面包含的东西:ROB要有目标地址(存储地址或寄存器号)的值和操作类型等。一条指令的结果寄存器可以被重新命名为其结果的ROB号,这样后面的指令有可能从ROB读操作数。
1.根据图例流程看懂在有ROB的情况下流水线是怎样执行的。

2.看看ROB机制是如何做到例外现场精确的。

重排序缓存ROB的作用:ROB是有序的,用于保证乱序执行的指令进行按序提交。当把一条指令送入保留站的同时需要将该指令插入ROB队列的尾部,执行完的指令将从ROB队列的头部移除。在动态调度结构中,指令都是有序进入、乱序执行和有序退出。
ROB大小限制了能乱序执行的指令条数,
ROB的大小以及保留站的大小体现了处理器乱序执行的能力。

关键性瓶颈:只有一条车道,1拍只能发射1条指令,IPC最多是1.

多发射

每拍可以发射多条指令并让他们一起执行。

7.1指令级并行技术

计算机体系结构的并行主要有三大类技术:
第一类是数据级并行
第二类是指令级并行
第三类是线程级并行

乱序执行技术: 由动态调度和寄存器重命名两大技术构成。保留站(发射队列),重排序缓存ROB,重命名寄存器(在Tomasulo算法中,保留站还起到了重命名寄存器的作用,通过寄存器重命名,指令和指令之间的寄存器相关变成了保留站之间的相关 p114) 3个部件 起着重要的作用。

三个角度看指令级执行:
1,时间重叠实现指令级并行
2.多发射通过空间重复实现指令级并行
3.乱序执行提高流水线的效率,挖掘指令间潜在的可重叠性或不相关性

7.2 保留站的组织

保留站有独立保留站,分组保留站,和全局保留站3种常见的组织方式。
独立保留站就是每一个功能部件有一个保留站,前面介绍的Tomasulo算法就是每个功能部件一个保留站。
分组保留站就是把功能部件分组,同一组的功能部件共用一个保留站。例如,定点部件和访存部件共用一个保留站,浮点部件共用一个保留站。 通常考虑分成三类,定点,浮点,访存3类,也成为发射队列。
全局保留站就是所有功能部件共同使用一个保留站。

7.3 保留站与寄存器的关系

流水线结构的讨论:可以分为:
1.从保留站组织的角度来讨论
2.从保留站和寄存器关系的角度来讨论流水线结构。
第二个角度展开来讲,是从指令流水线中指令什么时候读取寄存器的值的角度,保留站和寄存器的关系有两种情况:
1.进入保留站之前读寄存器
2.指令在进入保留站之后读寄存器

7.4重命名寄存器的组织

寄存器重命名技术在乱序执行流水线中的两个作用:L
1.消除指令之间的寄存器读后写相关和写后写相关 WAR(write after read)和WAR
2.当指令执行发生例外或转移指令猜测错误而取消后面的指令时可以保证现场的精确。
思想:一条指令写某一个结果寄存器时候不直接写到这个结果寄存器,而是先写到某个中间寄存器过渡一下,在这条指令提交的时候在写入结果寄存器。
保证:执行可以乱序,修改结果寄存器时候是有序的。

寄存器重命名方法:

1.第六章的软件寄存器重命名
2.硬件寄存器重命名
2.1从重命名寄存器组织方式上看,硬件寄存器重命名大致可以分成两类:
一是把重命名寄存器(程序员不可见的微结构寄存器)和结构寄存器(程序员可见的逻辑寄存器)分开;
二是不把重命名寄存器和结构寄存器分开

先介绍第一种情况:重命名寄存器可以与保留站或者ROB结合在一起,也可以使用专门的重命名寄存器。指令在写回运算结果的时候只写回到重命名寄存器,在提交的时候再把运算结果从重命名寄存器读出来写回到结构寄存器中。

第二种寄存器重命名方式:不分开重命名寄存器和结构寄存器,把两者结合到一起形成一个比较大的物理寄存器堆,并为每条指令的目标寄存器动态分配物理寄存器。为了保持逻辑寄存器与物理寄存器之间的映射关系,需要建立逻辑寄存器和物理寄存器之间的映射表。
映射表:作用是根据逻辑寄存器找到物理寄存器,或根据物理寄存器找到逻辑寄存器。 实现方式:1.RAM的实现方式(包含逻辑寄存器数目那么多项,以逻辑寄存器号为索引去查映射表里对应哪个物理寄存器) 2.CAM(内容寻址存储器)实现方式,包含物理寄存器数目那么多项,用逻辑寄存器号和每一项比较,匹配的哪一项所指的物理寄存器就是重命名寄存器。

第二种方式即合并的情况下,如何建立逻辑寄存器到重命名寄存器的映射。结构寄存器和重命名寄存器合并后称为物理寄存器(堆)。
逻辑寄存器被动态映射到物理寄存器。指令在译码后进行寄存器重命名时要为该指令的目标寄存器分配新的物理寄存器,并为该指令的源寄存器找到最近一次为该源寄存器分配的物理寄存器。 见p135例子说明
发生例外的情况:比如在第四条指令发生里例外,则第四条指令之后的指令都需要取消,这时候需要确定逻辑寄存器R1的值所在的寄存器。根据ROB中记录的第四条指令的相关信息,在重命名表中标志PR4为与R1对应的结构可见寄存器。这样,以后其他指令访问R1时,就会被重命名到PR4中去。 逻辑寄存器和物理寄存器的映射关系类似操作系统中的虚实地址的映射,不过在寄存器的重命名中,一个逻辑寄存器有可能要对应多个物理寄存器。

结合具体结构分别分析一下两种重命名结构在不同流水阶段的操作以及相关状态转换。
1.独立重命名寄存器结构的分析
重命名寄存器在译码阶段进行分配,在提交阶段进行释放。

该结构与重命名相关的流水线操作:1,读寄存器阶段 2.执行阶段 3,提交阶段
假如发生例外,则取消发生例外指令之后已经建立的重命名关系。具体做法是把结构寄存器的状态都改为有效,把重命名寄存器的状态都置为空。

2.使用物理寄存器堆合并结构寄存器和重命名寄存器的情况。
重命名算法的核心是重命名表的构造。构造方法可以用CAM或者RAM的方法。假设使用CAM结构来构造重命名表

重命名表:假设使用CAM结构来构造的重命名表
1.数量:重命名表的项数与物理寄存器的数目一样多
2.每项主要包括3个域:1.name域:表示所映射的逻辑寄存器号
2.valid域: 表示当同一个逻辑寄存器对应多个物理寄存器时最新的映射。
3.state域:表示重命名映射的状态,其中EMPTY状态表示该寄存器没有被重命名,MAPPED状态表示已经被重命名但结果还没有写回,WRITEBAKCK状态表示结果已经写回重命名寄存器但还没有提交成为结构寄存器,COMMIT状态表示结果已经提交成为结构寄存器。
流水线操作:
在译码阶段:为指令目标寄存器分配一个空闲的物理寄存器,把新分配寄存器的状态置位MAPPED。为源寄存器根据依赖关系查找映射表并找到相应的物理寄存器号,并把重命名后的寄存器号随指令写入保留站中。在读寄存器阶段,判断保留站中的指令所需要的操作数是否已经准备好,准备好后发射到功能部件中执行,在发射的过程中读取物理寄存器,在前递的情况下从结果总线获取写回的值。

7.5乱序执行的流水线通路

1.搞清楚几个点:
保留站的作用是能够乱序执行指令。
ROB的作用是能够有序结束指令
3.重命名寄存器可以与ROB或保留站结合,也可以与结构寄存器结合形成物理寄存器堆等。

如何挖掘指令并行性:通过流水线,乱序执行,多发射等等。

7.6 多发射结构:

就是流水线的每一级都能同时执行多条指令的结构。如果把但发射结果比作单车道马路,多发射结构就是多车道马路。

与单发射结构的区别:
1.它的指令和数据通路变宽了。比如 寄存器端口变多了,访存端口也要增加。
2.数据cache通过倍频来实现的两个访问端口,即数据cache的频率是处理器时钟频率的两倍,每拍能访问两次数据cache.
3.弊端:在流水级各个阶段同一拍中进行操作的多条指令之间可能村上在相关性。 查重命名表时,只考虑到了这一拍发射的指令跟上一拍指令的相关性,没有考虑到同一拍发射4条指令之间也有相关性。多条指令在同一拍进行寄存器重命名时,不仅要查找上一拍形成的重命名表,而且还要照顾互相之间的数据相关关系。

在每一拍的操作:
第一步:重命名逻辑同时为4条指令的目标寄存器和源寄存器进行重命名,为每条指令的目标寄存器分配新的物理寄存器;为每条指令的源寄存器和目标寄存器在重命名表中查找对应的物理寄存器。为目标寄存器查找对应的物理寄存器的原理是在指令提交阶段时,需要释放该物理寄存器。
第二步:第二条指令看自己的源寄存器及目标寄存器号是否跟第1条指令的目标寄存器号相等,如果相等就要用给第1条指令的目标寄存器新分配的物理寄存器号来代替自己从表中查出的物理寄存器号。
遵循的原则就是,如果相等,就重命名到里自己最近的指令的目标寄存器新分配的物理寄存器。

常见的处理器流水线结构:
两组组合用的最多:
1.独立保留站、保留站前读寄存器和独立的重命名寄存器
2.分组保留站、保留站后读操作数和物理寄存器堆重命名

7.8 小结

指令级并行包括流水线,多发射,乱序执行3个方面。指令的乱序执行技术包括动态调度和寄存器重命名两个方面。

保留站、重命名寄存器和重排序缓存是乱序执行指令流水线的核心装置。

多发射结构在流水线的每一级都能同时执行多条指令。多发射结构和单发射结构的区别首先在于它的指令和数据通路变宽了。此外,同一拍发射的指令间的相关性会增加多发射结构的复杂性

上述为该教材第二大部分:指令流水线

第8章: 转移预测 运算部件 cache 和存储管理 4个部分 处理器模块级结构

8.1 转移指令

1.程序中转移指令引起的控制相关,是与程序计数器PC的相关,和普通的寄存器相关不一样。

假设在在一个简单的5级流水线中,
如果使用专门的地址运算部件把地址计算提前到译码阶段,就可以少等1拍。
如果采用延迟槽技术并且转移指令的延迟槽指令的执行不受转移指令执行结果的影响,就可以不用等待。但在多发射结构中会成为兼容的负担。

现代处理器普遍采用转移预测的方法来减少因控制相关引起的阻塞,即不等转移指令执行,就在指令流水线的取值或译码阶段根据转移指令的地址和内容预测转移方向和转移目标,并根据预测的结果继续取指令。 结果:在猜对的情况下不用阻塞流水线,在猜错的情况下取消该转移指令后面指令的执行。

转移指令有条件/无条件,直接/间接,相对/绝对3种属性。

8.2 程序的转移行为:

分支是可以预测的。分支的可预测性主要包括:
1.单条转移指令的重复性,
2.不同转移指令之间的相关性
3.以及函数调用的递归性等。

单条转移指令的重复性主要与程序中的循环有关。如for;while等等

转移指令的相关性主要出现在“if else”结构中。 两个分支的条件基于相同或相关的信息,后面分支的结果基于前面分支的结果。 相关性包括 方向相关和路径相关。

方向相关:
路径相关:

8.3软件方法解决控制相关:

1.最简单的方法:一碰到转移指令就阻塞取指,直到确定转移条件和目标。在5级简单流水线中,可以用转移的延迟槽容忍延迟。
2.循环内相关,循环间相关。

循环展开、 软流水 、 条件指令

8.4硬件转移预测技术

1.转移预测的基本思想:

静态预测: 总是预测转移成功或总是预测转移不成功;
动态预测:根据转移指令执行的历史进行预测,较精确却比较复杂:
混合预测:likely转移指令,可以利用编译器的提示进行静态预测,编译器不提示时进行动态预测。
转移预测机制的性能取决于3个因素:预测精度、正确预测的延迟以及转移取消的延迟。预测精度越高,能抽取的并行性就越多;但高精度的预测器复杂度也高。 预测器的设计
正确预测的延迟主要与其是在取指阶段还是是译码阶段预测有关。

现代的转移预测器经常在取指阶段根据当前指令的PC值进行预测,并在译码阶段根据译码的结果进行再次预测以纠正取值阶段的预测结果。
既然是预测,就不是必然,就会有错误。转移预测都是根据历史记录预测未来。因此,如何记录转移历史、记录哪些转移历史、记录多少转移历史是转移预测需要研究的关键技术。
转移预测错误取消后续指令时,需要保证现场的精确性。
一是在指令流水线中增加提交流水级,确保在指令提交时,才能修改寄存器(通过寄存器重命名)和内存(使用write buffer机制),以便于指令提交前可以根据需要来取消该指令。
二是要识别流水线中哪些指令需要取消,哪些不需要取消。
转移取消和由于例外引起的取消不一样,例外取消一般在提交时取消所有后续指令,而转移取消一般在执行后只取消部分指令。
三是避免对I/O指令预测执行,I/O指令一般是对某个地址空间进行访问,例如访问PCI外部设备,即使是读操作也可能修改I/O控制器的状态,一旦完成就难以被取消。

根据上述分析:一个高性能预测机制需要包括:1.减少预测延迟槽(如用根据PC预测的BTB/BTAC等机制);在执行阶段尽早确定转移结果,降低错误预测的开销;在转移预测错误时要有高效的流水线刷新机制;具有高预测精度的转移预测机制等。

2.根据单条转移指令的历史进行基本转移预测。

转移历史表(BHT)中,把每条转移指令的历史记录在转移历史表中,每次转移预测时根据BHT表的内容判断转移方向。一般来说,用12位PC索引4096项PHT表的冲突概率就不大了。
转移模式历史表(PHT):记录同一项上次转移是否成功,1表示转移成功,0表示不成功。PHT表只能预测转移指令的跳转方向,不能预测转移指令的跳转目标。 由于间接转移指令的跳转目标不能直接从指令中获得,因此需要有一种机制对间接转移指令的跳转目标进行预测。
第二个问题是PHT表一般只能在译码阶段使用,因为只使用PC的低位索引,所以在取值阶段使用PHT表有可能把普通指令也当作转移指令进行预测。
转移目标缓存器(BTB):使用CAM结构,转移预测时把当前的PC和BTB表中每一项的PC进行比较,如果相等,则根据相等项的饱和计数器预测是否跳转并读出跳转地址。

3.结合转移指令相关性进行预测的两级转移预测技术:

通常使用转移历史寄存器(BHR)记录程序中所有转移指令的历史。
转移历史寄存器的操作方法:左移,最高位扔掉,最低为如果成功则为1,否则填0. 即m位的BHR记录了处理器m次的转移历史。
把多个BHR组织在一起的表被成为BHT表。

4.BHR和PHT表(Pattern History Table 转移模式历史表)结合使用可以做到既考虑单条转移指令的转移历史,又考虑到转移指令之间的相关关系。
BHR可以分为3种情况:PABHR 每条转移指令都有自己的BHR
GABHR所有指令共用一个BHR
SA表示用PC的低位索引BHR。
PHT表的组织也可以分为3种情况:只用BHR索引PHT表,用g表示,
用PC和BHR一起索引PHT表

5.分支别名干扰问题

1.转移预测精度不能提高的主要原因:1.不同转移指令使用同一个PHT,造成分支别名干扰。为了解决分支别名干扰问题:
(1)Agree预测器
(2)Bi-Mode分支预测器

组合分支预测器:

第九章:功能部件

1.运算部件:进行加减乘除的部件
计算机中的定点数一般采用补码编码,浮点数遵行IEEE754标准。
主要介绍 定点补码加法器的设计,ALU部件的设计,以及定点补码乘法器的设计。

9.1定点补码加法器:

常见的加法器:RCA,CLA,CSKA,CSLA,CIA等。
1.全加器 每个全加器 2~3级的门延迟
2.串行进位加法器 把多个全加器串接起来。形成C16需要32级门延迟
3.先行进位加法器 通过加快进位传递以加快加法速度的加法器,思想:先并行计算每一位的进位,由于每一位的进位已经提前算出,计算每一位的结果时候,只要将本地和与进位相加即可。 改进方法:将加法器分成若干个相同位数的组,组内部通过先行进位的方法计算进位,组间可以通过串行进位或并行进位的 :块内并行,块间串行 如将4个4位并行进位加法器串联,就可以得到16位加法器。

4. 用加法做减法

定点数都是用补码存储的,补码减法可以通过加法来实现。补码运算有如下性质:

第十章:高速缓存

计算机系统结构持续的研究热点:
1.转移猜测技术
2.高速缓存(cache)技术
IPC(每拍执行的指令数)

10.1 存储层次

CPU和内存的速度差距造就了存储层次,模糊了CPU和内存的界限,使得CPU的内容发生了变化。
在工厂里面做一个小仓库,也就是在CPU里面加上高速缓存。

运算器和控制器合称中央处理器,为了缓和访存的瓶颈,已经把部分存储器的映像做在片内,所以现在的CPU是运算器+控制器+部分存储器映像。

两个规律:1.容量大的速度慢;容量小的速度快。而且相同容量下,速度越快的价格越贵。2.计算机运行的程序也有个规律,就是程序访问有局部性,包括时间局部性和空间局部性。
什么是时间局部性
什么是空间局部性

计算机的存储层次: 分为寄存器级 ,cache级,存储器级和I/O设备级.

10.2 cache结构

cache没有独立的编程空间,是内存的一个子集。因为它是子集,任一时刻只能存储一部分,所以一个cache单元可能在不同时刻存储不同内存单元。
需要一种机制来区分某个cache单元当前存储的是哪个内存单元的内容。
所以cache的每一个单元既要存储数据,又要存储该数据的内存地址和在cache中的状态。

cache存储的数据以cache块为单位,一般为32或64字节等;每个cache块都要在cache中保存它的地址,就是所谓的cache标签(Tag);此外还要为每个cache块记录状态(state),包括该块是否有效,有没有被改写等。
cache的结构原理图:
命中,直接访问cache,不命中,说明数据不再cache中,而是在内存,此后就要用到替换机制和写回机制了。
cache的特点和分类:
分类: 直接相联,全相联,组相联。

第一个方面:cache块的位置 :直接相连 全相联 组织相联
第二个方面:cache跟内存的数据关系 :写策略(写直达,写回),
写直达:处理器写cache的同时写回内存 写回 处理器只写cache,不写回到内存,被替换时再写回内存。
第三个方面:cache 的替换机制(随即替换,先进先出替换,最近最少使用替换(LRU))

衡量CPU性能的唯一标准是运行程序需要多少时间。
CPU时间=ICCPICycleTime,其中,IC是程序中指令的条数,CPI是CPU执行每条指令需要的平均周期数,CycleTime是CPU的时钟周期。

10.3 Cache性能:

1.降低失效率 :3C失效 4C失效
2.降低失效开销
3.减少命中时间
4.提高cache访问效率

降低cache失效率最简单直接的办法是增大cache容量.
增大容量的问题:1.增加芯片面积,有些处理器中cache已经占了80%以上的面积。另外cache越大,访问cache的延迟就越长,结果会导致主频降低或者访问拍数增加。
选择合适的cache块大小也可以提高cache命中率。增加cache块大小可以利用处理器访问内存的空间局部性。 预取功能,但弊端当cache块越大时,相同容量的cache能放的块数就越少,浪费了cache容量。
直接相联主频高但命中率低,组相联命中率高但主频低。

两者结合的方法:路预测(伪相联技术)

通过软件优化提高cache命中率

2.降低延迟失效:
失效延迟过长,即使在乱序执行的流水线中,cache失效也容易引起流水线的堵塞。指令提交是有序的,cache失效的指令及其后面的指令都在重排序缓存中等待提交,容易导致重排序缓存堵塞;另一方面在取数指令把数据取回来之前,后面需要使用该数据的运算指令此时就不能被送到运算部件执行,也容易导致保留站堵塞。
这就要求在cache失效的情况下降低失效开销

降低失效开销的方法包括: 读优先,关键字优先,写合并,Victim cache 多级cache等。

1.读优先:
2.关键字优先:6 7 0 1 2 3 4 5 实现关键字优先 只需要对访问地址进行简单变换
3.写合并:把多个对同一个cache块的写失效,通过拼接合并在一起。
4.Victim cache 。 主要针对直接相联结构中冲突比较严重的问题而设计。
其主要思想是在cache替换时,把最近被替换的一个或几个cache块保存在一个较小的Victim cache块中
5.多级cache。通过多级cache来降低上一级cache的失效延迟。在二级cache情况下,前数的平均访存延迟公式可以扩展为:

3.降低命中延迟

cache命中延迟对处理器性能的影响包括两个方面:
一是cache访问延迟对处理器主频的影响,因为在处理器中,cache访问通常都是决定处理器主频的关键路径。
二是cache访问所需要的时钟周期数决定指令流水线的 load-to-use延迟,对指令流水线的效率将产生重要影响。
降低cache命中延迟的方法包括:
简化cache设计
采用虚地址cache等

(1)简化cache设计。简化cache设计包括减小cache容量,降低cache相联度等。
(2) 虚地址cache。 虚地址cache是降低处理器cache命中延迟的有效办法。
访问cache包括 地址计算,查找TLB把虚拟地址转化为物理地址,用物理地址访问cache3个阶段。其中,访问cache又包括读cache,Tag比较,根据比较结果选择阶段。

上述过程延迟很长,必然导致时钟周期长或load-to-use的拍数多,影响流水线的性能。
用数据前递方法直接把从cache中读出的数据送到运算部件,而不是先写回到寄存器再从寄存器读出后送到运算部件。
虚地址cache则通过并行访问TLB和cache来降低访问cache的延迟。

如果cache索引的最高位超过页内地址的最高位,则在虚地址cache中有可能存在同一块数据由于虚地址cache索引的不同在cache中有多个备份的情况,这就是cache别名。

4.提高cache访问效率
(1)非阻塞cache:访问cache失效的指令不能阻塞后续的cache访问。
比较指令流水线乱序执行需要保留站机制一样,实现非阻塞cache需要通过访存队列(相当于访存保留站)等机制来实现访存指令的乱序执行,而且在每一级存储层次都需要类似的机制来实现非阻塞cache。

(2)预取。 硬件预取和软件预取 。 硬件预取由硬件自动完成,可以直接取到cache中,也可以去取回来放在流缓存(Stream Buffer)中。下次再失效时先查找流缓存,常常可以直接在流缓存命中。流缓存是常用的预取结构,根据访问历史进行预取,有时候预取连续的块,有时候根据固定步长预取后续的cache块。

预取指令:提前把数据取到寄存器或cache中 。很多处理器都提供专门的预取指令,也可以把取到0号寄存器的指令作为预取指令。预取地址可能计算的不准备。
数据cache和指令cache都是32KB,两路组相联,访问延迟只有2拍。

通过以cache为核心的存储层次来降低存储器的平均访问延迟。

第11章:

MMU(处理器的存储管理部件) 支持虚实地址转换,多进程空间等功能,是通用处理器中体现“通用性”的重要单元。
核心是CPU如何支持操作系统,操作系统怎么跟CPU进行交互

虚拟存储是实现从以进程为单位的虚拟地址空间到统一的系统物理地址空间映射的一种机制。

操作系统以页为单位进行从虚地址空间到物理地址空间的映射。
如同 cache是以块为单位,由硬件自动完成cache块在内存和cache之间的搬运。
页在内存和硬盘之间的搬运是由软件完成的,页大小通常为2的幂次方,比cache块要大得多。 为了实现从虚拟存储空间到物理空间的映射,操作系统要为每个进程建立一个页表来记录虚拟页和物理页的对应关系。

用硬件来实现一个快速转换缓存(TLB)用以实现快速的虚实地址转换。
TLB也称为页表缓冲或者快表,用于存储当前处理器中最经常访问页的页表,相当于操作系统页表的一个高速缓存。

处理器的虚实地址转换过程如图11.1所示。

11.2 MIPS处理器对虚存系统的支持

11.1节

多进程环境下每个进程可以有独立的编程地址空间。
虚拟存储技术:为进程提供比物理内存大得多的寻址空间,每个进程运行在其独立的虚拟地址空间中,不同进程的虚拟空间不会互相影响。另外,虚拟存储技术还提供了内存映射,公平的物理内存分配和共享虚拟内存等功能。

虚拟存储还支持多进程环境下的内存的共享和保护,即各个进程之间可以共享数据,并得到必要的保护。

1.实现以进程为单位的虚拟地址空间到统一的系统物理地址空间映射的一种机制。
2.由于要把有限的内存分配给多个进程使用,在内存放不下时需要把内存的内容临时放到硬盘的交换区上,内存中只保留当前CPU最常用的程序和数据,相当于把

为了实现从虚拟存储空间到物理空间的映射,操作系统需要为每个进程建立一个页表来记录虚拟页和物理页的对应关系。

处理器访问内存时,Load和Store指令使用的是虚地址,需要有一种快速的机制把虚地址转换成物理地址,然后到cache或内存中访问。虚拟地址空间和物理地址空间都是以页为单位的。TLB也称为页表缓冲或快表。

进程的作用:把有限的内存分配给多个进程使用。
页表的作用:为每一个进程建立一个页表来记录虚拟页和物理页的对应关系。

虚拟地址空间和物理地址空间是以页为单位进行应当设的,虚地址到物理地址的转换也以页为单位。

处理器访问内存的时,Load和Store指令使用的是虚地址,需要有一种快速的机制把虚地址转换成物理地址,然后到cache或内存中访问。虚拟地址空间和物理地址空间是以页为单位进行映射的,虚地址到物理地址的转换也以页为单位。 页表的一个高速缓存TLB

进程号 虚页号 物理页号 有效位 以及保护位等。
操作系统根据虚拟地址查找页表时,

RISCV代码解析: 模块划分:
utils 查找树
SignExt
ZeroExt
bool2int
4.5节 4.10 4.11节
类比,洗衣工作
流水线,提高吞吐率(throughput)
如果每个步骤时间相同,工作足够多,时间足够长,加速比则为流水线中步骤的数目:
比如:洗涤,烘干,折叠,收起 4个步骤 流水线比非流水线方式的速度比是4倍

RISCV

五个步骤:
1.取指
2.译码
3.执行
4.访存
5.写回

1.单周期指令执行(每个指令执行需要一个时钟周期)
2.操作时间的概念:指令或数据存储器的访问需要200ps,ALU200ps ,寄存器堆的读或写100ps
单周期模型中,每条指令的执行都需要一个时钟周期,所以时钟周期必须满足最慢的指令。
3.指令执行时间(流水线)=指令执行时间(非流水线)/流水线级数 eg:5级流水线带来的加速比接近5,实际上算上其他的开销,可能略小于5
6.流水线技术是提高指令吞吐率来提高性能的,而不是减少单个指令的执行时间.

4.5.2流水线冒险:
1.三种冒险,结构冒险,数据冒险,控制冒险
结构冒险:比如只有一个存储器,可能会发生第一条指令在从存储器取数据的时候,第四条指令也从改同一存储器中取指令,流水线会发生结构冒险。
2.数据冒险:
add x19,x0,x1
sub x2,x19,x3
解决方案:前递或旁路,提前从内部缓冲中取到数据,而不是等数据到达程序员可见的寄存器或者存储器。
eg: IF ID EX MEM WB
寄存器和存储器 左半部分阴影表示被写,右半部分阴影表示被读。
图4.27 前递例子。
以及前递中load例子,载入-使用型数据冒险(load-use data hazard) ,正式叫法 流水线停顿,俗称气泡(bubble)

尽量利用 代码重新排序或者硬件检测和停顿来尽量避免使用载入-使用型流水线停顿。
“前递的思想’ :前一条指令直接传递给后一条指令
”旁路的思想“:将结果绕过寄存器堆,直接传递给需要它的单元的思想。

控制冒险:

分支预测方法:
静态预测,动态预测

4.6流水线数据通路和控制

指令划分为五个阶段:(意味着:1.五级流水线,2,在任意单周期里最多执行五条指令)
1.IF
2.ID
3.EX
4.MEM
5.WB
以上五个阶段相应的把数据通路也划分为五个部分,每个部分用对应的指令执行阶段来命名。

在从左到右的指令流动过程中存在两个特殊情况:
1.在写回阶段,它将结果写回位于数据通路中段的寄存器堆中 (会导致数据冒险)
2.在选择下一PC值时,在自增PC值与MEM阶段的分支地址之间进行选择 (会导致控制冒险)
3.一种表示流水线数据通路和如何执行的方法是假定每一条指令都有独立的数据通路。
4.引入寄存器保存数据:
eg: 指令存储器只在指令的第一个阶段是用,而在其他四个阶段中允许被其他指令共享,为了保留在其他四个阶段中的指令的值,必须把从指令存储器中读取的数据保存在寄存器中。 这样就把每一条指令单独的数据通路可以归纳共享一条指令通路。

流水线数据通路:
1.流水线寄存器,所有指令都会在每一个时钟周期里从一个流水线寄存器前进到下一个流水线寄存器中。寄存器的名称由两个被该寄存器分开的阶段的名称来命名,例如,IF和ID之间的流水线寄存器被命名为IF/ID。 位宽必须足够大,例如 IF/ID寄存器的位宽必须为96位,同时存储Inst(32)和PC地址(64).
2.PC可以看作一个流水线寄存器,给流水线的IF阶段提供数据,不过PC是体系结构状态的一部分,在发生例外时,PC中的内容必须被保存。

图4.34-4.37 显示加载指令在通过流水线的五个阶段时数据通路高亮的活动部分。加载指令在五个阶段都是活跃的

指令LD在每一幅图中的活跃流水阶段

读 高亮寄存器右半部分,写 高亮寄存器左半部分。

1.取指

1.PC地址分两块,第一部分PC地址自增4,然后写回PC,为下一个时钟周期做准备。第二部分PC值保存在IF/ID流水线寄存器中,以备后续的指令使用(例如beq)。

2.译码和读寄存器堆


传递的是一个64位符号扩展的立即数,和两个将要读取的寄存器编号,以及PC地址。 向右传递的这几个可能在以后的时钟周期指令用得到的信号

3.执行或地址计算


加载指令从ID/EX流水线寄存器中读取一个寄存器的值和一个符号扩展的立即手术,并且使用ALU部件将他们相加,它们的和被存储在EX/MEM流水线寄存器中。

4.存储器访问:


使用来自EX/MEM流水线寄存器中的地址读取数据存储器,再将数据存入MEM/WB流水线寄存器当中。

5.写回:


从MEM/WB流水线寄存器中读取数据,并将它写入图中间的寄存器堆中。

存储指令在每一幅图中的活跃流水阶段

1.取指


与LD指令同理,该第一个阶段因为此时指令还未被识别,

2.译码和读寄存器堆


第二个流水阶段,因为此时还不知道指令的类型,所以所有的指令都会执行这两个阶段。

3.指令执行和地址计算

4.存储器访问


在MEM阶段获得要写入的数据的方法就是在EX阶段将该数据放入EX/MEM流水线寄存器当中,和有效地址一样一起放入EX/MEM流水线寄存器当中。

5.写回


说明:
1.后续的流水线阶段需要用到的相关信息是从前面的流水线阶段传递过来的,因此需要将相关的信息放入流水线寄存器中一层一层传递下来。比如存储指令:需要将在ID阶段读取到的寄存器信息传递到MEM阶段,然后写入存储器当中,这些数据最初在ID/EX流水线寄存器,最后被传送到EX/MEM流水线寄存器当中。
2.在流水线数据通路设计中的每一个逻辑部件(质指令存储器,寄存器读端口,ALU,数据存储器,寄存器写端口等)只能在单个流水线阶段使用,否则会发生结构冒险。这些部件以及对它们的控制只能与一个流水线阶段相关联。
3.加载指令的设计改进,因为加载指令指令最后要返回写到寄存器堆的RD寄存器中,但原本设计中的流水线寄存器MEM/WB中并未保存RD寄存器编号,而此时IF/ID阶段的流水线寄存器提供的RD寄存器编号是后续指令当中的,因此,这里会发生RD寄存器编号错误。 办法:将目标寄存器编号从流水线寄存器中一级一级往下传递到MEM/WB流水线寄存器。 或者换一个角度来说,为了共享流水线数据通路,我们需要在IF阶段保存读取的指令。每个流水线寄存器都要保存当前阶段和后续阶段所需的部分指令信息。

4.6.1流水线的图形化表示

1.每个流水线阶段使用的物理资源
2.每个流水线阶段的名称
3.多时钟周期流水线图 以及单时钟周期内整个数据通路的状态

4.6.2流水线的控制

如何根据ALUop控制位和不同的R型指令操作码来设置ALU控制位

暂时定义的自己使用自己的方法来控制处理器。

4.7数据冒险:前递与停顿

寄存器堆的硬件设计:
前提:潜在的冒险:
一个寄存器在同一个时钟周期内,既被读取又要被写入, 这时假设写操作发生在时钟周期的前半部分,而读操作发生在后半部分。所以读操作会得到本周期内被写入的值。这种情况下就不会发生数据冒险。

前递:一得到相应的数据就将其前递给等待该数据的单元,而不是等待其可以从寄存器堆中读取出来,就可以不需要停顿的执行这段指令了,
前递如何工作:暂时只考虑如何解决将EX阶段产生的操作数前递出去的问题,该数据可能是ALU或者有效地址的计算结果。
流水线寄存器字段:可以更精确的表示相关关系的方法:
例如:ID/EX.RegisterRs1 表示一个寄存器的编号。点号的右边是寄存器中字段的名称
优点:可以进行相关性的检测,得到两对冒险的条件。

比如:
sub x2,x1,x3
add x12,x2,x5
这个冒险就可以在and指令位于EX阶段(往右边数),sub指令位于MEM阶段时被检测到,因此这种属于1a类型冒险.

缺点:并不是所有的指令都要写回寄存器,所以这个策略是不正确的。,有时会在不该前递时候也将数据前递出去。
前递的两个问:
1.假设x0为目标寄存器 (给两对冒险加上相应的不等于0的条件 eg:MEM/WB。RegisterRd !=0)
2.前递正确的数据
寄存器堆前递:假设寄存器堆可以前递在同意始终周期内要被读写的数据,即读操作获得的值是本时钟周期内写操作的结果,前半段为一个值,后半段也为一个值,正确的值只不过是通过流水线寄存器传递得到的。
3.前递机制:
RS1 和RS2 和RD ForwardA ForwardB

数据冒险与停顿

计算机体系结构学习零碎记录相关推荐

  1. 计算机体系结构学习 --- RISC-V(一)

    计算机体系结构学习 --- RISC-V(一) 1.Instructions for making decisions 条件语句实际上有6种类型,最基本的有两种: beq rs1,rs2,L1 //若 ...

  2. 【学习笔记】高性能计算之胡伟武《计算机体系结构基础》(第三版)

    自2022年3月1日起每天更新,3.3已更新至第三章 写在前面 1. 引言 1.1 计算机体系结构的研究内容 1.2 衡量计算机的指标 1.3 计算机体系结构的发展 1.4 体系结构设计的基本原则 2 ...

  3. 《操作系统》OS学习(四):计算机体系结构、内存层次和地址生成

    计算机除了计算能力之外还有存储能力,存储能力即计算机拥有一系列的存储介质,我们可以在存储介质上存储我们的代码和数据.计算机体系结构中约定了哪些地方可以用来存储数据:CPU内的寄存器.内存和外存.不同的 ...

  4. 《计算机体系结构:量化研究方法》5th 学习笔记

    本书的目的 权衡:成本-性能-功耗 新平台:个人移动设备和仓库级计算机 新体系结构:多核和GPU 关于第五版 两个极端:以移动电话和平板电脑到的个人移动设备PMD 为客户端,以提供云计算的仓库级计算机 ...

  5. 新书推荐 |《当计算机体系结构遇到深度学习:面向计算机体系结构设计师的深度学习概论》...

    新书推荐 <当计算机体系结构遇到深度学习:面向计算机体系结构设计师的深度学习概论> 长按二维码 了解及购买 计算机体系结构新黄金时代赋能深度学习革命的入门书. 基于美国哈佛大学在深度学习和 ...

  6. OS学习笔记-5(清华大学慕课)计算机体系结构与内存层次

    计算机体系结构与内存层次 内存最小的访问单位是1B=8bit,每个字节都有自己的物理地址 总线一般是一次读取4B=32bit cpu里面有高速缓存cache和寄存器作为存储帮手 访问速度最快的是几纳秒 ...

  7. 记录软考上午题1计算机系统之1.2 计算机体系结构及真题

    1.2 计算机体系结构 1.2.1 计算机体系结构的发展 1.计算机系统结构概述 2.计算机体系结构分类 3.指令系统 CISC和 RISC 真题 流水线公式 流水线概念 真题 1.2.2 存储系统 ...

  8. 【趋势】未来十年计算机体系结构的历史和趋势

    来源:机器之心 先分享我对这篇文章的总结,或者我得到的启发: 1.DSA (Domain-Specific Architectures,特定领域的体系结构) 将成为未来十年甚至更长时间,计算机体系结构 ...

  9. <Linux>计算机体系结构和操作系统

    计算机体系结构(冯 • 诺依曼体系)和操作系统(Operator System) 文章目录 计算机体系结构(冯 • 诺依曼体系)和操作系统(Operator System) 一.冯 • 诺依曼体系结构 ...

最新文章

  1. 极客新闻——08、高效团队善用的3个敏捷方法
  2. VIT自适应语音转文本可预测长度和内容(ocr也可)
  3. Android单元测试全解
  4. [TJOI2017]城市(未解决)
  5. harfbuzz安装位置 linux_最新Ubuntu 20.04 LTS已发布,在Win10中该如何进行安装和使用?...
  6. Linux安装setuptools
  7. cad加载dll_你的CAD为什么安装不上?进来看看你就知道了
  8. 带“公交一卡通功能”的智能手环会是用户最爱?
  9. Java中的断言assert的用法
  10. c++实现秒数转化为天数,小时,分钟,秒
  11. 【学习目录】天天生鲜项目页面设计
  12. linux双网卡同时访问内外网
  13. 南师大计算机专硕士复试分数线,南京师范大学2020年硕士研究生复试分数线的通知...
  14. Layer Norm
  15. 小米无线键盘的连接方式
  16. jdbc,基本数据库命令封装
  17. iOS之Block报错:capturing 'self' strongly in this block is likely to lead to a retain cycle
  18. 优秀员工的十二种品质 - 马云在上海演讲说的话
  19. 手机屏幕弹幕纵向滚动,添加弹幕实时滚动html demo
  20. R语言绘制QQ图实战(qqplot函数、qqnorm函数、qqline函数)

热门文章

  1. 腾讯游戏平台下载|腾讯游戏平台下载
  2. fMRI基础理论知识学习
  3. 动态电源路径管理(DPPM)技术
  4. z-library应急办法
  5. Qt实用技巧:VS2017编写纯C库以及使用Qt调用C库方法
  6. mysql关于or的索引问题_SQL优化 MySQL版 - 避免索引失效原则(二)
  7. 未来十年大数据方向就业及薪资报告
  8. 瑞吉外卖(3)—菜品分类管理
  9. C++/C++11中std::numeric_limits的使用
  10. Group Knowledge Transfer: Federated Learning of Large CNNs at the Edge部分阅读