电子说
什么是流水线?
类似于工厂流水线。
为什么要弄出这个东西?
流水线是为了提高效率,能并发同时进行多个任务。
CPU的一个任务,或者说指令,被分为很多个步骤完成,就跟生产线上装配汽车,分成若干个零件工序依次安装。
几种CPU流水线
Intel:流水线较少,但是每条流水线的长度很长。可以想象成,Intel有较少的生产线,而每个生产线上把装配一辆汽车分成了较多的步骤,所以生产线很长。这样的优点是,生产线上的每个步骤需要完成的任务相对较少,这样,工作的节奏很容易加快,也就是号子喊的可以快一些,所以Intel的P4主频提高非常迅速。
这种架构的缺点是,因为流水线太长,如果中间有一步发生错误,只有到最后一个工序才能发现。虽然这种错误几率很小很小,但是不可避免,而且会被非常高的主频放大无数倍,带来的影响就是工作效率并没有随着节奏的加快而明显提升,也就是Intel“高频低能”的原因之一。Intel的Pentium M系列就没有采用这种架构模式,而是采用类似AMD的短管线多管线模式。
AMD:拥有较多的流水线,就是说,生产线较多,但是每条生产线的长度较短。带来的影响是,在短生产线上装备一辆汽车的话,每个工序需要干的活比较多,所以大家工作的节奏就不能太快。所以AMD的主频提高非常困难。可是AMD较多的流水线同样保证了指令执行数量,也就是装配汽车的数量,效率较高。短的流水线受工序错误的影响也很低,因为流水线短,发现错误会更及时。主频低,错误率被放大的也小。
CPU的主频
CPU的主频相当于流水线工作的统一干活节奏。你可以想象成主频就是干活时候喊的号子,大家都跟着号子一步一步的干活。
描述主频的单位:
MIPS(Million Instruction Per Second)表示CPU每秒执行多少百万条指令。比如0.9MIPS,表示每秒九十万条指令。
MIPS/MHz表示CPU在每MHz的运行速度下可以执行多少个MIPS,如0.9MIPS/MHz则表示如果CPU运行在1MHz的频率下,每秒可执行90万条指令。如果CPU在20MHz的频率下,每秒可运行1800万条指令。MIPS/MHz可以很好的反映CPU的速度。
3级流水线如上图所示(PC为程序计数器),流水线使用3个阶段,因此指令分3个阶段执行。
⑴ 取指-从存储器装载一条指令
⑵ 译码-识别将要被执行的指令
⑶ 执行-处理指令并将结果写回寄存器或者存储器
以前学过的51单片机,因为比较简单,所以它的处理器只能完成一条指令的读取和执行后,才会执行下一条指令。这样,PC始终指向的正在“执行”的指令。
而对于ARMV7来说因为是3级流水线,所以把指令的处理分为了上面所述的3个阶段。
所以处理时实际是这样的:ARM正在执行第1条指令的同时对第2条指令进行译码,并将第3条指令从存储器中取出。
所以,ARMV7流水线只有在取第4条指令时,第1条指令才算完成执行。
下图生动形象的说明了3级流水线的处理机制。
下面一句话很关键: 无论处理器处于何种状态,程序计数器R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或者“正在译码”的指令 。
人们一般会习惯性的将正在执行的指令作为参考点,即当前第1条指令。
所以,PC总是指向第3条指令,或者说PC总是指向当前正在执行的指令地址再加2条指令的地址。
处理器处于ARM状态时,每条指令为4个字节,所以PC值为正在执行的指令地址加8字节,即是:
PC值 = 当前程序执行位置 + 8字节
处理器处于Thumb状态时,每条指令为2字节,所以PC值为正在执行的指令地址加4字节,即是:
PC值 = 当前程序执行位置 + 4字节
下面一个例子就很好的说明了这个问题。
另外补充说明就是根据以上描述,流水线只有被指令填满时才能发挥最大效能,即每时钟周期完成一条指令的执行(仅单周期指令)。
如果程序发生跳转,流水线会被清空,这将需要几个时钟才能使流水线被再次填满。因此,尽量地少使用跳转指令可以提高程序的执行效率。
全部0条评论
快来发表一下你的评论吧 !