Как я должен оптимизировать этот код MIPS? - PullRequest
1 голос
/ 30 марта 2012

Ниже я пытаюсь выполнить цикл 100 раз, используя bne, но я хочу изменить код, чтобы он работал быстрее.Возможно, как-то удалив ноп?Как мне улучшить этот код?

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

Ответы [ 2 ]

5 голосов
/ 30 марта 2012

Первое, что вы можете сделать, это использовать интервал задержки ветвления.NOP выполняется на каждом цикле, но не выполняет ничего.Почему бы не добавить туда инструкцию, которая увеличивает значение на 4 доллара (поскольку она не нужна для вычисления цикла)?

Второй шаг в ускорении работы - поиск зависимых инструкций.Например, добавление $ 3 к $ 2 должно дождаться завершения lw, что может занять несколько машинных циклов.Для вычитания 1 из 1 доллара не нужно ничего ждать.Если вы измените порядок этих двух инструкций в обратном порядке, вы можете выполнять это вычитание, пока загрузка еще выполняется, вместо того, чтобы ждать ее завершения (это зависит от архитектуры и может отображаться не во всех системах, особенно в симуляторах).

Третий шаг - перестроить ваш цикл.Вы увеличиваете указатель ($ 4) и уменьшаете счетчик цикла ($ 1) в каждом цикле.Почему бы не объединить их?Вы знаете, что 4 $ в начале, и вы знаете, что 4 $ будет в конце (4 + (4 * 100)).Таким образом, вы можете увеличить 4 доллара и посмотреть, достиг ли он конца.Это должно сэкономить вам одну инструкцию на цикл.

1 голос
/ 02 апреля 2012

Ваш код: (оптимизирован)

    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, чтобы процессор не терял циклов.Адди всегда выполняется в слоте задержки перехода.

PS Кодер переменной длины упоминает, что инструкция сложения должна ждать lw, и он является частично правильным и частично неправильным.Если архитектура поддерживает переадресацию, вам не нужно ждать (останавливаться), как это делают некоторые реализации архитектуры MIPS.Однако, если архитектура не поддерживает переадресацию (маловероятно), вам придется либо сделать то, что он / она предложил, либо поменять местами две инструкции добавления, следующие за lw

...