cpu流水线(cpu流水线工作原理)
什么是冒险?
风险(hazard)是指在计算机CPU的微体系结构中,指令流水线乱序执行中的一些问题可能会导致得到不正确的计算结果。有3类典型的风险:
数据风险
结构风险
控制风险(分支风险)
举两个
数据冒险
指令乱序执行时,可能会发生读取数据与写入数据之间的时序与空间的相关性,成为数据冒险。如果不加以处理,可能会导致竞态条件。 有3种可能的数据冒险:
先写后读 (RAW), 这是真实的相关。
先读后写 (WAR), 被称为反相关。
写后写(WAW), 被称为输出相关。
先写后读(RAW)
R2 <- R1 + R3. R4 <- R2 + R3
在电路上的实现如下:在过600ps后,t0的值会被保存到EX/MEM这个流水线寄存器中,与此同时,加法指令正在执行,它需要将t0的值传到ALU的输入,显然它直接从t0寄存器读的值不是最新的,最新的在访存阶段的连线上,我们从硬件连线上把这个信号引回来,作为ALU的输入端。是否使用前递的信号,我们需要根据是否出现数据冒险,来控制一个二路选择器。
当硬件检测到当前指令的源操作数正好在EX/MEM流水线寄存器中时,就直接将EX/MEM寄存器的值传递给ALU的输入,而不是从寄存器堆中读数据,如下图:t0在EX阶段就被计算出,所以可将它送到下一条指令ALU的输入,而不需要添加气泡。
FORWARDING 通道
在存储器中设置单独的指令高速缓存和数据高速缓存。(要强调的在计算机中主存储器也就是内存是统一存放指令和数据的,这也是冯诺依曼结构的要求,只是在CPU当中 的一级高速缓存会采用指令和数据分别存放的方式)
设置单独的指令高速缓存和数据高速缓存
虽然流水线停顿能用来解决各种冒险,但它的效率低下,应尽量避免。
在这两条语句之间增加两个Cycle的等待:
我们有一个方便又简便的方法,即流水线停顿(stall),产生空泡(bubble)。
流水线停顿
如何解决
指令流水时,处理器遇到分支指令,不能在流水开始阶段就判断出分支结果。
控制冒险
结构冒险是指多条指令同时要访问处理器一处硬件。典型例子是一个存储单元被一条指令取操作数同时另一条指令要写入结果。
结构冒险
第一个指令是计算一个值,并将其储存在R2,而第二个指令是使用这个值计算结果并储存在R4,但是在我们拿出第二步的操作数时,第一步的结果还未被储存。因此我们具有一种数据相关性。 我们可以说那有 一种数据依赖性对于指令i2,他依赖于指令i1的完成。