CPU性能提升:流水线机制
CPU流水线是什么:
一条指令执行一般需要三个步骤:取指令、翻译、执行,CPU内部有对应的取指单元、译码单元、执行单元等;
一般来说,取指单元先取指令,然后给译码单元翻译,最后翻译好给执行单元执行,执行完取指单元再取指令开始新的一轮
而CPU流水线就是,取指单元取到第一个指令,然后给译码单元翻译,在译码单元翻译时又开始取第二个指令;当译码单元翻译完成给到执行单元时,第二个指令就马上进来了,而取指单元又开始取第三个指令;
在这个过程中,每个单元不会因为下一级单元没做完就停止工作等待,从而把CPU的性能极大的压榨
流水线冒险:
一旦发生预取指令失败,流水线中失败指令后预取的指令都要丢掉,流水线就会就会停顿下来,叫做冒险
-
结构冒险:所需要的硬件正在为前面的指令工作
比如:这一条指令需要用到的寄存器正在被上一条指令使用着
-
数据冒险:所需要的数据需要前面指令的计算结果才能执行
比如:指令1是c=a+b,指令2是e=c+d
-
控制冒险:根据前面的指令的执行结果决定下一步的行为
比如:代码中的if、else
如何防止流水线冒险:
- 重命名(处理结构冒险)
- 插入空指令等待
- 分支预测(处理控制冒险)
- 乱序执行
SISD、SIMD
SIMD是单指令多数据的运算,可以提高CPU执行效率
如果要计算a+b,CPU是怎么做的呢?
首先,控制单元要去储存设备取出a和b,然后放入算术计算单元中;
那么,这个a和b是怎么取呢?
如果先取出a再取出b,这就是SISD,单指令单数据
如果可以一起取出来,这就是SIMD,单指令多数据
单发射、多发射
每个时钟周期只能执行一条指令,只能执行一条指令,这种处理器叫单发射处理器
而可以执行多条指令,则是多发射处理器
处理器内部一般有多个执行单元,如ALU、乘法器、FPU(浮点运算单元)
如果是单发射处理器,那么在使用一个执行单元时,其他执行单元都会闲着
所以,如果在一个时钟周期里可以同时分发不同的指令给不同的执行单元,就可以达到指令级的并行,提高CPU运行速度