Computer science 解决RISC-V组装中数据危险的序列重新排序

Computer science 解决RISC-V组装中数据危险的序列重新排序,computer-science,riscv,Computer Science,Riscv,对于以下RISC-V代码序列,我试图识别无法通过数据转发解决的数据危害。是否有可能通过重新排列代码序列来克服危险?如果是,有人能显示新序列吗 这是我的密码: loop: slli s2, s1, 2 add s3, s2, s0 lw t0, 0(s3) add t1, t2, t0 sw t1, 20(s3) addi s1, s1, 1 beq s1, s5, loop 通过转发可以解决哪些

对于以下RISC-V代码序列,我试图识别无法通过数据转发解决的数据危害。是否有可能通过重新排列代码序列来克服危险?如果是,有人能显示新序列吗

这是我的密码:

loop: slli  s2, s1, 2
      add   s3, s2, s0
      lw    t0, 0(s3)
      add   t1, t2, t0
      sw    t1, 20(s3)
      addi  s1, s1, 1
      beq   s1, s5, loop

通过转发可以解决哪些数据危害完全取决于您所使用的RISC-V体系结构的特定实现。我将假设Patterson&Hennessey教科书中介绍的具有转发功能的传统5级RISC-V管道,并尝试回答您的问题

此管道具有指令提取(IF)、指令解码(ID)、执行(EX)、内存(MEM)和写回(WB)阶段。执行阶段计算寄存器寄存器和寄存器立即操作的值,并计算内存(lw/sw)和控制传输(分支/跳转)操作的地址,内存阶段读取lw的数据并写入sw的数据。数据可以从执行、内存或写回阶段的末尾转发到后续指令的前一阶段的开头

在您包含的代码片段中,有5种数据危害:

(1)
slli s2,s1,2
为寄存器
s2
添加s3,s2,s0

这里,寄存器
s2
slli
写入,并由
add
读取。新值在第一条指令的前一级结束时计算,在下一条指令的前一级开始时需要,因此可以通过转发来解决

(2)
为寄存器
s3添加s3、s2、s0
lw t0、0(s3)

这里,寄存器
s3
add
写入,由
lw
读取。新值在第一条指令的前一级结束时计算,在下一条指令的前一级开始时需要,因此可以通过转发来解决

(3)
lw t0,0(s3)
为寄存器
t0添加t1,t2,t0

这里,寄存器
t0
lw
写入,并由
add
读取。新值在第一条指令的MEM阶段结束时计算,在下一条指令的前一阶段开始时需要,因此无法通过转发解决

(4)
为寄存器
t1添加t1、t2、t0和
sw t1、20(s3)

这里,寄存器
t1
add
写入,由
sw
读取。新值在第一条指令的前一阶段结束时计算,在下一条指令的MEM阶段开始时需要,因此可以通过转发来解决

(5)
s1、s1、1和
beq s1、s5、loop
寄存器
s1

这里,寄存器
s1
addi
写入,由
beq
读取。新值在第一条指令的前一阶段结束时计算。通常,对于没有任何控制危险优化的RISC-V管道,对于分支指令,寄存器在并行执行期间与程序计数器+偏移量的计算进行比较,以获得分支目标。这里的控制危险是一个单独的问题,但是数据危险可以通过转发来解决

因此,在5种危害中,只有一种无法通过数据转发解决。它可以通过指令重新排序来解决吗?对请看一下
附件s1、s1、1
。在
addi
之前,第一个
slli
之后的任何指令都不会读取或写入
s1
。如果我们移动该指令,结果代码如下所示:

loop: slli  s2, s1, 2
      add   s3, s2, s0
      lw    t0, 0(s3)
      addi  s1, s1, 1
      add   t1, t2, t0
      sw    t1, 20(s3)
      beq   s1, s5, loop
这样,当
add t1、t2、t0
指令需要
t0
的新值时,检索要写入
t0
的数据的
lw
指令将完成MEM阶段


通过这种重新排序,所有数据危险都可以通过转发解决,不需要暂停。

请尽量使您的标题与您的具体问题尽可能不同——读者应该能够很好地了解其他人问题的答案是否可能解决他们自己的问题(这样他们就不需要自己问另一个答案)只阅读标题。因此,一个只描述问题的一般主题的标题并不特别有用——可以称为“系统架构”的不同问题层出不穷,所以最初的标题没有做任何事情来确定手头的具体问题。