Computer science 解决RISC-V组装中数据危险的序列重新排序
对于以下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 通过转发可以解决哪些
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阶段
通过这种重新排序,所有数据危险都可以通过转发解决,不需要暂停。请尽量使您的标题与您的具体问题尽可能不同——读者应该能够很好地了解其他人问题的答案是否可能解决他们自己的问题(这样他们就不需要自己问另一个答案)只阅读标题。因此,一个只描述问题的一般主题的标题并不特别有用——可以称为“系统架构”的不同问题层出不穷,所以最初的标题没有做任何事情来确定手头的具体问题。