.En las primeras arquitecturas los ordenadores tendían a aumentar su potencia a base de ampliar su repertorio de instrucciones y de añadir instrucciones más potentes. El hecho de que el tiempo de ejecución de una instrucción fuera de varios ciclos de reloj no representaba un problema puesto que las velocidades de la memoria de control eran muy superiores a las velocidades de la memoria principal. Así, aunque el proceso de las microinstrucciones se completase en un ciclo de reloj, no se podría continuar con el proceso de la siguiente instrucción inmediatamente, ya que estaría alojada en la memoria principal, de velocidad mucho más lenta que la memoria de control.
En los años 70, las mejoras tecnológicas permitieron tener velocidades en la memoria principal similares a la memoria de control, lo que hizo posible trabajar con instrucciones simples (que se completan en un ciclo de reloj) y por tanto acelerar considerablemente la ejecución de instrucciones (nada más terminar la ejecución de todas las microinstrucciones se empieza con la ejecución de la siguiente instrucción).
Para ejecutar una tarea se necesitan más instrucciones en RISC que en CISC, ya que en RISC las instrucciones son más elementales. Pero el hecho de tener actualmente unos mecanismos rápidos de acceso a memoria, buses de alta velocidad y compiladores especializados en estas arquitecturas, hace que los ordenadores RISC obtengan en general unos mejores rendimientos.
Ahora bien, algunas de las formas tradicionales de medir el rendimiento, como es el número de MIPS, no son adecuadas para comparar el rendimiento de máquinas CISC y RISC. Esto se debe a que los MIPS dan la cantidad de millones de instrucciones por segundo que desarrolla una máquina, pero no tienen en cuenta la potencia de esas instrucciones. Por el propio diseño de la arquitectura RISC, estas máquinas tienden a desarrollar más MIPS que las CISC.
La arquitectura CISC (Complex Instruction Set Computer) se caracteriza por disponer de un grupo muy amplio de instrucciones muy complejas y potentes. Es más antigua que la arquitectura RISC y por tanto su diseño está marcado por la tecnología existente en los años 60.
La palabra CISC significa conjunto complejo de instrucciones.
Los diseños CISC poseen:
Un gran número de instrucciones
Menor cantidad de registros de uso general
A lo largo de la historia de la computación el hardware se ha ido haciendo cada vez más barato y el software, por el contrario, se ha ido haciendo cada vez más caro; esto puede deberse principalmente al hecho de que los programas durante su ciclo de vida se encuentran en permanente manutención debido a los errores que éstos presentan.
En base a lo anterior se han desarrollado lenguajes de alto nivel que permiten facilitar la tarea del programador.
Los programas realizados en lenguajes de programación deben ser traducidos a lenguaje de máquina por medio de los compiladores. La traducción de código generado en este lenguaje de alto nivel produce ineficiencias en la ejecución, gran tamaño de instrucciones de máquina y complejidad en los compiladores; ya que por ejemplo, los lenguajes de alto nivel poseen estructuras como if o while, mientras los lenguajes de máquina poseen instrucciones como MOVE, ADD y JUMP.
Esto generó los diseños CISC que poseen como objetivos:
· Facilitar el trabajo del programador
· Mejorar la eficiencia de la ejecución, ya que las operaciones se implementan en microcódigo. · Dar soporte a los lenguajes de alto nivel más complejos y sofisticados.
Cada instrucción desarrolla una serie de operaciones dentro del procesador. Esto reduce el número de instrucciones requeridas para implementar un programa dado y permite al programador aprender un pequeño, pero flexible conjunto instrucciones.
Tienen un formato de dos operandos, donde las instrucciones tienen una fuente y un destino. Poseen comandos registro a registro, registro a memoria y memoria a registro.
Tienen modos de direccionamiento múltiple a memoria.
Las instrucciones son de largo variable de acuerdo al modo de direccionamiento. Las instrucciones requieren varios ciclos de reloj para ejecutarse.
Las ventajas de los diseños CISC son:
La microprogramación es fácil de implementar.
El uso de nuevas instrucciones microcodificadas permitió a los diseñadores construir máquinas altamente compatibles; es decir un nuevo computador podía correr los mismos programas que se habían construido para los computadores anteriores ya que el nuevo computador contendría un conjunto más grande que incluiría las instrucciones anteriores.
Como cada instrucción era cada vez más capaz, se usaban menos instrucciones para implementar una tarea dada. Esto hizo más eficiente el relativo uso de la memoria que era muy lenta.
El compilador no es tan complicado, debido a que el conjunto de instrucciones del microprograma pueden ser escritas para ―calzar‖ con los lenguajes de alto nivel.
Las desventajas de los diseños CISC son:
Las primeras versiones de una familia de procesadores generalmente contiene un subconjunto de instrucciones de cada nueva versión, esto ha provocado que el conjunto de instrucciones en el chip sea cada vez más complejo con cada nueva generación de computadores.
Como muchas instrucciones deben ser almacenadas en memoria con el menos espacio posible desperdiciado y las instrucciones pueden ser de cualquier largo, esto provoca que las distintas instrucciones tomarán distintas cantidades de tiempo de reloj para ejecutarse, haciendo más lento el desempeño de la máquina.
Las instrucciones especializadas no son usadas de manera suficientemente frecuente para justificar su existencia, ya que en promedio en un programa típico se usan aproximadamente un 20% de las instrucciones disponibles.
Arquitectura RISC:
Esta arquitectura, denominada RISC (Reduced Instruction Set Computer), se caracteriza por poseer un juego de instrucciones lo más reducido posible con un porcentaje alto de ellas que se completan en un ciclo de reloj. Si hubiese que ejecutar alguna instrucción compleja, necesitaría más de un ciclo de reloj, pero la mayor parte de ellas se pueden realizar a partir de operaciones fundamentales. Por otra parte, es una constatación estadística que la potencia práctica de un ordenador reside en un conjunto pequeño de su repertorio de instrucciones, con lo cual si se reduce dicho repertorio se sigue conservando la potencia del ordenador, y disminuye la complejidad del diseño y el coste.
La palabra RISC significa conjunto reducido de instrucciones.
Los elementos clave compartidos por la mayoría de los diseños RISC son:
Conjunto de instrucciones limitado y sencillo
Un gran número de registros de uso general, o el uso de tecnología de compiladores para optimizar el uso de registros.
Un énfasis en la optimización de segmentación de instrucciones.
El nacimiento de los diseños RISC se originó en el estudio de las características de ejecución de las instrucciones. Se analizaron, en programas escritos en lenguajes de alto nivel, las operaciones realizadas, los operandos usados y el secuenciamiento de la ejecución.
En relación a las operaciones si se observa la siguiente tabla:
Tabla 1: Frecuencia dinámica relativa ponderada de operaciones en lenguajes de alto nivel
Frecuencia dinámica Instrucciones de máquina ponderadas Referencias a memoria ponderadas
Pascal C Pascal C Pascal C
De asignación 45 18 13 13 14 15 Iteraciones 5 3 42 32 33 26 Llamadas a procedimiento 15 12 31 33 44 45 Condicionales 29 43 11 21 7 13 Goto 3 Otras 6 1 3 1 2 1
De la tabla 1 se deduce que la mayoría de las operaciones corresponden a las de asignación, declaraciones condicionales y llamadas a procedimientos. Esto podría indicar que sentencias debieran ser implementadas de manera más óptima, pero se debe notar que las instrucciones que demoran mayor tiempo de ejecución corresponden a las llamadas a procedimiento, ya que hacen más referencias a memoria.
En relación a los operandos si se observa la siguiente tabla:
Tabla 2 Porcentaje dinámico de operandos
Pascal C Promedio Constantes enteras 16 23 20 Variables escalares 58 53 55 Matrices / estructuras 26 24 25
La mayoría de las referencias se hacen a operandos escalares simples. En relación a las llamadas a procedimientos, en un estudio realizado por Tanenbaum en 1978 se determinó que al 98 % de los procedimientos llamados dinámicamente se le pasaban menos de seis argumentos, el 41 % de los procedimientos no tiene parámetros y que el 92 % de ellos usaba menos de seis variables escalares locales.
Luego para diseñar una máquina RISC se pueden tomar en cuenta las siguientes consideraciones:
Analizar las aplicaciones para encontrar las operaciones clave
Diseñar una trayectoria de datos que sea óptima para las operaciones clave (La trayectoria de datos consiste en extraer los operandos de los registros, moverlos a la unidad aritmética y lógica y almacenar el resultado en un registro).
Diseñar instrucciones que realicen las operaciones clave utilizando la trayectoria de datos Agregar nuevas instrucciones siempre que no hagan más lenta la máquina.
En una máquina RISC los programas se compilan en secuencias de microinstrucciones que son ejecutadas directamente por el hardware
En los estudios realizados por Tanenbaum se observó que un 80% de las asignaciones eran de la forma a=b y que sólo el 5% de las asignaciones contenían dos o más operadores. Esto indica que los datos pueden ser almacenados en registros, ya que son el medio de almacenamiento más rápido disponible.
De lo anterior, se deduce que se deben generar estrategias para acceder con mayor frecuencia a éstos y minimizar las operaciones registro-memoria.
Si esto se hace por software, el compilador asignará registros a las variables más utilizadas en un cierto periodo.
Si se hace por hardware se utilizan las llamadas ventanas de registros. Esto se utiliza en las llamadas a procedimiento para almacenar y restaurar las variables locales.
A cada procedimiento se le asigna un pequeño conjunto de registros distinto (Figura 1), que se dividen en: Registros de parámetros, que contienen ya sea los parámetros entregados desde el procedimiento que
lo llamó o los resultados devueltos a éste.
Registros de datos locales, que se usan para las variables locales.
Registros temporales que se usan para intercambiar parámetros, estos registros se traslapan con los registros de datos locales del procedimiento llamado por el procedimiento ―dueño‖ de estos registros.
Los registros de parámetros del Nivel J + 1 contienen los registros temporales del procedimiento que lo llamó del Nivel J y es aquí por donde se devuelven los resultados.
Con esto se logra una transferencia de datos real, ya que los registros son físicamente los mismos.
Como el número de registros es limitado, esto hace que el número de ventanas también lo sea. Por lo tanto, éstas contienen las últimas activaciones de procedimientos. Las activaciones más antiguas se almacenen en memoria y se van recuperando a medida que se liberan los registros. Luego, la organización de estas ventanas es circular, como aparece en la Figura 2.
Aquí existen 6 ventanas. A llamó a B, B llamó a C y C llamó a D; D es el procedimiento activo. El puntero de ventana en curso apunta a D. El puntero de ventana salvada identifica la ventana almacenada en memoria más recientemente. Los traslapes en las ventanas corresponden a los registros temporales y de parámetros de la Figura 1. Si D llama a E, avanza el puntero de ventana. Si E llama a F, se almacenan en memoria las dos primeras partes de A, se avanza el puntero de ventana salvada a B y la llamada a F sigue adelante. En los retornos de procedimiento se retrocede con los punteros.
En el caso de las variables globales que son utilizadas por más de un procedimiento, estas pueden ser almacenadas en memoria provocando un retardo en el tiempo de ejecución; o de lo contrario incorporar a la CPU una cantidad de registros globales, con lo que se debe agregar una numeración para referenciar a los registros.
Como la cantidad de registros en una máquina RISC es reducido y su objetivo es contener los operandos necesarios para los cálculos y minimizar las operaciones de carga y almacenamiento en memoria; se debe decidir que se asigna a los registros en algún punto del programa. La técnica utilizada para asignar los registros es el coloreado de grafos, que consiste en que si dos nodos en un grafo están unidos por un arco, éstos deben tener colores diferentes.
El compilador analiza las interferencias entre registros considerando que si dos registros están ―vivos‖ en un mismo fragmento de programa son unidos por un arco.
Las Arquitecturas CISC se basan en el deseo de simplificar los compiladores y mejorar las prestaciones. Si se desea simplificar los compiladores obviamente se tratará de que las instrucciones en lenguaje de máquina se parezcan a las sentencias de los lenguajes de alto nivel; sin embargo, es más difícil optimizar el código para minimizar su tamaño, reducir el número de instrucciones ejecutadas y mejorar la segmentación. Las arquitecturas CISC tienen programas más pequeños, pero no necesariamente usan menos memoria. Como estas arquitecturas poseen un mayor número de instrucciones necesitan códigos de operación más largos, luego las instrucciones son más largas.
Las arquitecturas RISC tienen como característica el que ejecutan una instrucción en cada ciclo de máquina. La mayoría de las operaciones son del tipo registro a registro, a excepción de LOAD y STORE para acceder a memoria; esto optimiza el uso de los registros, debido a que los operandos más utilizados son accesados más rápidamente. Poseen modos de direccionamiento sencillos, la mayoría es direccionamiento a registro.
La longitud de instrucción es fija y alineada en los límites de una palabra. Las posiciones de los campos de operación son fijas; esto simplifica la unidad de control.
Los programas RISC son más sensibles a las interrupciones que los programas CISC, debido a que estos últimos restringen las interrupciones o definen puntos específicos de interrupción.
Las ventajas de las arquitecturas RISC son:
El desempeño de los procesadores RISC es dos a cuatro veces mejor que el desempeño de los procesadores CISC, debido al pipeline.
El hardware es más simple, debido a que se utiliza menos espacio en el chip, pudiendo éste ser aprovechado para otras cosas como por ejemplo unidades de administración de memoria.
Su ciclo de diseño es más corto, debido también a su mayor simpleza, pueden ser desarrollados más rápido que los CISC.