Как посчитать количество циклов в коде вручную? - PullRequest
0 голосов
/ 19 февраля 2020

Мы изучаем конвейерную обработку, и у меня есть упражнение, где я должен подсчитать количество циклов, для которых код 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 пример. Кстати - # относится к числу.

...