Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说计算机体系结构——中央处理器——流水线技术,希望能够帮助你!!!。
注:部分内容和图片取自《计算机体系结构基础》(胡伟武著)、《计算机原理》(国防科技大学慕课)
指令流水线把一条指令的执行划分为若干阶段来减少每个时钟周期的工作量,从而提高主频;并允许多条指令的不同阶段重叠执行实现并行处理。
这样虽然一条指令的执行时间不变,但处理器再单位时间内处理的指令数增加了。
一条指令在CPU中执行过程通常可以分为很多个阶段,通常来说CISC指令较为复杂,可以分的阶段可以有很多。
以5级流水线为例,可以分为取指,译码,执行,访存,写回五个操作
将执行结果读取或者写入到存储器
在CISC中,CPU可以对内存直接进行读取和写入操作;但在RISC中,CPU需要通过寄存器对内存操作,而寄存器与内存间的通信则需要LSU来完成。load store unit为加载存储单元,管理所有load, store操作。
该处理器会把指令的执行分为很多个阶段,同样以执行最久阶段的时间为时钟周期,当时流水线各阶段的部件将会同时工作,并行的执行多条指令。
通过在每级流水的触发器旁再添加一批用于存储控制逻辑的触发器,即寄存器栈。这些寄存器栈可以保存流水线的中间状态,当流水线逐级传递下去时,可以保证各阶段执行时使用的控制逻辑都是属于该指令的。
如下图所示,R2、R3等为流水栈。
从上图虚线可见,运算器进行计算的信息来源于控制逻辑2,即锁存过一次的控制逻辑,刚好与R2中存储的运算之同属一条指令。同时图中取消了R3阶段写通用寄存器的通路,而将R3的内容锁存一个时钟周期,统一使用控制逻辑4和R4来写。
如上图流水线时空图,如当某一条指令译码时,下一条指令开始取指,上一条指令开始执行。
相关是指流水线中两条指令之间存在某种依赖关系。确定程序中指令之间存在什么样的相关,对于充分发挥流水线的效率有重要的意义。
“名”是指指令所访问的寄存器或存储器单元的名称。如果两条指令使用相同的名,但是它们之间并没有数据流动,则称这两条指令存在名相关。
指令j与指令i之间的名相关有以下两种:
(1)反相关。如果指令j写的名与指令i读的名相同,则称指令i和j发生了反相关。反相关指令之间的执行顺序是必须严格遵守的,以保证i读的值是正确的。
(2)输出相关。如果指令j和指令i写相同的名,则称指令i和j发生了输出相关。输出相关指令的执行顺序是不能颠倒的,以保证最后的结果是指令j写进去的。
数据相关可分为RAW、WAW、WAR
由相关性导致的冲突可分为3类:数据冲突,控制冲突和结构冲突
当指令在流水线中重叠执行时,因需要用到前面指令的执行结果而发生的冲突。即在程序中,若两条指令访问同一寄存器或内存单元,且至少有一条是写入操作,则是数据相关冲突。
(1)数据冒险解决方法
如下图所示load指令引起的延迟现象,load的结果数据在cycle6才可以被使用,但此前已有三条指令被取出且译码等,若此时用到load的结果,则需要进行一定的处理
即将被组设流水线所在的寄存器保持原值不变,同时向被阻塞流水线的下一级流水线输入指令无效信号,用流水线空泡填充阻止后续指令执行,延迟到新值被写入寄存器后
该方式控制较复杂。
插入无关的nop指令,延迟冲突指令的执行,但是会浪费时间。
即上一条指令在执行阶段完成后即从寄存器中取出供下一条指令使用,不必等上条指令一级一级执行完后读取
如图所示,在add指令ex完成后直接将结果数据前递到sub的ALU的输入。
若前递数据错误,则需要通过flush控制信号来清空流水栈
该技术需要在译码段增加一个检测点检测数据相关性,增加了硬件复杂度,且不能解决所有的数据相关(如产生冲突的第一条指令是load操作,由于访存的结果是在mem阶段得出,来不及前递到下一条指令的ex段),必须结合另外两种方法。如下图所示,采用转发技术和阻塞技术:
编译器编译时可以调整指令顺序或寄存器减少数据相关性。
(2)load-use数据冒险
在流水线中当一条指令使用之前指令访存的结果时,则会产生load-use数据冒险。此时需要进行load-use冒险处理,在流水线中插入“气泡”,此时若在五级流水线中指令的执行将阻塞一个时钟周期。
参考链接:https://www.jianshu.com/p/ffd7ccf672ea
流水线遇到分支指令和其他会改变PC值的指令所引起的冲突。
控制冲突只针对branch指令来说,如果两条指令中一条是转移指令且另一条指令是否被执行取决于该转移指令的执行结果,则会产生控制冒险,其本质是对程序计数器PC的冲突访问引起的。具体表现在转移指令在流水线中尚未完成,下一条指令与上一条指令相同操作数的程序计数器PC已经开始取指了,从而流水线执行了不应该执行的指令,且该指令又修改了某寄存器或某存储器的值,造成了跳转后对该寄存器或存储器取出错误的值。
如上图所示,本应跳转到1000地址执行,但却取错三个指令,造成可能的寄存器值修改或控制信号的改变。
属于静态调度技术,由编译器重排指令顺序来实现。
基本思想是把分支指令前面的与分支指令无关的指令调度到分支指令后面执行,以填充延迟时间片(分支延迟槽),找不到可调度的指令时用nop填充。
在定义指令系统的时候就明确转移指令延迟槽指令的执行不依赖于转移指令的结果
因硬件资源满足不了指令重叠执行的要求而发生的冲突。即两条指令要同时访问流水线中的同一功能部件,造成资源冲突
如下图所示,在第7个时钟周期,load指令和R型指令同时对寄存器进行写操作。
详情见该文指令级并行一节:计算机体系结构——并行性的实现_KGback的博客-CSDN博客_并行实现
riscv用户指令集spec:RSIC-V——指令集spec阅读笔记——用户级_KGback的博客-CSDN博客
如图是一个典型的基于RISC-V指令集的五级流水线架构:
(1)RISCV指令集流水线处理器优势:
(2)load指令的流水线过程
risc-v访存指令详解:RSICV——存储器访存指令load/store_KGback的博客-CSDN博客_store指令格式
每个load指令仍然需要五个时钟周期完成
(3)R-type类型指令的流水线过程
(4)store指令的执行过程
(5)分支指令的执行过程
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章