Pregunta

Tengo el siguiente código MIPS y estoy buscando reescribir/reordenar el código para poder reducir el número de NOP Instrucciones necesarias para la ejecución tuberculosa adecuada mientras preservan la corrección. Se supone que el DataPath no se detiene ni se avanzan. El problema da dos sugerencias: nos recuerda que las ramas y los saltos se retrasan y necesitan que sus ranuras de retraso se llenen y sugieran ver el valor de desplazamiento en las instrucciones de acceso de memoria (LW, SW) cuando sea necesario.

LOOP:  lw           $1, 100 ($2)
       addi         $1, $1, 1
       sw           $1, 500 ($2)
       addiu        $2, $2, 4
       bne          $2, $10, LOOP

Es bastante obvio para mí que este código incrementa el contenido de una matriz y lo almacena en otra matriz. Así que no estoy viendo exactamente cómo podría reorganizar este código, ya que los índices deben calcularse antes de completar el bucle.

Mi conjetura sería mover el LW Instrucción después de la rama Instrucción ya que (por lo que entiendo) la instrucción en la ranura de retraso siempre se ejecuta. Por otra parte, no entiendo este tema y agradecería una explinación. Entiendo los tuberías en general, pero no tanto ramificación retrasada. Gracias

¿Fue útil?

Solución

Una forma de llenar la ranura de retraso de la rama sería:

addiu  $2, $2, 4  # We'll now iterate over [$2+4, $10] instead of [$2, $10[
LOOP:  lw           $1, 96 ($2)
       addi         $1, $1, 1
       sw           $1, 496 ($2)
       bne          $2, $10, LOOP
       addiu        $2, $2, 4  # Use the delay slot to increase $2

Otros consejos

En términos de la segunda pista:

Haga la cuarta instrucción el segundo. Se puede canalizar en (después de la ID de la primera instrucción, si usa la terminología P/H) mientras que el primero todavía se ejecuta. Luego haga la compensación en la (vieja) tercera instrucción 496 en lugar de 500. Supongo que ahora ves ¿por qué?

En cuanto a la primera pista, no estoy demasiado familiarizado con cómo se ejecutan las ramas tardías exactamente (no se implementan en SPIM, por lo que no me importó). La vieja última instrucción probablemente se puede hacer un segundo a la vez, ya que el nombre "retrasado" indica, pero no pude decirle cómo y por qué.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top