Estoy aprendiendo la ruta de datos MIPS con piplining y estoy un poco confundido en las siguientes dos cosas:
¿Cómo realizamos Stall en la ruta de datos MIPS?
¿Cuál es la diferencia entre Stall y Flush?
Aquí está la ruta de datos:
Estoy aprendiendo la ruta de datos MIPS con piplining y estoy un poco confundido en las siguientes dos cosas:
¿Cómo realizamos Stall en la ruta de datos MIPS?
¿Cuál es la diferencia entre Stall y Flush?
Aquí está la ruta de datos:
Un "bloqueo" de la tubería simplemente significa que los valores que fluyen a través de la tubería no son válidos, porque la operación actual necesita un valor de datos que todavía se está propagando a través de la tubería. Esto normalmente se implementa mediante un bit especial que fluye a través de la tubería junto con el resto de los campos de control que impiden la actualización de cualquier estado permanente (operaciones de registro y escritura de memoria). La lógica de control en la cabecera de la tubería reconoce cuándo se producen estas dependencias de datos y establece / restablece ese bit en consecuencia, y repite la misma operación cuando / hasta que los datos necesarios estén disponibles.
La lógica de reenvío puede eliminar muchos bloqueos potenciales "cortocircuitando" los retrasos normales de la tubería y proporcionando resultados desde dentro de la tubería en el punto donde se necesitan.
Se requiere un "flujo" de tubería cuando se deba cambiar la información del estado global que afectará el procesamiento de todas las instrucciones. Puede considerarlo como un puesto que dura toda la profundidad de la tubería. Todas las operaciones pendientes se completan antes de que cualquier nueva operación se inicie en la tubería. "Estado global" incluiría elementos como el contador del programa o la configuración de caché / MMU.
Una causa importante de una descarga de tubería es cualquier rama condicional. Hasta que la lógica de control sepa en qué dirección va a ir la rama, no se pueden procesar nuevas instrucciones. Se han inventado muchos métodos para mitigar los efectos de las ramas condicionales, incluidas las "ranuras de retardo de rama" que se rellenan con las instrucciones que se ejecutan independientemente de la dirección de la rama y la "ejecución especulativa" que ejecuta las instrucciones en una o ambas rutas de rama potenciales ( a veces combinada con la lógica de "predicción de ramificación"), y los resultados se descartan posteriormente por la ruta no tomada.
A veces, no se implementa ningún soporte de hardware para las dependencias de datos, y la carga recae exclusivamente en el compilador para programar las operaciones, insertando los NOP cuando sea necesario, para evitarlos. Curiosamente, este fue el enfoque utilizado por las primeras versiones de la arquitectura MIPS, pero implementaciones posteriores han introducido soporte de hardware.
Es curioso que debas preguntar esto sobre el MIPS en particular. MIPS es sinónimo de Máquina sin Etapas de Tubería entrelazadas, es decir, fue diseñada para evitar completamente las paradas de la tubería. Incluso el vaciado requerido mientras se estaba optimizando la ramificación se implementó mediante una ranura de retardo, lo que significa que la instrucción que sigue a una rama se ejecutará independientemente de si se tomó la rama. Si no me equivoco, también había una ranura de retraso de carga de memoria, lo que significaba que la instrucción inmediatamente después de una carga no podía acceder al resultado de la carga. Si un bloqueo era realmente necesario (probablemente debido a una alta carga de memoria de latencia), la unidad de control simplemente tendría que alimentar los NOP a través de la tubería.
En principio, los bloqueos de tuberías pueden realizarse reduciendo la habilitación del reloj para los registros en algunas etapas de la tubería, y los vaciados (invalidaciones) mediante el enmascaramiento de las habilitaciones de escritura (haciendo que las instrucciones en la tubería no sean efectivas).
Lea otras preguntas en las etiquetas microprocessor mips