TUBERIAS RISC (RISC PIPELINE)
En la historia del hardware de computadora, algunos procesadores RISC usaban una solucion arquitectonica, ahora llamada Risc Pipeline clasico. Esos CPUs eran: MIPS, SPARC, Motorola 88000 y luego DLX.
Cada uno de estos diseños escalares RISC buscaron e intentaron ejecutar una instruccion por ciclo. El concepto principal comun de cada diseño era una ejecucion de 5 etapas de instrucciones de tuberia. Durante la operacion, cada fase de tuberia podria trabajar en una instruccion a la vez.
Cada una de estas fases consisitia de un set inicial de flip-flops y logica combinacional que operaba en las salidas de estos flops.
Las 5 etapas Risc Pipeline
Busqueda de instruccion
La cache de instrucciones en estas maquinas tenia una latencia de un ciclo. Durante la etapa de busqueda de instruccion, una instruccion de 32 bits era buscada desde la cache.
El predictor de la PC envia el contador de programa a la cache de instrucciones para leer la posicion actual. Al mismo tiempo, se predice la direccion de la siguiente instruccion incrementando el contador en 4 (todas las instrucciones tenian 4 bytes de largo). Esta prediccion siempre estaba equivocada en el caso de tomar una rama, saltar o en el caso de una excepcion. Las proximas maquinas usarian algoritmos mas complicados y precisos para adivinar la siguiente direccion de instruccion.
Decodificación
A diferencia de maquinas con microcodigos mas tempranas, la primera maquina RISC no tenia microcodigo. Una vez realizada la busqueda de la cache de instrucciones, los bits de las instrucciones eran desplazadas hacia abajo en la tuberia (pipeline), para que la logica combinacional simple pueda producir, en cada fase de la tuberia, el control de señales para la direccion de datos directamente desde los bits de instrucciones. Como resultado se realiza muy poca decodificación en el estado tradicionalmente llamado fase de decodificación.
Todas las instrucciones MIPS, SPARC y DLX tienen 2 registros de entrada como maximo. Durante la fase de decodificación estos dos nombres de registro son identificados dentro de las instrucciones, y los dos registros nombrados son relidos desde el archivo de registro. En el diseño MIPS, el archivo de registros tenia 32 entradas.
Al mismo tiempo que el archivo de registros era leido, una instruccion logica en esta fase determinaba si la tuberia estaba lista para ejecutar la instruccion en esta fase. Si no lo estaba, la instruccion logica podia causar que las dos fases, la de busqueda y la de decodificacion, se detengan. En un ciclo detenido, las fases podian prevenir a sus flops iniciales de aceptar nuevos bits.
Si la instruccion decodificada era una rama o un salto, la direccion apuntada de la rama o salto era computada en paralelo con la lectura del archivo de registros. El predictor de la PC en la primera fase es asignado al objetivo de la rama en lugar que la direccion incrementada que habia sido computada.
Ejecución
Las instrucciones en estas maquinas RISC simples, podian ser divididas en tres clases de latencia segun el tipo de operación:
- Registro de operacion de registro (Latencia de un solo ciclo): Suma, resta, comparación y operaciones logicas. Durante la etapa de ejecucion, los dos argumentos eran direccionados a una ALU simple, que generaba el resultado al final de la fase de ejecución.
- Memoria de referencia (Latencia de dos ciclos). Todas las cargas de la memoria. Durante la etapa de ejecución, la ALU combinaba los dos argumentos (un registro y una compensación constante) para producir una direccion virtual al final del ciclo.
- Instrucciones multi ciclo (Muchos ciclos de latencia). Integrales, multiplicaciones, divisiones y todas las operaciones de punto flotante. Durante la etapa de ejecución, los operandos de estas operaciones fueron enviadas a la unidad de multi-ciclos de multiplicar/dividir. El resto de la tuberia estaba libre para continuar con la ejecución mientras la unidad de multiplicacion/division hacia su trabajo. Para evitar complicaciones a la fase de reescritura, las instrucciones multiciclo escribian sus resultados en un set de registros separado.
Acceso a Memoria
Durante esta etapa, las instrucciones simples de un ciclo de latencia tenian sus resultados dirigidos a la siguiente etapa. Este dirigimiento asegura que las instrucciones de un ciclo y de dos ciclos siempre escriban sus resultados en la misma etapa de la tuberia, asi que solo un puerto de escritura al archivo de registros podia ser usado y este siempre disponible.
Reescritura
Durante esta etapa, las instrucciones de uno y dos ciclos escriben sus resultandos en el archivo de registros.
Riesgos
Hennessy y Patterson acuñaron el termino "riesgo" para situaciones en las cuales una tuberia completamente trivial podia producir respuestas equivocadas.
Riesgos Estructurales
Estos suceden cuando dos instrucciones podrian tratar de usar los mismos recursos al mismo tiempo. Las tuberias clasicas de RISC evitaban estos riesgos replicando hardware. En particular, instrucciones de rama podian haber usado la ALU para computar la direccion apuntada de la rama. Si la ALU era usada en la etapa de decodificación para ese proposito, una instruccion ALU seguida por una rama podrian haber intentado usar la ALU simultaneamente. Es facil resolver este conflicto diseñando un acumulador de objetivos de rama en la fase de decodificación.
Riesgos de Datos
Estos ocurren cuando una instruccion, ciegamente programada, intentaria usar un dato antes que el dato este disponible en el archivo de registros.
Los riesgos de datos son evitados por cualquiera de las siguientes dos maneras:
- Solucion A, Pasar por alto.
- Solucion B, Entrelazado de tuberias.
ARQUITECTURA LOAD/STORE
En ingenieria de computadoras, una arquitectura load/store, solo permite que la memoria sea accedida por operaciones de carga y almacenamiento, y todos los valores para una operacion sean cargados de la memoria y esten presentes en registros. Siguiendo la operación, el resultado necesita ser almacenado de nuevo en la memoria.
Por ejemplo, en un enfoque de load/sotre, ambos operadores para una operacion de suma deben estar en registros. Esto difiere de una arquitectura de registro-memoria en que uno de los operadores de la suma podria estar en la memoria, mientras que el otro esta en un registro.
El anterior ejemplo de una arquitectura load/store fue el de CDC 6600. Casi todos los procesadores vector usaban el enfoque load/store.
Sistemas RISC como PowerPc, SPARC, ARM o MIPS usan la arquitectura load/store.
PROCESADORES SPARC
SPARC es una arquitectura con un conjunto de instrucciones reducidas.
Fue originalmente diseñada por Sun Microsystems y dirigido por el ingeniero Kaa en 1985, se basa en los diseños RISC I y II de la Universidad de California en Berkeley que fueron definidos entre los años 1980 y 1982.
La empresa Sun Microsystems diseñó esta arquitectura y la licenció a otros fabricantes como Texas Instruments, Cypress Semiconductor, Fujitsu, LSI Logic entre otros.
SPARC es la primera arquitectura RISC abierta y como tal, las especificaciones de diseño están publicadas, así otros fabricantes de microprocesadores pueden desarrollar su propio diseño.
Una de las ideas innovadoras de esta arquitectura es la ventana de registros que permite hacer fácilmente compiladores de alto rendimiento y una significativa reducción de memoria en las instrucciones load/store en relación con otras arquitecturas RISC. Las ventajas se aprecian sobre todo en programas grandes.
La cpu SPARC esta compuesta de una unidad entera, UI (Integer Unit) que procesa la ejecución básica y una FPU (Floating-Point Unit) que ejecuta las operaciones y cálculos de reales. La IU y la FPU pueden o no estar integradas en el mismo chip.
Aunque no es una parte formal de la arquitectura, las computadoras basadas en sistemas SPARC de Sun Microsystems tienen una unidad de manejo de memoria (MMU) y un gran caché de direcciones virtuales (para instrucciones y datos) que están dispuestos periféricamente sobre un bus de datos y direcciones de 32 bits.