我有一个指令集,我被告知要重新排序指令以优化管道并绘制其执行图。这是使用五阶段管道样式(获取,解码,执行,内存,回写)。所以图表看起来像这样:
1 2 3 4 5 6 7 8
I0 F D E M W
I1 F D E M W
I2 F D E M W
... etc
下面是指令集的图像。我画了一些我认为RAW依赖的地方。
我们正在使用静态分支预测而不采取假设。由于我们正在处理静态分支,在条件之后立即移动Subtract R2, R2, #1
指令是否正确?这样,它就在分支延迟槽中,无论如何都会一直执行。移动那个Subtract指令是我能做的唯一事情吗?由于数据依赖性,我无法真正移动或重新排序其他指令,可以吗?任何帮助,将不胜感激。感谢。
更新
从下面的评论中,我认为我能够找到合适的管道。让我知道这个是否奏效。
Load R2, N
Move R4, #NUM1
Clear R3
LOOP Load R5, (R4)
Subtract R2, R2, #1
Add R4, R4, #4
Branch_if_[R2]>0 LOOP
Add R3, R3, R5 <-- Delayed Branch Slot
Store R3, SUM
我认为这会有效,因为它会消除数据依赖性(1除外)。例如,查看管道:
Clock Cycles 1 2 3 4 5 6 7 8 9 10 11 12 13
Load R2, N F D E M W
Move R4, #NUM1 F D E M W ------------
Clear R3 F D E M W RAW, fix w/ fwd
Load R5, (R4) F D E M W-------
Subtract R2, R2, #1 F D E M W
Add R4, R4, #4 F D E M W
Branch_if_[R2]>0 LOOP F D E M W
Add R3, R3, R5 F D E M W
Store R3, SUM F D E M W
这使得它只有一个数据依赖而不是三个。这是最好的方法还是有更好的方法?
编辑我想我需要将Add R4, R4, #4
指令移到延迟分支槽位。使用Add R3, R3, R5
,可以创建WAR反依赖项。但是如果我移动它们,我不会得到另一个RAW依赖吗?