Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 优化一组汇编指令的管道执行_Loops_Assembly_Cycle_Pipeline - Fatal编程技术网

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