UNIDAD CENTRAL DE PROCESO 14102010

Anuncio
UNIDAD CENTRAL DE PROCESO
CPU: La unidad central de proceso puede considerarse como el cerebro de la computadora;
tiene varias funciones importantes:

Provee almacenamiento, a los diferentes datos e instrucciones para procesar.

Permite rápido acceso a datos almacenados y ejercer control sobre la información;
puede además, desarrollar operaciones aritméticas, lógicas y de control.

Toma de decisiones simples basadas en los resultados de pruebas hechas
previamente; puede también manejar la entrada de datos y salida de información
desde los dispositivos periféricos conectados a la computadora.
En esencia a unidad central de proceso tiene 3 funciones principales:
 Controlar y supervisar el sistema de cómputo, con bases a un programa almacenado en la
unidad de memoria.
Desarrollar las operaciones matemáticas y lógicas que en un momento dado sean necesarias
para procesar datos.
 Controlar el envío y recepción de datos desde las unidades periféricas de la unidad de
memoria.
Para realizar estas funciones el procesador central se vale de las subunidades o subsistemas
que lo componen. El procesador central esta compuesto de 4 partes principales, o
subsistemas:
 Unidad de memoria o almacenamiento primarios
 Unidad de Control
 Unidad Aritmético-Lógica.
 Unidad de control de periféricos.
UNIDAD DE MEMORIA O ALMACENAMIENTO PRIMARIO
En esta unidad se depositan los datos que se envían para procesarse desde los dispositivos
de almacenamiento (manejados por las unidades de entrada/salida), así como los programas
que realizaran los procesados y los resultados obtenidos listos para ser enviados a un
dispositivo de almacenamiento secundario.
La memoria almacena gran información que esta disponible para ser usada por otros
subsistemas de la computadora. A su vez, cuando la memoria recibe alguna información de
otros subsistemas, almacena la información del lugar que le ha sido especificado por la
unidad emisora.
La Unidad de Memoria está constituida a su vez por:
 Unidad de Almacenamiento
 Unidad de Control de Memoria
 Registros de dirección de datos
La unidad de almacenamiento es, como su nombre indica un almacén de depósito de datos
e instrucciones; elemento pasivo que puede equiparse con un estante con varios casilleros
en cada uno de los cuales se colocará un dato. Cada uno de estos casilleros puede contener
el diseño interno de la computadora un número específico de bits.
Las memorias de semiconductores se fabrican en diversas modalidades que podríamos
clasificar en 2 grandes grupos:
 Las de lectura solamente y,
 Las de lectura y escritura
Las memorias de lectura solamente se conocen con las siglas ROM (Read Only Memory;
memoria solo para lectura) y constituyen una nueva concepción de la arquitectura de los
equipo de computo. Normalmente se utilizan para guardar programas de uso general en
forma permanente; convirtiéndose así en un híbrido entre lo que tradicionalmente constituía
el equipo (hardware) y los sistemas y programas (software). Las memorias de lectura y
escritura, erróneamente designados con las siglas RAM (Random Access Memory;
memoria de acceso aleatorio), a diferencia de los ROM, pierden su contenido e información
al faltarles la corriente eléctrica.
Además, permite escribir, leer o modificar un dato tantas veces como sea necesario.
La unidad de almacenamiento es una parte clave de una computadora digital. En ella se
guardan los programas y los datos con los que se trabaja el equipo. De su tamaño y
velocidad de operación depende gran parte de la capacidad de todo el equipo de cómputo.
La unidad de control de memoria es la que coordina en forma autónoma la unidad de
memoria en su totalidad; recibe llamados desde la unidad de control del procesador control
para conectarse con otros subsistemas y reenviar datos. Cuando la unidad de control de
conecta con otros subsistemas recibe de estos una señal que puede indicar que se enviaran
datos a la unidad de almacenamiento o que serán extraídos de ella.
Una vez que la unidad de control del procesador o cualquier otro subsistema llega a la
unidad de control de memoria procede a extraer o a depositar datos; para ello, la unidad de
control de memoria usa dos registros, uno que tendrá la dirección de memoria RDM
(Registro de dirección de memoria), a partir d e la cual se extraerá o depositará un dato, y
otro registro RD (Registro de datos), que contendrá el dato que se ha extraído o que debe
depositarse en la memoria.
UNIDAD DE CONTROL
Con base en las instrucciones registradas en la memoria principal, la UC determina el ritmo
del proceso de los diferentes datos, coordinando el desarrollo dichas instrucciones a través
de las unidades de memoria y de aritmética y lógica, de acuerdo con los requerimientos del
programa almacenado. La unidad de control es el cerebro del equipo; supervisa el proceso
de las demás unidades de la unidad central del proceso y puede permitir una autonomía a
las demás unidades; esto depende del tipo y marca de computadora en cuestión. Aun
cuando un subsistema posea retornará su control a la UC, cada vez que haya completado
una operación.
El programa almacenado indica a la unidad de control la acción que en cada momento debe
llevar a cabo; la UC debe determinar cuál instrucción debe ejecutarse, qué operaciones
deben desarrollarse y la dirección en donde se encuentran los datos que deben procesarse en
un momento dado. Para esto, cuenta con el auxilio de la unidad de control de memoria.
Cada instrucción debe interpretarse antes de ejecutarse, con objeto de saber si es posible
llevarla a cabo. Es importante observar que cada instrucción debe ejecutarse en su propia
secuencia. La unidad de control supervisa la interpretación y ejecución de cada instrucción.
En resumen: la unidad de control interpreta instrucciones, determina que éstas se ejecuten,
direcciona y controla la operación de todas las unidades en el sistema de cómputo; también
vigila el ciclo de máquina.
Este en un intervalo de de tiempo fijo, medido en términos de impulsos eléctricos. El ciclo
de máquina está determinado por el diseño de la unidad central de proceso y es el tiempo
necesario para que la unidad de control accese una unidad de información (esta unidad de
información se define en forma diferente para cada máquina). Para ejecutar una instrucción
se requiere generalmente más de un ciclo de máquina.
Hay dos tipos básicos de ciclos de máquina: el ciclo de instrucción que es el tiempo
requerido para mover una instrucción a la unidad de control y ser analizada por ésta y el
ciclo de ejecución, intervalo de tiempo necesario para ejecutar una instrucción dada.
UNIDAD DE ARITMÉTICA Y LÓGICA
Esta contiene:
 Circuitos.
 Registros.
 Unidad de control de proceso.
 Unidad de algoritmización.
Las operaciones de esta unidad se basan en la adición. La resta se realiza por la adición del
complemento del número original. La división se logra por sustracciones sucesivas y la
multiplicación, por sumas progresivas.
En la unidad de aritmética y lógica se usan dos clases de registros: acumuladores y
sumadores. Los acumuladores constituyen registros especiales en los cuales se almacenan
los resultados de operaciones aritméticas.
El acumulador está formado, por lo general, de un par de registros combinados
conjuntamente para manejar resultados aritméticos.
Los sumadores se encargan de realizar todas las operaciones aritméticas; pueden estar
conectados en serie o paralelo.
UNIDAD DE CONTROL DE PERIFERICOS
Esta unidad controla tanto el tráfico de datos que entran y salen de los diferentes
dispositivos, como el acceso a los mismos periféricos.
Cuando una instrucción de programa demanda la salida o entrada de datos, la unidad de
control hace participar en el proceso a la unidad de control hace participar en el proceso a la
unidad de control de periféricos. Esta última determina primeramente si es posible enviar
información desde la memoria principal hacia un dispositivo de salida o enviar datos desde
un dispositivo de entrada a la memoria primaria; para ello verifica si cuenta con un canal
libre para tal fin. Posteriormente determina si el dispositivo por usar está libre o no en ese
momento.
La unidad de control de periféricos actúa como un agente de tránsito, todas las llamadas del
programa para enviar o pedir datos de almacenamientos secundarios son manejadas por esta
unidad la cual determina el momento en que las unidades periféricas de entrada/salida
puedan operar. En la actualidad la unidad de control de periféricos, al igual que los canales
de entrada y salida de datos, se construyen por lo común por pequeños microprocesadores
especialmente diseñados y programados para este propósito.
Puesto que el tiempo en que se procesa una instrucción (aritmética o lógica) dentro del
procesador central es del orden de nanosegundos y el término en que se procesa una
instrucción de entrada/salida tarda milisegundos, es necesario controlar los periféricos a fin
de que no exista traslape en la información; para lo cual la unidad de control de periféricos
coordina los canales que permiten la transmisión.
El canal es esencialmente la unidad de control para una o más unidades de entrada/salida
por las cuales los datos son traídos dentro o llevados fuera de la unidad de almacenamiento
secundario.
RISC
De Wikipedia, la enciclopedia libre
Saltar a navegación, búsqueda
DEC Alpha AXP 21064, un microprocesador RISC
En la arquitectura computacional, RISC (del inglés reduced instruction set computer) es un
tipo de microprocesador con las siguientes características fundamentales:
1. Instrucciones de tamaño fijo y presentadas en un reducido número de formatos.
2. Sólo las instrucciones de carga y almacenamiento acceden a la memoria por datos.
Además estos procesadores suelen disponer de muchos registros de propósito general.
El objetivo de diseñar máquinas con esta arquitectura es posibilitar la segmentación y el
paralelismo en la ejecución de instrucciones y reducir los accesos a memoria. Las máquinas
RISC protagonizan la tendencia actual de construcción de microprocesadores. PowerPC,
DEC Alpha, MIPS, ARM, ... son ejemplos de algunos de ellos.
RISC es una filosofía de diseño de CPU para computadora que está a favor de conjuntos de
instrucciones pequeñas y simples que toman menor tiempo para ejecutarse. El tipo de
procesador más comúnmente utilizado en equipos de escritorio, el x86, está basado en
CISC en lugar de RISC, aunque las versiones más nuevas traducen instrucciones basadas en
CISC x86 a instrucciones más simples basadas en RISC para uso interno antes de su
ejecución.
La idea fue inspirada por el hecho de que muchas de las características que eran incluidas
en los diseños tradicionales de CPU para aumentar la velocidad estaban siendo ignoradas
por los programas que eran ejecutados en ellas. Además, la velocidad del procesador en
relación con la memoria de la computadora que accedía era cada vez más alta. Esto
conllevó la aparición de numerosas técnicas para reducir el procesamiento dentro del CPU,
así como de reducir el número total de accesos a memoria.
Terminología más moderna se refiere a esos diseños como arquitecturas de cargaalmacenamiento.
Contenido
[ocultar]








1 Filosofía de diseño antes de RISC
2 Filosofía de diseño RISC
o 2.1 Multitarea
3 Historia
4 Características
5 Primeros diseños RISC
6 RISC moderno
7 Véase también
8 Enlaces externos
[editar] Filosofía de diseño antes de RISC
Uno de los principios básicos de diseño para todos los procesadores es añadir velocidad al
proveerles alguna memoria muy rápida para almacenar información temporalmente, estas
memorias son conocidas como registros. Por ejemplo, casi cada CPU incluye una orden
para sumar dos números. La operación básica de un CPU sería cargar esos dos números en
los registros, sumarlos y almacenar el resultado en otro registro, finalmente, tomar el
resultado del último registro y devolverlo a la memoria principal.
Sin embargo, los registros tienen el inconveniente de ser algo complejos para implementar.
Cada uno está representado por transistores en el chip, en este aspecto la memoria principal
tiende a ser mucho más simple y económica. Además, los registros le añaden complejidad
al cableado, porque la unidad central de procesamiento necesita estar conectada a todos y
cada uno de los registros para poder utilizarlos por igual.
Como resultado de esto, muchos diseños de CPU limitan el uso de registros de alguna u
otra manera. Algunos incluyen pocos registros, aunque esto limita su velocidad. Otros
dedican sus registros a tareas específicas para reducir la complejidad; por ejemplo, un
registro podría ser cap registros, mientras que el resultado podría estar almacenado en
cualquiera de ellos.
En el mundo de la microcomputación de los años setenta, éste era un aspecto más de las
CPU, ya que los procesadores eran entonces demasiado lentos –de hecho había una
tendencia a que el procesador fuera más lento que la memoria con la que se comunicaba-.
En esos casos tenía sentido eliminar casi todos los registros, y entonces proveer al
programador de una buena cantidad de maneras de tratar con la memoria para facilitar su
trabajo.
Dado el ejemplo de la suma, la mayoría de los diseños de CPU se enfocaron a crear una
orden que pudiera hacer todo el trabajo automáticamente: llamar los dos números que
serían sumados, sumarlos, y luego almacenarlos fuera directamente. Otra versión podría
leer los dos números de la memoria, pero almacenaría el resultado en un registro. Otra
versión podría leer uno de la memoria y otro desde un registro y almacenarlo en la memoria
nuevamente. Y así sucesivamente.
La meta en general en aquel tiempo era proveer cada posible modo de direccionamiento
para cada instrucción, un principio conocido como ortogonalidad. Esto llevó a un CPU
complejo, pero en teoría capaz de configurar cada posible orden individualmente, haciendo
el diseño más rápido en lugar de que el programador utilizara órdenes simples.
La última representación de este tipo de diseño puede ser vista en dos equipos, el MOS
6502 por un lado, y el VAX en el otro. El chip 6502 de $25 USD efectivamente tenía
solamente un registro, y con la configuración cuidadosa de la interfaz de memoria fue
capaz de sobrepasar diseños corriendo a velocidades mayores (como el Zilog Z80 a 4MHz).
El VAX era un minicomputador que en una instalación inicial requería 3 gabinetes de
equipo para un solo CPU, y era notable por la sorprendente variedad de estilos de acceso a
memoria que soportaba, y el hecho de que cada uno de éstos estaba disponible para cada
instrucción.
[editar] Filosofía de diseño RISC
A finales de los setenta, investigaciones en IBM (y otros proyectos similares en otros
lugares) demostraron que la mayoría de esos modos de direccionamiento ortogonal eran
ignorados por la mayoría de los programas. Esto fue un efecto colateral en el incremento en
el uso de compiladores para generar los programas, algo opuesto a escribirlos en lenguaje
ensamblador. Los compiladores tendían a ser demasiado tontos en términos de las
características que usaban, un efecto colateral del intento por hacerlos pequeños. El
mercado se estaba moviendo hacia un uso más generalizado de los compiladores, diluyendo
aún más la utilidad de los modelos ortogonales.
Otro descubrimiento fue que debido a que esas operaciones eran escasamente utilizadas, de
hecho tendían a ser más lentas que un número pequeño de operaciones haciendo lo mismo.
Esta paradoja fue un efecto colateral del tiempo que se utilizaba diseñando los CPU, los
diseñadores simplemente no tenían tiempo de optimizar cada instrucción posible, y en vez
de esto sólo optimizaban las más utilizadas. Un famoso ejemplo de esto era la instrucción
VAX INDEX, que se ejecutaba más lentamente que un ciclo que implementara el mismo
código.
Casi al mismo tiempo, las CPU comenzaron a correr a velocidades mayores que las de la
memoria con la que se comunicaban. Aún a finales de los setenta, era aparente que esta
disparidad continuaría incrementándose al menos durante la siguiente década, para
entonces los CPU podrían ser cientos de veces más rápidos que la memoria. Esto significó
que los avances para optimizar cualquier modo de direccionamiento serían completamente
sobrepasados por las velocidades tan lentas en las que se llevaban a cabo.
Otra parte del diseño RISC llego desde las medidas prácticas de los programas en el mundo
real. Andrew Tanenbaum reunió muchos de éstos, demostrando así que la mayoría de los
procesadores estaban sobredimensionados. Por ejemplo, él demostró que el 98 % de todas
las constantes en un programa podían acomodarse en 13 bits, aun cuando cada diseño de
CPU dedicaba algunos múltiplos de 8 bits para almacenarlos, típicamente 8, 16 o 32, una
palabra entera. Tomando este hecho en cuenta sugiere que una máquina debería permitir
que las constantes fuesen almacenadas en los bits sin utilizar de otras instrucciones,
disminuyendo el número de accesos a memoria. En lugar de cargar números desde la
memoria o los registros, éstos podrían estar ahí mismo para el momento en el que el CPU
los necesitara, y por lo tanto el proceso sería mucho más rápido. Sin embargo, esto requería
que la instrucción misma fuera muy pequeña, de otra manera no existiría suficiente espacio
libre en los 32 bits para mantener constantes de un tamaño razonable.
Fue el pequeño número de modos y órdenes que dio lugar al término Conjunto de
Instrucciones Reducidas. Ésta no es una definición correcta, ya que los diseños RISC
cuentan con una vasta cantidad de conjuntos de instrucciones para ellos. La verdadera
diferencia es la filosofía para hacer todo en registros y llamar y guardar los datos hacia ellos
y en ellos mismos. Ésta es la razón por la que la forma más correcta de denominar este
diseño es cargar-almacenar. Con el paso del tiempo las técnicas de diseño antiguas se
dieron a conocer como Computadora con Conjunto de Instrucciones Complejo, CISC por
sus siglas en inglés, aunque esto fue solamente para darles un nombre diferente por razones
de comparación.
Por esto la filosofía RISC fue crear instrucciones pequeñas, implicando que había pocas, de
ahí el nombre conjunto de instrucciones reducido. El código fue implementado como series
de esas instrucciones simples, en vez de un sola instrucción compleja que diera el mismo
resultado. Esto hizo posible tener más espacio dentro de la instrucción para transportar
datos, resultando esto en la necesidad de menos registros en la memoria. Al mismo tiempo
la interfaz con la memoria era considerablemente simple, permitiendo ser optimizada.
Sin embargo RISC también tenía sus desventajas. Debido a que una serie de instrucciones
son necesarias para completar incluso las tareas más sencillas, el número total de
instrucciones para la lectura de la memoria es más grande, y por lo tanto lleva más tiempo.
Al mismo tiempo no estaba claro dónde habría o no una ganancia neta en el desempeño
debido a esta limitación, y hubo una batalla casi continua en el mundo de la prensa y del
diseño sobre los conceptos de RISC.
[editar] Multitarea
Debido a lo redundante de las microinstrucciones, los sistemas operativos diseñados para
estos microprocesadores, contemplaban la capacidad de subdividir un microprocesador en
varios, reduciendo el número de instrucciones redundantes por cada instancia del mismo.
Con una arquitectura del sofware optimizada, los entornos visuales desarrollados para estas
plataformas, contemplaban la posibilidad de ejecutar varias tareas en un mismo ciclo de
reloj. Así mismo, la paginación de la memoria RAM era dinámica y se asignaba una
cantidad suficiente a cada instancia, existiendo una especie de 'simbiosis' entre la potencia
del microprocesador y la RAM dedicada a cada instancia del mismo.
La multitarea dentro de la arquitectura CISC nunca ha sido real, tal como en los RISC sí lo
es. En CISC, el microprocesador en todo su conjunto está diseñado en tantas instrucciones
complejas y diferentes, que la subdivisión no es posible, al menos a nivel lógico. Por lo
tanto, la multitarea es aparente y por ordenes de prioridad. Cada ciclo de reloj trata de
atender a una tarea instanciada en la RAM y pendiente de ser atendida. Con una cola de
atención por tarea FIFO para los datos generados por el procesador, y LIFO para las
interrupciones de usuario, trataban de dar prioridad a las tareas que el usuario
desencadenara en el sistema. La apariencia de multitarea en un CISC tradicional, biene de
la mano de los modelos escalares de datos, convirtiendo el flujo en un vector con distintas
etapas y creando la tecnología pipeline.
Los microprocesadores actuales, al ser hibridos, permiten cierta parte de multitarea real. La
capa final al usuario es como un CISC tradicional, mientras que las tareas que el usuario
deja pendientes, dependiendo del tiempo de inactividad, el sistema traducirá las
instrucciones (el software ha de ser compatible con esto) CISC a RISC, pasando la
ejecución de la tarea a bajo nivel, en donde los recursos se procesan con la filosofía RISC.
Dado que el usuario solo atiende una tarea por su capacidad de atención, el resto de tareas
que deja pendientes y que no son compatibles con el modelo de traducción CISC/RISC,
pasan a ser atendidas por el tradicional pipeline, o si son tareas de bajo nivel, tal como
desfragmentaciones de disco, chequeo de la integridad de la información, formateos, tareas
gráficas o tareas de cálculo matemático intenso.
En vez de tratar de subdividir a un solo microprocesador, se incorporó un segundo
microprocesador gemelo, indéntico al primero. El inconveniente es que la RAM debía de
ser tratada a nivel hardware y los módulos diseñados para plataformas monoprocesador no
eran compatibles o con la misma eficiencia, que para las plataformas multiprocesador. Otro
inconveniente, era la fragmentación del BYTE de palabra. En un RISC tradicional, se
ocupan los BYTES de la siguiente forma: Si la palabra es de 32 BITS (4 BYTES de palabra
de 8 BITS cada una, o dos de 16 o una de 32), dependiendo de la profundidad del dato
portado, dentro del mismo BYTE, se incluian partes de otras instrucciones y datos. Ahora,
al ser dos microprocesadores distintos, ambos usaban registros independientes, con accesos
a la memoria propios (en estas plataformas, la relacion de RAM por procesador es de 1/1).
En sus orígenes, las soluciones se parecían a las típícas ñapas de albanil, cada placa base
incorporaba una solución solamente homologada por la chip set usada y los drivers que la
acompañaban. Si bien la fragmentación siempre ha sido como ese mosquito que zumba en
el oido, pero que por pereza permitimos que nos pique, llegó un momento que era
imposible evadir el zumbido. Esta época llegó con las plataformas de 64 BITS.
[editar] Historia
Mientras la filosofía de diseño RISC se estaba formando, nuevas ideas comenzaban a surgir
con un único fin: incrementar drásticamente el rendimiento de la CPU.
Al principio de la década de los ochenta se pensaba que los diseños existentes estaban
alcanzando sus límites teóricos. Las mejoras de la velocidad en el futuro serían hechas con
base en procesos mejorados, esto es, pequeñas características en el chip. La complejidad
del chip podría continuar como hasta entonces, pero un tamaño más pequeño podría resultar
en un mejor rendimiento del mismo al operar a más altas velocidades de reloj. Se puso una
gran cantidad de esfuerzo en diseñar chips para computación paralela, con vínculos de
comunicación interconstruidos. En vez de hacer los chips más rápidos, una gran cantidad de
chips serían utilizados, dividiendo la problemática entre éstos. Sin embargo, la historia
mostró que estos miedos no se convirtieron en realidad, y hubo un número de ideas que
mejoraron drásticamente el rendimiento al final de la década de los ochenta.
Una idea era la de incluir un canal por el cual se pudieran dividir las instrucciones en pasos
y trabajar en cada paso muchas instrucciones diferentes al mismo tiempo. Un procesador
normal podría leer una instrucción, decodificarla, enviar a la memoria la instrucción de
origen, realizar la operación y luego enviar los resultados. La clave de la canalización es
que el procesador pueda comenzar a leer la siguiente instrucción tan pronto como termine
la última instrucción, significando esto que ahora dos instrucciones se están trabajando (una
está siendo leída, la otra está comenzando a ser decodificada), y en el siguiente ciclo habrá
tres instrucciones. Mientras que una sola instrucción no se completaría más rápido, la
siguiente instrucción sería completada enseguida. La ilusión era la de un sistema mucho
más rápido. Esta técnica se conoce hoy en día como Segmentación de cauce.
Otra solución más era utilizar varios elementos de procesamiento dentro del procesador y
ejecutarlos en paralelo. En vez de trabajar en una instrucción para sumar dos números, esos
procesadores superescalares podrían ver la siguiente instrucción en el canal y tratar de
ejecutarla al mismo tiempo en una unidad idéntica. Esto no era muy fácil de hacer, sin
embargo, ya que algunas instrucciones dependían del resultado de otras instrucciones.
Ambas técnicas se basaban en incrementar la velocidad al añadir complejidad al diseño
básico del CPU, todo lo opuesto a las instrucciones que se ejecutaban en el mismo. Siendo
el espacio en el chip una cantidad finita, para poder incluir todas esas características algo
más tendría que ser eliminado para hacer hueco. RISC se encargó de tomar ventaja de esas
técnicas, esto debido a que su lógica para el CPU era considerablemente más simple que la
de los diseños CISC. Aun con esto, los primeros diseños de RISC ofrecían una mejora de
rendimiento muy pequeña, pero fueron capaces de añadir nuevas características y para
finales de los ochenta habían dejado totalmente atrás a sus contrapartes CISC. Con el
tiempo esto pudo ser dirigido como una mejora de proceso al punto en el que todo esto
pudo ser añadido a los diseños CISC y aun así caber en un solo chip, pero esto tomó
prácticamente una década entre finales de los ochenta y principios de los noventa.
[editar] Características
En pocas palabras esto significa que para cualquier nivel de desempeño dado, un chip RISC
típicamente tendrá menos transistores dedicados a la lógica principal. Esto permite a los
diseñadores una flexibilidad considerable; así pueden, por ejemplo:







Incrementar el tamaño del conjunto de registros.
Mayor velocidad en la ejecución de instrucciones.
Implementar medidas para aumentar el paralelismo interno.
Añadir cachés enormes.
Añadir otras funcionalidades, como E/S y relojes para minicontroladores.
Construir los chips en líneas de producción antiguas que de otra manera no serían
utilizables.
No hacer nada, ofrecer el chip para aplicaciones de bajo consumo de energía o de
tamaño limitado.
Las características que generalmente son encontradas en los diseños RISC son:




Codificación uniforme de instrucciones (ejemplo: el código de operación se
encuentra siempre en la misma posición en cada instrucción, la cual es siempre una
palabra), lo que permite una decodificación más rápida.
Un conjunto de registros homogéneo, permitiendo que cualquier registro sea
utilizado en cualquier contexto y así simplificar el diseño del compilador (aunque
existen muchas formas de separar los ficheros de registro de entero y coma
flotante).
Modos de direccionamiento simple con modos más complejos reemplazados por
secuencias de instrucciones aritméticas simples.
Los tipos de datos soportados en el hardware (por ejemplo, algunas máquinas CISC
tiene instrucciones para tratar con tipos byte, cadena) no se encuentran en una
máquina RISC.
Los diseños RISC también prefieren utilizar como característica un modelo de memoria
Harvard, donde los conjuntos de instrucciones y los conjuntos de datos están
conceptualmente separados; esto significa que el modificar las direcciones donde el código
se encuentra pudiera no tener efecto alguno en las instrucciones ejecutadas por el
procesador (porque la CPU tiene separada la instrucción y el caché de datos, al menos
mientras una instrucción especial de sincronización es utilizada). Por otra parte, esto
permite que ambos cachés sean accedidos separadamente, lo que puede en algunas
ocasiones mejorar el rendimiento.
Muchos de esos diseños RISC anteriores también compartían una característica no muy
amable, el slot de salto retardado (Delay Slot). Un slot de salto retardado es un espacio de
instrucción siguiendo inmediatamente un salto. La instrucción en este espacio es ejecutada
independientemente de si el salto se produce o no (en otras palabra el salto es retardado).
Esta instrucción mantiene la ALU de la CPU ocupada por el tiempo extra normalmente
necesario para ejecutar una brecha. Para utilizarlo, recae en el compilador la
responsabilidad de reordenar las instrucciones de manera que el código sea coherente para
ejecutar con esta característica. En nuestros días el slot de salto retardado se considera un
desafortunado efecto colateral de la estrategia particular por implementar algunos diseños
RISC. Es por esto que los diseños modernos de RISC, tales como ARM, PowerPC, y
versiones más recientes de SPARC y de MIPS, generalmente eliminan esta característica.
[editar] Primeros diseños RISC
Una consola del CDC 6600 mainframe system
El primer sistema que pudiera ser considerado en nuestros días como RISC no lo era así en
aquellos días; era la supercomputadora CDC 6600, diseñada en 1964 por Seymour Cray.
Cray la diseñó como un CPU para cálculos a gran escala (con 74 códigos, comparada con
un 8086 400, además de 12 computadores simples para manejar los procesos de E/S (la
mayor parte del sistema operativo se encontraba en uno de éstos).
El CDC 6600 tenía una arquitectura de carga/almacenamiento con tan solo dos modos de
direccionamiento. Había once unidades de canalización funcional para la aritmética y la
lógica, además de cinco unidades de carga y dos unidades de almacenamiento (la memoria
tenía múltiples bancos para que todas las unidades de carga/almacenamiento pudiesen
operar al mismo tiempo). El nivel promedio de operación por ciclo/instrucción era 10 veces
más rápido que el tiempo de acceso a memoria.
Los diseños RISC que más se dieron a conocer sin embargo, fueron aquellos donde los
resultados de los programas de investigación de las universidades eran ejecutados con
fondos del programa DARPA VLSI. El programa VLSI prácticamente desconocido hoy en
día, llevo a un gran número de avances en el diseño de chips, la fabricación y aún en las
gráficas asistidas por computadora.
El proyecto RISC de la Universidad de Berkeley comenzó en 1980 bajo la dirección de
David A. Patterson, basándose en la obtención de rendimiento a través del uso de la
canalización y un agresivo uso de los registros conocido como ventanas de registros. En
una CPU normal se tienen un pequeño número de registros, un programa puede usar
cualquier registro en cualquier momento. En una CPU con ventanas de registros, existen un
gran número de registros (138 en el RISC-I), pero los programas solo pueden utilizar un
pequeño número de estos (32 en el RISC-I) en cualquier momento.
Un programa que se limita asimismo a 32 registros por procedimiento puede hacer
llamadas a procedimientos muy rápidas: la llamada, y el regreso, simplemente mueven la
ventana de 32 registros actual para limpiar suficiente espacio de trabajo para la subrutina, y
el regreso restablece esos valores.
El proyecto RISC entregó el procesador RISC-I en 1982. Consistiendo de solo 44.420
transistores (comparado con promedios de aproximadamente 100.000 en un diseño CISC de
esa época) RISC-I solo tenía 32 instrucciones, y aun así sobrepasaba el desempeño de
cualquier otro diseño de chip simple. Se continuó con esta tendencia y RISC-II en 1983
tenía 40.760 transistores y 39 instrucciones, con los cuales ejecutaba 3 veces más rápido
que el RISC-I.
Casi al mismo tiempo, John Hennessy comenzó un proyecto similar llamado MIPS en la
Universidad de Stanford en 1981. MIPS se centraba casi completamente en la
segmentación, asegurándose de que ejecutara tan lleno como fuera posible. Aunque la
segmentación ya había sido utilizada en otros diseños, varias características del chip MIPS
hacían su segmentación mucho más rápida. Lo más importante, y quizá molesto de estas
características era el requisito de que todas las instrucciones fueran capaces de completarse
en un solo ciclo. Este requisito permitía al canal ser ejecutado a velocidades más altas (no
había necesidad de retardos inducidos) y es la responsable de la mayoría de la velocidad del
procesador. Sin embargo, también tenía un efecto colateral negativo al eliminar muchas de
las instrucciones potencialmente utilizables, como una multiplicación o una división.
El primer intento por hacer una CPU basada en el concepto RISC fue hecho en IBM el cual
comenzó en 1975, precediendo a los dos proyectos anteriores. Nombrado como proyecto
RAN, el trabajo llevó a la creación de la familia de procesadores IBM 801, la cual fue
utilizada ampliamente en los equipos de IBM. El 801 fue producido eventualmente en
forma de un chip como ROMP en 1981, que es la abreviatura de Research Office Products
Division Mini Processor. Como implica el nombre, esta CPU fue diseñada para tareas
pequeñas, y cuando IBM lanzó el diseño basado en el IBM RT-PC en 1986, el rendimiento
no era aceptable. A pesar de esto, el 801 inspiró varios proyectos de investigación,
incluyendo algunos nuevos dentro de IBM que eventualmente llevarían a su sistema IBM
POWER.
En los primeros años, todos los esfuerzos de RISC eran bien conocidos, pero muy
confinados a los laboratorios de las universidades que los habían creado. El esfuerzo de
Berkeley se dio a conocer tanto que eventualmente se convirtió en el nombre para el
proyecto completo. Muchos en la industria de la computación criticaban el que los
beneficios del rendimiento no se podían traducir en resultados en el mundo real debido a la
eficiencia de la memoria de múltiples instrucciones, y ésa fue la razón por la que nadie los
estaba utilizando. Pero a comienzos de 1986, todos los proyectos de investigación RISC
comenzaron a entregar productos. De hecho, casi todos los procesadores RISC modernos
son copias directas del diseño RISC-II.
[editar] RISC moderno
La investigación de Berkeley no fue comercializada directamente, pero el diseño RISC-II
fue utilizado por Sun Microsystems para desarrollar el SPARC, por Pyramid Technology
para desarrollar sus máquinas de multiprocesador de rango medio, y por casi todas las
compañías unos años más tarde. Fue el uso de RISC por el chip de SUN en las nuevas
máquinas el que demostró que los beneficios de RISC eran reales, y sus máquinas
rápidamente desplazaron a la competencia y esencialmente se apoderaron de todo el
mercado de estaciones de trabajo.
John Hennessy dejó Stanford para comercializar el diseño MIPS, comenzando una
compañía conocida como MIPS Computer Systems Inc. Su primer diseño fue el chip de
segunda generación MIPS-II conocido como el R2000. Los diseños MIPS se convirtieron
en uno de los chips más utilizados cuando fueron incluidos en las consolas de juego
Nintendo 64 y PlayStation. Hoy son uno de los procesadores integrados más comúnmente
utilizados en aplicaciones de alto nivel por Silicon Graphics.
IBM aprendió del fallo del RT-PC y tuvo que continuar con el diseño del RS/6000 basado
en su entonces nueva arquitectura IBM POWER. Entonces movieron sus computadoras
centrales S/370 a los chips basados en IBM POWER, y se sorprendieron al ver que aun el
conjunto de instrucciones muy complejas (que era parte del S/360 desde 1964) corría
considerablemente más rápido. El resultado fue la nueva serie System/390 que aún hoy en
día es comercializada como zSeries. El diseño IBM POWER también se ha encontrado
moviéndose hacia abajo en escala para producir el diseño PowerPC, el cual eliminó muchas
de las instrucciones solo IBM y creó una implementación de chip único. El PowerPC fue
utilizado en todas las computadoras Apple Macintosh hasta 2006, y está comenzando a ser
utilizado en aplicaciones automotrices (algunos vehículos tienen más de 10 dentro de ellos),
las consolas de videojuegos de última generación (PlayStation 3, Nintendo Wii y Xbox
360) están basadas en PowerPC.
Casi todos los demás proveedores se unieron rápidamente. De los esfuerzos similares en el
Reino Unido resultó el INMOS Trasputer, el Acorn Archimedes y la línea Advanced RISC
Machine, la cual tiene un gran éxito hoy en día. Las compañías existentes con diseños
CISC también se unieron a la revolución. Intel lanzó el i860 y el i960 a finales de los
ochenta, aunque no fueron muy exitosos. Motorola construyó un nuevo diseño pero no le
vio demasiado uso y eventualmente lo abandonó, uniéndose a IBM para producir el
PowerPC. AMD lanzó su familia 29000 la cual se convirtió en el diseño RISC más popular
a principios de los noventa.
Hoy en día los microcontroladores y CPU RISC representan a la vasta mayoría de todos los
CPU utilizados. La técnica de diseño RISC ofrece poder incluso en medidas pequeñas, y
esto ha venido a dominar completamente el mercado de CPU integrados de bajo consumo
de energía. Los CPU integrados son por mucho los procesadores más comunes en el
mercado: considera que una familia completa con una o dos computadoras personales
puede poseer varias docenas de dispositivos con procesadores integrados. RISC se ha
apoderó completamente del mercado de estación de trabajo. Después del lanzamiento de la
SUN SPARCstation los otros proveedores se apuraron a competir con sus propias
soluciones basadas en RISC. Aunque hacia 2006-2010 las estaciones de trabajo pasaron a la
arquitectura x86-64 de Intel y AMD. Incluso el mundo de las computadoras centrales está
ahora basado completamente en RISC.
Esto es sorprendente en vista del dominio del Intel x86 y x86 64 en el mercado de las
computadoras personales de escritorio (ahora también en el de estaciones de trabajo),
ordenadores portátiles y en servidores de la gama baja. Aunque RISC fue capaz de avanzar
en velocidad muy rápida y económicamente.
Los diseños RISC han llevado a un gran número de plataformas y arquitecturas al éxito,
algunas de las más grandes:

La línea MIPS Technologies Inc., que se encontraba en la mayoría de las
computadoras de Silicon Graphics hasta 2006, y estuvo en las consolas ya
descatalogadas Nintendo 64, PlayStation y PlayStation 2. Actualmente se utiliza en
la PlayStation Portable y algunos routers.

La serie IBM POWER, utilizado principalmente por IBM en Servidores y
superordenadores.
La versión PowerPC de Motorola e IBM (una versión de la serie IBM POWER)
utilizada en los ordenadores AmigaOne, Apple Macintosh como el iMac, eMac,
Power Mac y posteriores (hasta 2006). Actualmente se utiliza en muchos sistemas
empotrados en automóviles, routers, etc, así como en muchas consolas de
videojuegos, como la Playstation 3, Xbox 360 y Nintendo Wii.


El procesador SPARC y UltraSPARC de Sun Microsystems y Fujitsu, que se
encuentra en sus últimos modelos de servidores (y hasta 2008 también en estaciones
de trabajo).

El PA-RISC y el HP/PA de Hewlett-Packard, ya descatalogados.

El DEC Alpha en servidores HP AlphaServer y estaciones de trabajo AlphaStation,
ya descatalogados.

El ARM – Se encuentra en dispositivos PALM, Nintendo DS, Game Boy Advance
y en múltiples PDAs, teléfonos móviles, smartphones y reproductores multimedia
(como el iPod).
Pipeline
Pipelinining
domingo, 01 de junio de 2008 07:09 p.m.
La Segmentación (pipelining) es un método por el cual se consigue aumentar el
rendimiento de algunos sistemas electrónicos digitales. Es aplicado, sobre todo, en
microprocesadores. El nombre viene de que para impulsar el gas en un oleoducto a la
máxima velocidad es necesario dividir el oleoducto en tramos y colocar una bomba que de
un nuevo impulso al gas. El símilar con la programación existe en que los cálculos deben
ser registrados o sincronizados con el reloj cada cierto tiempo para que la ruta crítica (tramo
con más carga o retardo computacional entre dos registros de reloj) se reduzca.
La ruta crítica es en realidad la frecuencia máxima de trabajo alcanzada por el conjunto. A
mayor ruta crítica (tiempo o retraso entre registros) menor es la frecuencia máxima de
trabajo y a menor ruta crítica mayor frecuencia de trabajo. La una es la inversa de la otra.
Repartir o segmentar equitativamente el cálculo hace que esa frecuencia sea la óptima a
costa de más área para el almacenamiento o registro de los datos intervinientes y de un
retraso o latencia (en ciclos de reloj/tiempo) en la salida del resultado equivalente al
número de segmentaciones o registros realizados. La ventaja primordial de este sistema es
que, tal y como se muestra en la imagen, una vez el pipe está lleno, es decir, después de una
latencia de cuatro en la imagen, los resultados de cada comando vienen uno tras otro cada
flanco de reloj y sin latencia extra por estar encadenados dentro del mismo pipe. Todo esto
habiendo maximizado la frecuencia máxima de trabajo.
Detalle de la segmentación de instrucciones.
El alto rendimiento y la velocidad elevada de los modernos procesadores, se debe,
principalmente a la conjunción de tres técnicas:
Arquitectura Harvard (arquitectura que propicia el paralelismo).
Procesador tipo RISC.
Segmentación.
Consiste en descomponer la ejecución de cada instrucción en varias etapas para poder
empezar a procesar una instrucción diferente en cada una de ellas y trabajar con varias a la
vez.
En el caso del procesador DLX podemos encontrar las siguientes etapas en una instrucción:
IF: búsqueda
ID: decodificación
EX: ejecución de unidad aritmético lógica
MEM: memoria
WB: escritura
Cada una de estas etapas de la instrucción usa en exclusiva un hardware determinado del
procesador, de tal forma que la ejecución de cada una de las etapas en principio no
interfiere en la ejecución del resto.
En el caso de que el procesador no pudiese ejecutar las instrucciones en etapas
segmentadas, la ejecución de la siguiente instrucción sólo se podría llevar a cabo tras la
finalización de la primera. En cambio en un procesador segmentado, salvo excepciones de
dependencias de datos o uso de unidades funcionales, la siguiente instrucción podría iniciar
su ejecución tras acabar la primera etapa de la instrucción actual.
Otro ejemplo de lo anterior, en el caso del PIC, consiste en que el procesador realice al
mismo tiempo la ejecución de una instrucción y la búsqueda del código de la siguiente.
Superpipeline
La reducción del período de reloj τ sin reducir el tiempo total de cada etapa, y permitiendo
que se emita una instrucción por ciclo, se denomina. Un procesador superpipeline posee sus
etapas supersegmentadas, cada una de las cuales duran varios ciclos
Superescalar
Es el término utilizado para designar un tipo de microarquitectura de procesador capaz de
ejecutar más de una instrucción por ciclo de reloj. El término se emplea por oposición a la
microarquitectura escalar que sólo es capaz de ejecutar una instrucción por ciclo de reloj.
En la clasificación de Flynn, un procesador superescalar es un procesador de tipo MIMD
(multiple instruction multiple data). La microarquitectura superescalar utiliza el paralelismo
de instrucciones además del paralelismo de flujo, éste último gracias a la estructura en
pipeline. La estructura típica de un procesador superescalar consta de un pipeline con las
siguientes etapas:
lectura (fetch)
decodificación (decode)
lanzamiento (dispatch)
ejecución (execute)
escritura (writeback)
finalización (retirement)
En un procesador superescalar, el procesador maneja más de una instrucción en cada etapa.
El número máximo de instrucciones en una etapa concreta del pipeline se denomina grado,
así un procesador superescalar de grado 4 en lectura (fetch) es capaz de leer como máximo
cuatro instrucciones por ciclo. El grado de la etapa de ejecución depende del número y del
tipo de las unidades funcionales.
Un procesador superescalar suele tener unidades funcionales independientes de los tipos
siguientes :
Unidad aritmético lógica (ALU)
Unidad de lectura / escritura en memoria (Load/Store Unit)
Unidad de coma flotante (Floating Point Unit)
Unidad de salto (Branch unit)
Un procesador superescalar es capaz de ejecutar más de una instrucción simultáneamente
únicamente si las instrucciones no presentan algún tipo de dependencia (hazard). Los tipos
de dependencia entre instrucciones son :
Dependencia estructural, esta ocurre cuando dos instrucciones requieren el mismo tipo
unidad funcional y su número no es suficiente.
Dependencia de datos, esta ocurre cuando una instrucción necesita del resultado de otra
instrucción para ejecutarse, por ejemplo R1<=R2+R3 y R4<=R1+5.
Dependencia de escritura o falsa dependencia , esta ocurre cuando dos instrucciones
necesitan escribir en la misma memoria, por ejemplo R1<=R2+R3 y R1<=R1+5.
La detección y resolución de las dependencias entre instrucciones puede ser estática
(durante la compilación) o dinámica, es decir, a medida que se ejecuta un programa,
generalmente durante la etapas de codificación y lanzamiento de las instrucciones.
La detección y resolución dinámica de las dependencias entre instrucciones suele realizarse
mediante alguna variante del algoritmo de Tomasulo que permite la ejecución de
instrucciones en un orden distinto al del programa también llamada ejecución en desorden .
La eficacia de un procesador superescalar viene limitada por un lado por la dificultad en
suministrar al procesador suficientes instrucciones que puedan ser ejecutadas en paralelo y
por otro lado por las prestaciones de la jerarquía de memorias.
Si las instrucciones de salto son un problema para los procesadores con pipeline en general,
en el caso de los procesadores superescalares, el problema se multiplica ya que un parón en
el pipeline tiene consecuencias en un número mayor de instrucciones.
Por esta razón, los fabricantes de procesadores recurren a técnicas de ejecución
especulativa y diseñan algoritmos de predicción de saltos cada vez más sofisticados así
como sistemas de almacenamiento de instrucciones por trazas (trace caches).
Las arquitecturas superescalares adolecen de una estructura compleja y de un mal
aprovechamiento de sus recursos debido en parte a la dificultad en encontrar suficientes
instrucciones paralelizables. Una forma de obtener un mayor número de instrucciones
paralelizables es aumentar la ventana de instrucciones, es decir el conjunto de instrucciones
que la unidad de lanzamiento considera como candidatas a ser lanzadas en un momento
dado.
Desafortunadamente la complejidad del procesador superescalar aumenta
desproporcionadamente con respecto al tamaño de dicha ventana lo que se traduce por un
ralentizamiento general del circuito. Otra forma de obtener más instrucciones paralelizables
es manipulando instrucciones de más de un programa a la vez, lo que se conoce bajo el
nombre de multitarea simultánea o multithreading simultáneo.
Mientras las primeras CPUs superescalares disponían de dos ALUs y una sola FPU, un
procesador moderno como el PowerPC 970 incluye cuatro ALUs y dos FPUs, además de
dos unidades SIMD. Si el despachador no es eficiente haciendo trabajar lo máximo posible
a estas unidades, el rendimiento global del procesador se verá mermado.
La CDC 6600 de Seymour Cray, construida en 1965, es la primera arquitectura
superescalar, siendo llevado el concepto a las microcomputadoras en las CPUs RISC. Esta
posibilidad venía dada por la simpleza de los núcleos RISC, permitiendo meter más
unidades de ejecución en un mismo chip.
Esta fue una de las razones de la rapidez de los sistemas RISC frente a los más antiguos
CISC durante las décadas de los 80 y los 90, pero a medida que los procesos de fabricación
mejoraron y se pudieron meter más y más transistores en el mismo chip, hasta diseños
complejos como el IA-32 pudieron ser superescalares.
La inmensa mayoría de las CPUs desarrolladas desde 1998 son superescalares.
Llegados a un punto en que la mejora sustancial de la unidad de control y despachamiento
parece imposible, ya no parece que los diseños superescalares puedan dar más de sí. Una de
las posibles soluciones es trasladar la lógica de despachamiento desde el chip hasta el
compilador, que puede invertir mucho más tiempo en tomar las mejores decisiones
posibles, ya que no tiene que operar en tiempo real como tenía que hacer el hardware de
despachamiento.
Este es el principio básico de los procesadores VLIW (Very Long Instruction Word), donde
el paralelismo es explicitado por el formato de instrucción, también conocidos como
superescalares estáticos
Riesgos de salto o de control
Los riesgos de salto o de control ocurren cuando el procesador se ve obligado a saltar a una
instrucción que no tiene por qué ser necesariamente la inmediatamente siguiente en el
código. En ese caso, el procesador no puede saber por adelantado si debería ejecutar la
siguiente instrucción u otra situada más lejos en el código.
Esto puede resultar en acciones no deseadas por parte de la CPU.
Eliminación de riesgos de salto
Ejecución especulativa
En ciencias de la computación, la ejecución especulativa es la ejecución de código por parte
del procesador que no tiene por qué ser necesaria a priori. En la programación funcional,
suele usarse el término "evaluación especulativa".
La ejecución especulativa no es más que una optimización. Obviamente, sólo es útil cuando
la ejecución previa requiere menos tiempo y espacio que el que requeriría la ejecución
posterior, siendo este ahorro lo suficientemente importante como para compensar el
esfuerzo gastado en caso de que el resultado de la operación nunca llegue a usarse.
Los procesadores modernos que hacen uso de un pipeline usan la ejecución especulativa
para, entre otras cosas, reducir el coste computacional de las instrucciones de salto
condicional. Cuando el procesador se encuentra con una instrucción de salto condicional, el
procesador intenta adivinar donde es más probable que se salte (a esto se le llama
predicción de saltos) e inmediatamente comienza a ejecutar el código que empieza en ese
área. Si a posteriori se demuestra que la predicción fue errónea, todo lo ejecutado después
del salto se descarta. Esta ejecución prematura sale realmente rentable en términos de uso
de recursos puesto que si no el pipeline se pararía hasta conocer cual sería la próxima
instrucción.
Hay un tipo de ejecución 'vaga' que no realiza este tipo de predicciones. La incorporación
de la ejecución especulativa en lenguajes de programación es un tema de investigación
actualmente, probándose en diversas implementaciones de Haskell. Las versiones recientes
del GHC permiten un tipo de ejecución especulativa llamada "ejecución optimista".
Hueco de retardo
En arquitectura de computadores, un hueco de retardo contiene una instrucción que es
ejecutada sin tener en cuenta los efectos de la instrucción precedente. La forma más común
consiste en una instrucción arbitraria sencilla colocada inmediatamente después de una
instrucción de salto en las arquitecturas RISC o DSP; esta instrucción se ejecutará incluso si
el salto precedente es efectivo. De este modo las instrucciones parecen ejecutarse de un
modo ilógico o incorrecto. Es típico de los lenguajes ensambladores reordenar
automáticamente las instrucciones, cubriendo de este modo las carencias de algunos
compiladores.
Huecos de retardo de salto
Los huecos de retardo en que se ven involucradas las instrucciones de salto son conocidos
como huecos de retardo de salto. Se encuentran principalmente en las arquitecturas DSP y
RISC más antiguas. Las arquitecturas MIPS, PA-RISC, ETRAX CRIS, SuperH y SPARC
son arquitecturas RISC que tienen un único huecos de retardo de salto; las arquitecturas
PowerPC, ARM y la recientemente diseñada DEC Alpha carecen de él. Las arquitecturas
de los DSP pueden ser de hueco único o doble (ejecutan dos instrucciones entre el inicio de
la instrucción de salto y su resolución).
El objetivo de la segmentación RISC clásica es mantener los registros de segmentación
ocupados en todo momento. El hueco de retardo de salto es un efecto colateral de las
arquitecturas segmentadas debido a los riesgos. Un diseño sencillo insertaría burbujas en la
segmentación después del salto hasta que la dirección de destino sea computada y cargada
en el contador de programa. Cada ciclo en que se inserta una burbuja es considerado un
hueco de retardo de salto. Un diseño más sofisticado ejecutaría las instrucciones del
programa no dependientes del resultado de la instrucción de salto. Esta optimización puede
ser realizada mediante software en tiempo de compilación moviendo instrucciones desde
memoria al hueco de retardo de salto, siempre y cuando el hardware soporte esta operación.
Otro efecto colateral es el especial cuidado que hay que tener con los puntos de ruptura y
las ejecuciones línea a línea durante el proceso de depuración de programas.
El número ideal de huecos de retardo de salto en una determinada implementación
segmentada viene dado por el número de etapas de segmentación, la presencia de unidades
anticipadoras, la etapa en que se computen las condiciones de salto, si se utiliza o no un
buffer de destino de salto, etc. Los requisitos de compatibilidad de software marcan que una
arquitectura no puede cambiar el número de huecos de retardo de una generación a la
siguiente. Esto requiere inevitablemente que las nuevas implementaciones del hardware
contengan componentes a mayores para asegurar que el comportamiento de la arquitectura
se mantiene a pesar de no ser ya relevante.
Hueco de retardo de carga
Un hueco de retardo de carga es una instrucción que se ejecuta inmediatamente después de
una carga (copia de memoria a registro) pero que no ve el resultado de dicha carga. Estos
huecos de retardo son poco comunes porque los retardos por cargas son altamente
impredecibles en el hardware actual. Una carga puede ser satisfecha por la RAM por la
caché, y puede ser ralentizada por la distribución de recursos. Los retardos por cargas eran
propios de los diseños más primitivos de procesadores RISC. El repertorio de instrucciones
MIPS1 (utilizado en los procesadores R3000 y anteriores) sufre este problema.
El siguiente código de ejemplo está escrito en ensamblador MIPS1, mostrando tanto un
hueco de retardo de carga como de salto.
lw v0,4(v1) # carga de la palabra almacenada en la dirección v1+4 en el registro v0
nop # hueco de retardo de carga
jr v0 # salto incondicional a la dirección especificada por el registro v0
nop # hueco de retardo de salto
Un salto es una interrupción del flujo normal de las instrucciones, haciendo que el
procesador continúe en otro punto del programa ("salta" a otra parte del programa). Un
salto condicional es una instrucción (más bien una familia de instrucciones) que realiza el
salto si se cumple una condición determinada con anterioridad. El problema es que el
procesador no sabe si se realizará el salto o no hasta que se evalúa la condición y si esto
ocurre en la mitad del pipeline, es posible que tenga que borrar el pipeline y comenzar de
nuevo en el nuevo punto de ejecución, perdiendo tiempo y trabajo.
Para evitar interrumpir el pipeline, el procesador trata de adivinar si se tomará el salto o no,
y seguir leyendo/decodificando/ejecutando las instrucciones de acuerdo a su escogencia.
Claro que no toma la decisión al azar, sino que utiliza circuitos adicionales que guardan la
historia de estos saltos y un algoritmo (no revelado) que lo ayuda a elegir. Además, los
programadores que construyen los compiladores tienen que seguir unas reglas que Intel ha
especificado para ayudar al procesador a realizar una decisión inteligente. trata de adivinar
si se tomará el salto o no, y seguir leyendo/decodificando/ejecutando las instrucciones de
acuerdo a su escogencia. Claro que no toma la decisión al azar, sino que utiliza circuitos
adicionales que guardan la historia de estos saltos y un algoritmo (no revelado) que lo
ayuda a elegir. Además, los programadores que construyen los compiladores tienen que
seguir unas reglas que Intel ha especificado para ayudar al procesador a realizar una
decisión inteligente.
Videos de pipeline.
Descargar