Según tengo entendido, el pipelining se utiliza para acelerar la frecuencia de reloj al procesar más instrucciones a la vez, y los pipelines más largos deberían mejorar la frecuencia de reloj. Sin embargo, mi instructor mencionó que en algunos casos el pipelining podría dañar el reloj, particularmente cuando se divide en la etapa de memoria. Tengo problemas para imaginar cómo es esto posible - seguramente podría dañar el IPC debido a los peligros, pero parece que la frecuencia del reloj no debería verse afectada. ¿Puede alguien indicarme lo que me estoy perdiendo?
Respuesta
¿Demasiados anuncios?Creo que tu pregunta va dirigida a la velocidad de ejecución del programa, y no a la frecuencia de reloj.
Este enlace tiene una forma sencilla de explicar la tubería. Pero la imagen de abajo (del sitio) trae la información de base sobre cómo la estructura de la tubería puede dañar la velocidad de ejecución:
En la imagen se puede ver que el pipeline aprovecha para ejecutar dos o más tareas simultáneamente. El problema es que el periodo de ejecución de un ciclo depende de la tarea más larga de la cadena. Si entran muchas tareas largas en el pipeline, toda la cadena puede sufrir el retraso. Entre este tipo de tareas, las instrucciones de memoria son una de las más largas.
Si todos los accesos a la memoria se realizan de forma dispersa en el código, el tiempo de procesamiento sería mayor. Si los accesos se agrupan, las instrucciones rápidas se ejecutarían sin la interferencia de las más lentas.
Otro problema que puede surgir es la unión de la tubería y la predicción de la rama. La predicción trata de adivinar cuál es el resultado más probable de una if
y comienza a evaluar la ruta adivinada desde el código incluso antes de conocer el resultado. Por lo tanto, todas estas instrucciones se canalizan a través del procesador. Si la suposición resulta ser errónea, el procesador debe esperar a que se borre el búfer de la tubería antes de empezar a evaluar la ruta correcta.