Performance 如何手工计算代码中的循环数?

Performance 如何手工计算代码中的循环数?,performance,assembly,mips,pipeline,cpu-architecture,Performance,Assembly,Mips,Pipeline,Cpu Architecture,我们正在学习管道处理,我有一个练习,我必须手工计算MIPS代码运行的周期数。我们在C和MIPS中有以下代码: 0. for (i=0; i<10; i++) 1. som = som + a[i]; 0. add $t0, $zero , $zero 1. L: 2 sll $t1 , $t2, 2 3 add $t1 , $a0 , $t1 4 lw $t1, 0($t1) 5 add $v0, $v0, $t1 6 slti $t2, $t0, 9 7 addi $t0, $t0,

我们正在学习管道处理,我有一个练习,我必须手工计算MIPS代码运行的周期数。我们在
C
MIPS
中有以下代码:

0. for (i=0; i<10; i++)
1. som = som + a[i];

0. add $t0, $zero , $zero
1. L:
2 sll $t1 , $t2, 2
3 add $t1 , $a0 , $t1
4 lw $t1, 0($t1)
5 add $v0, $v0, $t1
6 slti $t2, $t0, 9
7 addi $t0, $t0, 1
8 bne $t2, $zero, L
9 nop

然而,我不确定这在一般情况下是否有效,或者我是否幸运地得到了我的具体示例。顺便说一下-#指的是。

第1行不包含指令,只包含一个标签。对于大多数现代处理器来说,没有简单的模型来计算事情需要多少个周期,可能涉及许多不同的资源。您使用的MIPS模型相当简单,但通常仍不能简化为一个简单的公式。在第二段中进行了详细分析后,应该很明显,这样的简单公式无法工作,除非是意外。一些反汇编程序会随输出一起提供循环数,省去了手动查找的麻烦。你知道这个循环效率很低,对吧?循环外的两条指令可以计算指向
bne
的结束指针,并且指针增量而不是每次迭代都重复scale+索引,这是显而易见的。(或增加指针,减少计数,并对$0执行
bne
)。也没有理由将总和+=放在负载之后,故意在负载危险上失速。我想这只是为了让静态分析更有趣。
# of cycles = 4 + # of instructions x (# of pipeline levels - 1) + # of NOPs