优化一组装配指令的管道执行

时间:2016-02-28 01:13:28

标签: loops assembly cycle pipeline

我有一个指令集,我被告知要重新排序指令以优化管道并绘制其执行图。这是使用五阶段管道样式(获取,解码,执行,内存,回写)。所以图表看起来像这样:

     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依赖的地方。

enter image description here

我们正在使用静态分支预测而不采取假设。由于我们正在处理静态分支,在条件之后立即移动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依赖吗?

0 个答案:

没有答案