- 博客(130)
- 收藏
- 关注
原创 RISC-V vector(1) --- vector的引入与register说明
在有些处理器中,会采用寄存器重命名的技术,比如超标量流水线处理器,在undisturbed策略下,必须从旧的物理目标向量寄存器中读取元素值,才能复制到新的物理目标寄存器中;也可以说,在新的物理寄存器进行重命名时,需要根据重命名映射表,查到原有的映射关系,然后把其中的元素值读出来,写到重命名后的对应元素。vl的宽度由最小元素宽度(SEW)和最大向量长度决定,其中SEW规定了指令执行元素的宽度,最小为8,最大向量长度为组成的最长的向量寄存器组,由VLMUL决定,最大为8。vxsat位在vcsr中有镜像。
2024-08-23 17:33:36
931
原创 RISC-V中的acquire和release
RISC-V中,有两类原子操作指令:⚫ 内存原子操作(AMO)⚫ 加载保留/条件存储(load reserved / store conditional)此处我们先看下LR和SC指令;
2024-08-22 19:48:39
696
原创 Snooping Coherence Protocols
值得注意的是,响应消息不会影响一致性事务的序列化。从逻辑上讲,无论响应何时到达请求者,当请求被排序时,都会发生一个由广播请求和单播响应组成的一致性事务。请求出现在总线上和响应到达请求者之间的时间间隔确实会影响协议的实现(例如,在这个间隙期间,是否允许其他控制器请求此块?由于响应消息携带数据,因此比请求长得多,因此能够在更简单、成本更低的网络上发送它们有很大的好处。到目前为止,我们只讨论了一致性请求,而不是对这些请求的响应。作为一个具体而简单的例子,考虑一个使用总线来广播一致性请求的系统。
2024-08-05 15:01:24
537
原创 TAGE predictor
TAGE是现今最经典的分支预测算法,TAGE及其后续的变体都是当今高性能微处理器的分支预测算法基础。因此,要聊分支预测算法的话题必定绕不开TAGE。
2024-07-09 14:51:30
777
原创 TLB&Cache的联合设计
如果 Cache 缺失,那么就仍旧需要使用 TLB 来将虚拟地址转换为物理地址,然后使用物理地址去寻址L2 Cache,从而得到缺失的数据(在现代的处理器中,L2及其更下层的Cache都是物理Cache),这个过程如图3.42所示。此时Cache容量小于或等于一个页的大小,直接使用虚拟地址中的[L+b-1:0]部分来寻址Cache,找到对应Cache line中的数据,并将这个Cache line的Tag部分和TLB转换得到的PFN进行比较,用来判断Cache是否命中。访问 TLB 和 Cache 是。
2024-05-31 15:15:12
857
原创 virtual cache基本概念
使用这样的方式,要从虚拟地址中得到需要的数据,相比于两级页表,需要多一次物理内存的访问,这会造成TLB缺失的处理时间变长,是使用ASID带来的一个负面影响,尤其是 TLB 缺失发生的频率很高时,这种负面影响更为严重。这是因为,不同的进程,会存在很多相同的虚拟地址,这些虚拟地址实际上对应的物理地址是不同的,当进程之间进行切换时,如果还是映射到上一个进程的物理地址,肯定是会有问题;● 浪费了宝贵的cache空间,造成cache等效容量的减少,降低了整体的性能;同样考虑8KB, 直接相连的cache;
2024-05-31 09:59:47
922
原创 mmu之TLB的来源与实现
因此需要在页表中,对每个被修改的页加以标记,称为脏状态位(dirty),当物理内存中的一个页要被替换时,需要首先检查它在页表中对应PTE的脏状态位,如果它是1,那么就需要先将这个页写回到硬盘中,然后才能将其覆盖。比如,当发生TLB缺失时,需要从页表中将一个新的PTE写到TLB中,如果TLB此时已经满了,那么就需要替换掉TLB中的一个表项,也就不再记录这个页的映射关系,但是这个页的内容在 D-Cache中仍旧是存在的。这个问题或者转换成:在D-cache中保存的数据,一定是在TLB中的记录范围吗?
2024-05-29 16:04:23
1043
2
原创 虚拟化概述
正常场景处理器送出的虚拟地址(VA)首先送到 MMU中。MMU使用页表的基址寄存器PTR和VA[31:12]组成一个访问页表的地址,这个地址被送到物理内存中。物理内存将页表中被寻址到的 PTE 返回给 MMU.MMU判断PTE中的有效位,发现其为1,也就表示对应的页存在于物理内存中,因此使用PTE中的PFN和原来虚拟地址的[11:0]组成实际的物理地址,即PA=(PFN, VA[11:0]},并用这个地址来寻址物理内存,得到最终需要的数据。
2024-05-29 12:07:11
1185
原创 分支预测的地址跳转
因此,到目前为止,对于分支指令的目标地址的预测,有下面的三种方法。这些方式都是在取指阶段,利用pc值来进行;(1)使用 BTB 对直接跳转(PC-relative)类型的分支指令和 CALL 指令进行预测;(2)使用RAS对Return指令进行预测;(3)使用 Target Cache 对其他类型的分支指令进行预测。尤其是对于BTB和RAS, 几乎是现代的超标量处理器必须要使用的。
2024-05-24 15:44:17
1039
原创 浮点数的乘法处理
相应地,更新乘积的指数位为:(这里怎么理解?可以理解为,超出多少bit(2的幂次方),则小数点移位后,需要在阶码上增加幂次方)因为乘法会使得位数扩大,比如,两bit数相乘,最终得到最多4bit数,会超出浮点数的表示范围;这里的乘法,其实已经不涉及有符号数无符号数了,只需要做二进制的乘法就可以了;如果超出了浮点数的表示范围,则需要进行规格化,左移小数点,这会导致阶码增加;首先,我们可以得到乘积的符号位为负,因为两个乘数的符号位不同。这个比较好理解,有一个负数,就是负数,否则,就是正数;
2024-05-13 17:03:12
336
原创 coherence protocal基础
文章中的比较简单的,用于举例的一致性我们就直接跳过了,直接讲常用的一致性协议是从哪些方面考虑问题的;一致性协议,主要从states, transactions, events, transitions 4个方面来考虑;
2024-05-10 14:31:41
843
原创 常见的一些RELAXED MODEL CONCEPTS
尽管两个load L1 和 L2 没有明确排序,但 RVWMO 隐式强制执行 L1 -> L2,因为 L1 和 L2 之间存在地址依赖 (address dependency):L1 产生的值被 L2 解引用。这两种 RMW 的原子性语义略有不同。然而,RVWMO 通过隐式强制 Load -> Store 顺序 (L1 -> S1 和 L2 -> S2) 来禁止这种行为,因为每个load和store之间存在数据依赖 (data dependency) 关系:每个load读取的值由接下来的store写入。
2024-05-09 19:36:17
769
原创 Relaxed MemoryConsistency
SC和TSO都被称之为强(strong)保序模型;因此,我们需要一种更宽松的memory consistency model,这些模型试图只保留程序员“需要”的顺序。
2024-05-09 17:47:48
1037
原创 Total Store Orderand(TSO) the x86 MemoryModel
可编程性*:一个良好的模型应该使编写多线程程序变得(相对)容易。这个模型应该对大多数用户来说是直观的,即使是那些没有阅读详细细节的用户也是如此。它应该是精确的,以便专家可以拓展所允许的范围。*性能*:一个良好的模型应该在合理的功耗、成本等条件下促进高性能的实现。它应该给予实现者广泛的选项余地。*可移植性*:一个良好的模型应该被广泛采用,或者至少提供向后兼容性或在不同模型之间进行转换的能力。*精确性*:一个良好的模型应该被精确定义,通常通过数学方式。
2024-05-09 15:55:45
1011
原创 SC的实现原理及方式
最常见的是,软件、核心硬件或缓存硬件请求预取以更改 B 在一级缓存中的状态,以允许通过以下方式加载(例如,B 的状态是 M 或 S)或加载和存储(B 的状态是 M)发出 coherence 请求,例如 GetS 和 GetM。更一般地说,L1 缓存可以满足的操作总是可以同时完成,因为 coherence 的 SWMR 不变量确保它们是不冲突的。coherence可以提高上述SC implemention的并行度,例如,对于非冲突的load/store,带了cohenrence之后,这两个操作可以并行执行;
2024-05-09 14:33:51
1037
原创 SEQUENTIAL CONSISTENCY----SC
使用了SC模型后,表 3.1 程序的所有执行都以 r2 作为 NEW 终止。唯一的不确定性—— L1 在加载值 SET 一次之前加载 flag 为 0 的次数——并不重要。SC这种memory consistency model中,每个core的执行顺序和指令的PO顺序相同;SC模型是最直观的memory consistency model;上面描述的这种指令执行的总的顺序,称之为memory order;<m: memory操作的顺序;<p: program的顺序;最后一个不满足SC;
2024-05-09 10:31:23
307
原创 memory consistency
需要注意的是,store-load reordering, 可能也是因为FIFO write buffer的local bypassing造成的,所以,即使core是按照PO的顺序来执行,也可能导致程序未按照预期执行;对于多线程而言,如果两个core之间,存在相同地址的访问,则可能出现如图所示的各种执行顺序,对程序的执行结果,也会有相应影响;对于单个thread而言,究竟以什么顺序执行无所谓,但是多余多线程,如上图所示,其执行的顺序,就会影响程序预期的结果;或者第二个store可以与更早的进行merge;
2024-05-06 19:54:36
670
原创 coherence的基本概念
Coherence 的定义,无论我们选择哪种定义,仅在某些情况下相关,架构师必须意识到它何时适用,何时不适用。Cache coherence 协议将缓存完全抽象出来并呈现出原子内存的错觉,就好像缓存被移除一样,只有内存包含在 coherence 框内;结束了一个read-only/read-write的epochs, 开始一个read-write epochs;相当于,这种设计,每个core感觉不到cache的存在,每个人都觉得是在跟一个原子内存系统交互;5. coherence的粒度。
2024-05-06 16:45:11
710
原创 Coherence & Consistency的背景
● 在共享内存连贯性模型的情况下,我们会涉及到多个线程的加载(load)和存储(store)操作,这里ISA可以允许多个线程的同时执行;● 因此可能会出现多种不同的正确执行(execution),通常是来自不同线程的指令间的多种合法交错(interleaving)。⭕加载(load)和存储(store)操作的规则;⭕load/store是如何作用到内存中的;定义了这种行为是正确的。需要有一个规则来定义。
2024-05-06 11:57:51
575
原创 超标量之指令解码
2. 方式二,同分支指令,限制每个cycle可以家吗的指令个数,一旦在decode阶段发现乘累加指令,则只有该指令拆分出来的第一条指令,及其之前的指令可以进行解码,拆分后的第二条指令,以及之后的指令放到下一个cycle处理;MIPS指令中,乘法/乘累加是一类特殊的指令,因为他们有两个目的寄存器(Hi/Lo),这两个寄存器并不属于通用寄存器;1. 方式一,decode之后,rename之前,增加一级缓存,拆分出来的指令和正常不拆分的指令,都放到这个buffer中进行暂存,不好之处就是,会带来额外的面积开销;
2024-05-06 11:13:46
662
原创 RISCV指令集体系简读之RV32F/RV32D
具体描述如下,因为这篇博文已经描述的很详细了,因此直接转载:RISC-V指令集架构------RV32F/RV32D浮点扩展指令集_fsw指令-CSDN博客
2024-05-01 12:28:22
302
原创 浮点数的加法运算
---首先,数据的阶码位和尾数位,都需要转换成补码,这个比较好理解,计算机看不到有无符号数,只是对补码进行计算;------具体可以看这个帖子:溢出以及判断溢出的两种方法(单符号位和双符号位)_一位符号位判断溢出-CSDN博客。----此处,我们采用双符号位的表示方式,即在数据的高2bit, 都是符号位:00 001, 00 011;----假设上述的x,y,都是补码,则x的阶码为:001, y的阶码为:011;----为什么要用双符号位?---因为可以通过符号位的变化,判断是否有溢出;
2024-04-18 14:43:54
999
原创 RISCV指令集体系简读之RV32M
当发生除零操作时,不会触发异常,硬件会返回一个默认的特殊值,该特殊值由硬件设计确定。可以通过查看FS/FD寄存器查看是否发生除零操作,FS寄存器用于表示浮点运算的状态,其中第1位和第2位分别表示除以0和无效操作的错误标志。如果除零操作发生了错误,这些位将被设置为1。FD寄存器用于表示定点运算的状态,其中第1位和第2位分别表示除以0和无效操作的错误标志。如果除零操作发生了错误,这些位也将被设置为1。RV32M向RV32I中添加了整数乘法和除法指令;附录:除以零的行为;
2024-04-15 20:27:02
208
原创 RISCV指令集体系简读之RV32I
⚫ 一个指令,用于将大立即数加载到寄存器的高位,这样加载32位常量到寄存器只需要两条指令。⚫ 仅提供一种数据寻址模式(寄存器+立即数)和PC相对分支。⚫ 加载/存储字加上有符号和无符号加载/存储字节和半字。⚫ 所有操作都在寄存器之间(没有寄存器到内存的操作)⚫ 31个寄存器,全部32位宽,寄存器0硬连线为零。⚫ 所有算术,逻辑和移位指令都有立即数版本的指令。x0~x31, 其中x0固定为0;⚫ 32位字节可寻址的地址空间。⚫ 所有指令均为32位长。⚫ 立即数总是符号扩展。⚫ 无乘法或除法指令。
2024-04-15 19:54:02
841
原创 指令集体系简读
同时,寄存器是一种更昂贵的东西,当时的处理器中无法放入数量比较多的通用寄存器,而且,随着通用寄存器个数的增多,会使指令当中需要更多的位数来对其进行编码,这样也会导致指令占用更多的位数,也就占用了更多的内存(这些原因在现在看起来似乎是很滑稽的,但是在那个年代却是真实存在的),这些原因都是导致处理器设计师会让一条指令中完成尽可能多的任务的原因,例如一条CISC指令“ADD[EAX],EBX”,可以完成从存储器中取数据,然后和寄存器中的数据进行运算,并将运算的结果写回存储器这样一系列的操作。
2024-04-12 18:00:20
828
原创 超标量处理器中的分支预测实现
超标量的分支预测与标量分支预测的不同点: 在取指令时给出一个地址,会从 I-Cache 中取出多条指令,这些取出的指令组成了一个指令组(fetch group); 处理器会自动根据指令组中的指令个数,调整取指令的地址,用来进行下个周期的取指令。 因此超标量处理器中的取指令地址并不是连续的,每次增加的值等于指令组的字长,送入到I-Cache中取指令的地址其实只是指令组中第一条指令的地址而已。 如果此时仍旧只是使用取指令时的地址(也就是PC值)进行分支预测,那么就相当于只是对指令组中的第一条指令进
2024-04-12 15:03:13
306
原创 分支预测概述
分支预测本身是比较复杂的,不同的处理器有不同的实现方法,它是影响一款处理器性能高低的关键因素之一,需要在处理器设计的时候仔细进行权衡和折中,以便在硬件消耗、预测准确度和延迟(latency)之间找到一个平衡点。要进行分支预测,首先需要知道从I-Cache取出来的指令中,哪条指令是分支指令,这对于每周期取出多条指令的超标量处理器来说,更为不容易,需要从指令组(fetch group)中找出分支指令;执行阶段之前的全部指令都从流水线中清除(flush)对于超标量处理器来说,准确度高的分支预测更为重要;
2024-03-26 16:13:56
866
原创 Machine Trap Delegation Registers
M-mode产生的traps, 不能delegate到S-mode;但是,S-mode的traps, 可以delegate到S-mode, 也就是说,可以平级的delegate;实现了S-Mode的系统,medeleg/mideleg是必须实现的,如果设置了对应的bit, 可以。将s-mode/u-mode下的trap, 委托给s-mode处理,而不是m-mode;对于更低等级的level, medeleg应该是read-only zero的;没有实现S-mode的系统,可以不实现这两个寄存器;
2024-01-15 09:52:59
358
原创 Machine Interrupt Registers
如果interrupt通过mideleg寄存器,委托到S-mode, SIP/SIE寄存器才是可见的,否则,对应bit都是read-only zero的;如果s-mode没有实现,那么SEIP/STIP/SSIP/SEIE/STIE/SSIE都是read-only zero的;在实际实现时,如果中断可pending的话,mie对应bit都要设置成writable的;在实际实现的时候,mip中的bit可以设置为writable,或者read-only;M-mode的中断优先级是最高的;
2024-01-12 10:31:12
910
原创 excp/trap/int的一些简单说明
大部分的异常都会产生trap, except for floating-point exceptions, which, in the standard floating-point extensions, do not cause traps。异常是由当前正在执行的进程产生。异常包括很多方面,有出错(fault),有陷入(trap),也有可编程异常(programmable exception)。
2024-01-05 17:06:30
855
原创 分支指令的方向预测
基于两位饱和计数器的分支预测方法并不会马上使用分支指令上一次的结果,而是根据一条分支指令前两次执行的结果来预测本次的方向,这种方法可以用一个有着 4 个状态的状态机来表示。对于分支指令来说,它的方向只有两个:发生跳转(taken)和不发生跳转(nottaken),因此可以用1 和0 来表示。这种方式,是考虑到某条分支指令,其taken与否,是。实际情况中,无法使用,因为每个PC一个PHT,占用的空间太大了;不行,此时的预测结果可能是错误的,不能进行更新;不行,因为OOO, 可能处于在错误的分支上;
2023-12-28 11:42:56
1290
原创 分支预测概述
分支预测:不用等到分支指令的结果真的被计算出来,而是提前就预测结果的过程。分支预测之所以能够实现,是由分支指令的特性决定的,因为分支预测本质上是对。预测方式分为两种:静态分支预测和动态分支预测;分支指令的结果进行预测。
2023-12-28 09:33:19
961
原创 vsetvli/vsetivli/vsetvl
e. 从 vl 读取的值用作 vset{i}vl{i} 的 AVL 参数时会在 vl 中产生相同的值,前提是结果 VLMAX 等于读取 vl 时的 VLMAX 值。vset{i}vl{i} 指令根据参数设置 vtype 和 vl CSR,并将 vl 的新值写入 rd。ceil(AVL / 2) ≤ vl ≤ VLMAX 如果 AVL < (2 * VLMAX)如果 AVL ≥ (2 * VLMAX),则 vl = VLMAX。如果 AVL ≤ VLMAX,则 vl = AVL。
2023-12-26 11:54:48
1406
原创 处理器类型简介
多核处理器也称片上多核处理器(Chip Multi-Processor,CMP)。多核出现前,商业化处理器都致力于单核处理器的发展,其性能已经发挥到极致,仅仅提高单核芯片的速度会产生过多热量且无法带来相应性能改善,但CPU性能需求大于CPU发展速度。尽管增加流水线提高频率,但缓存增加和漏电流控制不力造成功率大幅增加,性能反而不如之前低频率的CPU。功率增加,散热问题也严重了,风冷已经不能解决问题了。那么新技术必须出现-多核处理器。早在1996年就有第一款多核CPU原型Hydra。
2023-12-26 10:14:34
1016
原创 浮点数的转换--IEEE 754
小数部分:0.1247,不断乘以2,取整数部分,00011111111011001..., 因为位数不够,进行截断;3. 将得到的数,表示成IEEE 754的格式,0.00101=1.01*2-3。这个数可能在32bits范围内,不能准确的表示出来,因此需要进行截位;⭘0.15625x2=0.3125 取整0。⭘0.31250x2=0.6250 取整0。⭘0.25000x2=0.5000 取整0。按照上面的公式,整数部分,127: 0111_1111;其中,E为阶码位,M为尾数部分,S为符号位;
2023-12-25 19:08:23
3636
原创 riscv中的异常简介
处理器在执行的过程中,除了分支类型的指令之外,很多其他的情况也可以打断程序的执行,这些情况统称为异常(exception);,从处理器外部看起来,产生异常的指令之前的所有指令都已经完成了,而这条产生异常的指令及其之后的所有指令都不允许完成。不同的指令集体系中,异常包括的内容也不尽相同,可以概括地将异常分为下面几种。对于一个特定的处理器来说,所有类型异常的处理过程是一样的。总能够找到哪条指令发生了异常。
2023-12-21 10:44:19
626
原创 唤醒阶段的推测唤醒(2)
在这种方法中,指令被仲裁电路选中之后,会马上离开发射队列,但是它并不会消失,而是进入另外一个部件 Replay Queue(RQ)。
2023-12-19 11:15:37
396
原创 唤醒阶段的推测唤醒(1)
前文讲述的唤醒方法都是建立在一个前提下,即指令在 FU 中执行的周期数是可以预知的,这样才可以为这条指令分配一个确定的DELAY值,但是在实际的处理器中,很多指令需要的执行周期数是没有办法提前知道的。解决方式:当该指令执行完成时,再进行唤醒;
2023-12-18 17:24:40
1213
原创 超标量处理器的唤醒
唤醒是指被仲裁电路选中的指令将其目的寄存器的编号(简称为dst_tag)和发射队列中所有的源寄存器的编号进行比较,并将那些比较结果相等的源寄存器进行标记的过程(标记为ready状态)。
2023-12-18 15:31:34
909
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人