Loops 我应该如何优化此mips代码?

Loops 我应该如何优化此mips代码?,loops,assembly,mips,Loops,Assembly,Mips,下面我尝试使用bne循环100次,但我想修改代码,使其运行更快。也许是以某种方式删除了nop?我应该如何改进此代码 addi $1, $0, 100 addi $2, $0, 0 lw $3, 0($4) add $2, $2, $3 addi $4, $4, 4 addi $1, $1, -1 bne $1, $0, -5 nop 您可以做的第一件事是利用分支延迟槽。nop在每个循环上执行,但没有完成任何事情。既然循环计算不需要增加$4的指令,为什么不把它放在那里呢 加快运行速度的第二步是查

下面我尝试使用bne循环100次,但我想修改代码,使其运行更快。也许是以某种方式删除了nop?我应该如何改进此代码

addi $1, $0, 100
addi $2, $0, 0
lw $3, 0($4)
add $2, $2, $3
addi $4, $4, 4
addi $1, $1, -1
bne $1, $0, -5
nop

您可以做的第一件事是利用分支延迟槽。nop在每个循环上执行,但没有完成任何事情。既然循环计算不需要增加$4的指令,为什么不把它放在那里呢

加快运行速度的第二步是查看相关指令。例如,将$3添加到$2必须等待lw完成,这可能需要几个机器周期。从$1中减去1不需要等待任何结果。如果颠倒这两条指令的顺序,则可以在负载仍在进行时执行减法,而不是等待它完成。这取决于体系结构,可能不会在所有系统上显示,尤其是在模拟器上


第三步是重新构建循环。在每个循环上递增指针$4,递减循环计数器$1。为什么不把它们结合起来呢?你知道开始时4美元是多少,最后4美元是多少,4+4*100。所以你可以增加4美元,看看它是否达到了终点。这将为每个循环节省一条指令。

您可以做的第一件事是利用分支延迟槽。nop在每个循环上执行,但没有完成任何事情。既然循环计算不需要增加$4的指令,为什么不把它放在那里呢

加快运行速度的第二步是查看相关指令。例如,将$3添加到$2必须等待lw完成,这可能需要几个机器周期。从$1中减去1不需要等待任何结果。如果颠倒这两条指令的顺序,则可以在负载仍在进行时执行减法,而不是等待它完成。这取决于体系结构,可能不会在所有系统上显示,尤其是在模拟器上

第三步是重新构建循环。在每个循环上递增指针$4,递减循环计数器$1。为什么不把它们结合起来呢?你知道开始时4美元是多少,最后4美元是多少,4+4*100。所以你可以增加4美元,看看它是否达到了终点。这将为每个循环节省一条指令。

您的代码:已优化

    addi $1, $0, 100
1:  addi $2, $0, 0         #can replace with mov $2,$0   (easier to understand)
    lw $3, 0($4)           #don't need an offset, replace with lw $3,($4)
    add $2, $2, $3
    addi $4, $4, 4
    bne $1, $0, 1b
    addi $1, $1, -1
我已经删除了nop并交换了bne和addi指令,这样cpu就不会浪费任何周期。addi始终在分支延迟槽中执行

PS可变长度编码器提到add指令必须等待lw,他部分正确,部分不正确。如果该体系结构支持转发,那么您就不必像MIPS体系结构的一些实现那样等待。但是,如果体系结构不支持ForwardingOnly,那么您必须按照他/她建议的做,或者交换lw后面的两条add指令您的代码:optimized

    addi $1, $0, 100
1:  addi $2, $0, 0         #can replace with mov $2,$0   (easier to understand)
    lw $3, 0($4)           #don't need an offset, replace with lw $3,($4)
    add $2, $2, $3
    addi $4, $4, 4
    bne $1, $0, 1b
    addi $1, $1, -1
我已经删除了nop并交换了bne和addi指令,这样cpu就不会浪费任何周期。addi始终在分支延迟槽中执行


PS可变长度编码器提到add指令必须等待lw,他部分正确,部分不正确。如果该体系结构支持转发,那么您就不必像MIPS体系结构的一些实现那样等待。然而如果该体系结构不支持转发,那么您必须按照他/她建议的做,或者按照lw交换两条add指令。如果该体系结构的CPU运行速度明显快于RAM,并且缓存中没有请求的值,那么无论什么情况,都必须在数据加载时暂停转发。如果CPU的运行速度明显快于RAM,并且缓存中没有请求的值,则无论转发如何,都必须在数据加载时暂停。