已经关注这个帖子好几天了,也苦苦想了好久,没想出办法来。我最近在看POWER4处理器的书,今天突然想到一点:我们是否可以借鉴CPU的“超标量”体系方案来辅助我们的CVS?
所谓“超标量”其实就是并行多个处理器运算周期,也就是说同时处理多条CPU指令流水线。那IBM的star系列处理器举例来说,其使用5级流水线执行powerPC指令每级要求一个处理器周期来完成。
指令读取阶段──在这个阶段,按照分支单元生长的地址,在指令高速缓存中执行读取指令。读取32字节的指令,然后写到位的序列指令缓冲器或8位的分支缓冲器中。
分配阶段──在这一阶段,每一个周期同时解码和分配最多4条32字节的指令。从顺序指令缓冲器或分支缓冲器中按顺序地分配指令,从结构化寄存器、结果缓冲器和结果高速缓存分支中读取操作数。起重,结构化寄存器由体系结构定义。另外,指令高速缓存分支地目标地址也在这一阶段产生。
执行阶段──在这一个阶段,执行运算、翻转和数据高速缓存地址地生成操作。4个执行单元当中由两个是定点运算单元,在一个周期内执行大部分正数运算指令,其中一个单元也执行复杂指令地运算(乘法和除法运算),使用多个周期来完成相应地操作。第三个执行单元用于浮点运算,也需要多个周期来完成相应地操作。第四个执行单元是加载/保存单元,在单个周期内完成数据高速缓存地址地生成。
正如大多数地处理器一样,star系列处理器能够选择指令并向执行单元发送指令,其顺序可以与出现在指令流中地顺序有所不同。例如,如果指令流中地下一个指令是定点乘法运算,但此周期中,定点单元正在执行先前分配地除法指令,而这个定点单元也能够执行乘法指令,此时处理器硬件有两种选择:一种是直到定点单元完成除法指令,才分配乘法指令;另一种是在该周期内,分指令流种乘法指令后面地指令,让闲置地单元运行。
第一种选择称为顺序执行。第二种选择称为乱序执行。乱序执行被设计到所有新的处理器中,它的执行效率更高,因为它能够让更多的执行单元保持在工作状态,这就意味着整体性能的提高。
不过乱序执行的实现需要付出更昂贵的代价,因为任何乱序执行的指令的运算结果必须等待,直到处理器在指令流中正真遇到这条指令。编译其产生的指令流是假定每条指令按照顺序执行,而改变指令执行顺序,就能够改变程序的结果输出。因此,只有硬件能够保证按照编译器要求的顺序完成指令操作,才允许乱序执行指令。
提交阶段──这一阶段保存执行单元产生的结果。任何乱序执行的指令结果都保存在这一阶段,只到指令流中位置靠前的指令全部执行完毕。使用这个方法,指令虽然是乱序执行,但是它们总能够按顺序提交结果。执行分支指令、程序异常、缺页中断都能导致提交阶段(和前面几个阶段)的失败。
回写阶段──在解决了所有的分支和异常阶段以后,回写阶段把指令结果写回到结构化寄存器中。