Loops 优化一组汇编指令的管道执行
我有一个指令集,我被告知对指令进行重新排序,以优化管道并绘制其执行图。这是使用五阶段管道样式(获取、解码、执行、内存、写回)。所以这个图表看起来像这样:Loops 优化一组汇编指令的管道执行,loops,assembly,cycle,pipeline,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 下面是指令集的图像。我在我认为一些原始依赖的地方画了进去 我们使用的是静态分支预测,并没有假设。由于我们处理的是静态分支
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
下面是指令集的图像。我在我认为一些原始依赖的地方画了进去
我们使用的是静态分支预测,并没有假设。由于我们处理的是静态分支,因此将减法R2,R2,#1
指令直接移动到条件分支之后是否正确?这样,它就位于分支延迟槽中,无论发生什么情况,都将始终执行。移动减法指令是我唯一能做的事吗?由于数据依赖性,我不能真正移动或重新排序其他指令,对吗?任何帮助都将不胜感激。谢谢
更新
从下面的评论中,我想我能够找到一条合适的管道。让我知道这是否有效
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
这使得数据依赖关系由三个变成了一个。这是最好的方法还是有更好的方法
EDIT我想我需要将
Add R4,R4,#4
指令移动到延迟的分支插槽中。使用在那里添加R3、R3、R5
,这将创建一个WAR反依赖。但是如果我移动它们,我不会得到另一个原始依赖项吗?您可以提前移动移动(双关语;)),这样加载就不必等待。您还可以交换两条add
指令,因为第二条指令可以执行,而第一条指令需要等待。如果我理解正确,则store r3 sum
总是在每次迭代时运行,这是需要的吗?您的循环体很短,因此需要一些软件管道。软件管道可能不是这里的答案,因为它太高级,需要大量代码才能将循环计数四舍五入到最佳因子。但是你肯定应该把R4R4添加到延迟槽中。@Jester我以前没有看到过。因此,如果我将move
指令移到最顶端,那么这有助于我看到一个原始依赖项。我看不出切换两个add指令有什么帮助。你能再给我解释一下吗?谢谢
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