指令级并行
指令级并行
Jaytoon1.指令级并行
1.1 循环调度
1.1.1 未调度
以下使用数字代表所在的时钟周期,如②代表第二个时钟周期
②的停顿原因为浮点寄存器F0进行了写入后,需要一个时钟周期的停顿
④和⑤的停顿原因为进行了浮点运算ADDD,需要停顿两个时钟周期
⑧的停顿原因为R1为上一条指令的结果,需要停顿一个时钟周期
⑩的停顿原因为分支指令有一个延时槽时间,延时槽中的指令一定会被执行
1.1.2 调度后
由于前置指令有数据相关,将⑦所对应的指令调度到第一个停顿,即调度后的②,剩下的⑨对应的指令调度到下一个停顿,调度到⑤而不是④的原因为调度到④后,原⑥所对应的指令将无法进行执行,调度到⑤后由于分支指令有一个时钟周期的延时槽,⑥对应的指令将被执行。
1.1.3 循环展开
将循环进行展开若干次(如四次)后,可以将相同的数据写入指令等进行集中执行(如同时取出多个数)展开后可以减少引入分支指令的停顿占比,但由于展开后进行数据处理会需要更多的不同名寄存器,代码量也会成倍增加。
1.2 动态调度
1.2.1 记分牌技术
指令乱序执行,无数据相关,解决写后读
1.2.1.1 指令流出
检查指令所需的功能部件空闲,所使用的目的寄存器和正在执行指令的目的寄存器不同(保证无WAW)
1.2.1.2 读操作数
如果正在执行的指令对当前指令的源寄存器的写操作,那么该指令阻塞在功能部件处直到指令所需的所有源寄存器就绪(解决RAW)
1.2.1.3 执行指令
从已经就绪的源寄存器中取出操作数送到功能部件进行运算,产生计算结果后修改记分牌
1.2.1.4 写结果
先检查目的寄存器中的值是否被前面的指令读出使用(包括前面的指令没有读取操作数以及指令的源寄存器为当前指令的目的寄存器),将计算结果写入到目的寄存器(解决WAR)
1.3 算法
评论
匿名评论隐私政策