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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/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
Assembly 使用相同寄存器执行ADD和SW时MIPS中的数据危险?_Assembly_Mips_Pipelining - Fatal编程技术网

Assembly 使用相同寄存器执行ADD和SW时MIPS中的数据危险?

Assembly 使用相同寄存器执行ADD和SW时MIPS中的数据危险?,assembly,mips,pipelining,Assembly,Mips,Pipelining,假设我们这里有一个MIPs汇编程序,如果/ID/EXE/MEM/WB没有转发,它有5个阶段的流水线,并且假设所有指令都经过每个阶段,即使它可能不会产生有意义的结果: ... add $t0, $s1, $s0 sw $t0, 0($s2) ... 是否存在原始数据危害? 我目前的思考过程是: $t0这确实是一种管道危险,需要旁路才能缓解。观察到第二条指令所需的值实际上正好在需要时可用,这是旁路的基础。在一个简单的管道中,计算出的值在写入目标寄存器之前在目标寄存器中不可用,这是在实际计算值之

假设我们这里有一个MIPs汇编程序,如果/ID/EXE/MEM/WB没有转发,它有5个阶段的流水线,并且假设所有指令都经过每个阶段,即使它可能不会产生有意义的结果:

...
add $t0, $s1, $s0
sw  $t0, 0($s2)
...
是否存在原始数据危害? 我目前的思考过程是:

$t0这确实是一种管道危险,需要旁路才能缓解。观察到第二条指令所需的值实际上正好在需要时可用,这是旁路的基础。在一个简单的管道中,计算出的值在写入目标寄存器之前在目标寄存器中不可用,这是在实际计算值之后的一个周期左右;但是,通过旁路,我们可以提前重定向计算值(放弃寄存器写入)。

是的,当然存在原始危险。一条指令读取前一条指令的结果,其间隔远小于管道长度。维基百科:

当盲目调度的指令试图在寄存器文件中的数据可用之前使用数据时,就会发生数据危险

像R2000这样的经典商业MIPS具有旁路转发功能,不必暂停,因为其转发逻辑检测到危险(仍然存在),并将
add
的EX结果转发到
sw
的寄存器读取复用器。因此,转到管道的其余部分,该指令的转发值为
$t0
,寄存器文件值为
$s2

如果没有旁路转发,是的,您必须实际暂停。假设
SW
仍在正常时间在ID阶段从寄存器文件读取其两个输入操作数。IDK如果您可以让存储延迟读取其数据寄存器(在MEM statge开始时),以将暂停周期数减少1,但这可能需要在寄存器文件中增加一个读取端口,因为ID stage可能也在读取2条指令


您的管道仍然需要检测危险并能够暂停()。简单ALU指令的有效延迟低于1个周期是非常糟糕的,这就是为什么所有现实世界的RISC管道都进行转发,而不仅仅是检测和暂停。编译器有足够硬的时间调度代码来填充加载延迟和分支延迟槽,而不必隐藏每个简单ALU指令的延迟

谢谢,这很有帮助。