Мы изучаем конвейерную обработку, и у меня есть упражнение, где я должен подсчитать количество циклов, для которых код 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
Код внутри l oop содержит 7
инструкций и выполняется 10
раз, поэтому мы получаем 70
циклы. Тогда у нас есть циклы задержки в строке 5
из-за опасности использования нагрузки на $t1
. Снова код выполняется 10
раз, таким образом дополнительные 10
циклы. Всего у нас сейчас 80
циклов. Из-за bne
у нас есть 9
flushes
(не 10, потому что после 9
мы не возвращаемся). Следовательно, теперь у нас есть 89
циклов. Затем у нас есть цикл 1
для одного цикла NOP
и 1
для инициализации переменной i
. Это дает нам в общей сложности 91
циклов. В справочном листе MIPS говорится, что всегда нужно добавлять 4 из-за первой строки кода, таким образом доводя нашу общую сумму до 95
циклов.
Предполагая, что я прав, что я должен быть, есть ли более быстрый способ подсчета количества циклов в любом коде MIPS? Я мог бы использовать уравнение CPI = число циклов / тактовую частоту, но предполагая, что нам не дают эту информацию, а только имеют данный код, есть ли способ? Я обнаружил, что если вы используете следующее уравнение, вы получите правильный ответ для данного кода.
# of cycles = 4 + # of instructions x (# of pipeline levels - 1) + # of NOPs
Однако я не уверен, работает ли это вообще, или мне повезло с моим указанным c пример. Кстати - # относится к числу.