04 Feb
Segmentación de Cauce (Pipelining): Fundamentos y Paralelismo
La segmentación de cauce (o pipelining) es una técnica fundamentalmente efectiva para organizar el hardware de la Unidad Central de Procesamiento (CPU) con el objetivo de ejecutar más de una operación simultáneamente. Consiste en descomponer el proceso de ejecución de las instrucciones en fases o etapas que permiten una ejecución concurrente. Esta técnica explota el paralelismo entre instrucciones dentro de un flujo secuencial.
Motivos de Retardo o Riesgos en el Cauce
La implementación de la segmentación introduce conflictos que pueden detener o ralentizar el flujo de instrucciones, conocidos como riesgos. Estos se clasifican en tres categorías principales:
1. Riesgos Estructurales
Provocados por conflictos de recursos. Ocurren cuando dos o más instrucciones necesitan utilizar el mismo recurso de hardware en el mismo ciclo de reloj. Un ejemplo clásico es cuando las etapas de Captación de Instrucción (IF) y Acceso a Memoria (MA) intentan usar una memoria unificada simultáneamente.
2. Riesgos por Dependencia de Datos
Surgen cuando dos instrucciones se comunican a través de un dato (una lo produce y la otra lo consume). Los operandos fuente o destino de una instrucción no están disponibles en el momento en que se necesitan en una etapa determinada del cauce.
- Lectura después de Escritura (RAW, Dependencia Verdadera): Una instrucción posterior lee un dato generado por una instrucción anterior.
- Escritura después de Escritura (WAW, Dependencia de Salida): Una instrucción posterior escribe un dato después de que otra instrucción anterior lo haya escrito. Esto solo ocurre si se permite que las instrucciones se adelanten unas a otras.
- Escritura después de Lectura (WAR, Antidependencia): Una instrucción modifica un valor antes de que otra instrucción anterior que aún lo necesita leerlo, lo haya leído. (Nota: Este riesgo generalmente no se presenta en cauces simples con orden de ejecución estricto).
3. Riesgos por Dependencia de Control
Ocurren cuando la ejecución de una instrucción depende del resultado de la ejecución de otra, como en el caso de una instrucción de salto y los dos posibles caminos de ejecución resultantes.
Ventajas y Técnicas para Mitigar los Riesgos
La implementación de la segmentación proporciona una mejora significativa en el rendimiento, buscando alcanzar el máximo teórico de completar una instrucción por ciclo de reloj, lo que incrementa la productividad (throughput), aunque no necesariamente reduce el tiempo de ejecución de una instrucción individual.
Soluciones a Riesgos Estructurales
Estas soluciones se centran en la duplicación o gestión eficiente de los recursos de hardware:
- Duplicación de recursos hardware.
- Uso de sumadores o restadores adicionales a la ALU.
- Separación de memorias para instrucciones y datos (Harvard Architecture).
- Gestión por turnos (turnar) del acceso al banco de registros.
- Programación de escrituras en la primera mitad de los ciclos de reloj y lecturas en la segunda mitad.
Soluciones a Riesgos de Datos (RAW)
Para los riesgos RAW, es crucial determinar cuándo y cómo aparecen los datos:
Por Hardware: Adelantamiento de Operandos (Forwarding)
Consiste en pasar directamente el resultado obtenido por una instrucción a las instrucciones subsiguientes que lo necesitan como operando, sin esperar a que el resultado se escriba completamente en el banco de registros.
Por Software: Uso de NOP o Reordenamiento
Ejecutada por el compilador, esta técnica evita los riesgos reordenando las instrucciones del código fuente sin alterar el resultado final del programa, o insertando instrucciones NOP (No Operation).
Soluciones a Riesgos de Control
La gestión de saltos es compleja, especialmente los condicionales, ya que la dirección de la próxima instrucción depende del resultado de la instrucción actual.
Para Saltos Incondicionales
La única solución es resolver la dirección de la próxima instrucción a ejecutar lo más rápidamente posible.
Para Saltos Condicionales
Se emplean diversas técnicas para manejar la incertidumbre:
- Precaptar el destino del salto (Hardware): Adelantar la resolución de la dirección de salto a la etapa de decodificación. Esto reduce las paradas del cauce a solo una.
- Flujos Múltiples (Hardware): Utilizar varios cauces paralelos, uno para cada posible destino del salto. Desventaja: Aumenta la necesidad de cauces y puede generar retardos en el acceso a buses y registros si hay múltiples saltos simultáneos.
- Buffer de Bucles (Hardware): Una memoria pequeña y rápida gestionada por la etapa de captación. Contiene las instrucciones captadas más recientes. Si se detecta un salto, el hardware verifica si el destino ya está en el buffer.
- Salto Retardado (Software): El compilador reordena automáticamente las instrucciones de modo que las instrucciones que siguen al salto se ejecutan antes de que el salto se resuelva, ocultando la latencia.
- Predicción de Saltos: Intenta adivinar el camino a seguir.
Predicción de Saltos
Soluciones Estáticas
Basadas en reglas fijas:
- Predecir que nunca se salta: Continuar captando instrucciones secuencialmente.
- Predecir que siempre se salta: Captar siempre la instrucción destino del salto.
- Predecir según el código de operación: Asumir el salto para ciertos códigos de bifurcación y no para otros.
Soluciones Dinámicas
Buscan mejorar la exactitud registrando la historia de las instrucciones de bifurcación condicional. Se asocian bits a cada instrucción que reflejan su historial reciente, almacenados en caché o memoria rápida.
- Conmutador Saltar/No Saltar: El procesador usa los bits asociados a la instrucción para tomar una decisión al captar la siguiente instrucción.
- Tabla de Historia de Salto: Similar a la anterior, pero puede almacenar también la dirección de la próxima instrucción o incluso la instrucción completa a ejecutar.

Deja un comentario