0% encontró este documento útil (0 votos)
38 vistas3 páginas

Procesadores Superescalares y Supersegmentados

Los procesadores superescalares utilizan múltiples cauces de instrucciones independientes para procesar varias instrucciones simultáneamente, mejorando así la velocidad y el paralelismo en la ejecución. Este enfoque permite la emisión y finalización de instrucciones en un orden diferente al del código original, utilizando técnicas como el renombramiento de registros para manejar dependencias. A pesar de sus ventajas, los procesadores enfrentan desafíos como excepciones imprecisas y la necesidad de gestionar adecuadamente las dependencias de datos.

Cargado por

nfaccipieri
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
38 vistas3 páginas

Procesadores Superescalares y Supersegmentados

Los procesadores superescalares utilizan múltiples cauces de instrucciones independientes para procesar varias instrucciones simultáneamente, mejorando así la velocidad y el paralelismo en la ejecución. Este enfoque permite la emisión y finalización de instrucciones en un orden diferente al del código original, utilizando técnicas como el renombramiento de registros para manejar dependencias. A pesar de sus ventajas, los procesadores enfrentan desafíos como excepciones imprecisas y la necesidad de gestionar adecuadamente las dependencias de datos.

Cargado por

nfaccipieri
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd

Procesador escalar --> Trabajan con una ejecución secuencial: captan una

instrucción, la decodifican, la ejecutan y cuando termina la ejecución, captan la


segunda instrucción y así sucesivamente.
Luego aparece el segmentado de cause: nuevas operaciones pueden iniciarse mientras
otras están en proceso. Por ejemplo si una instrucción tiene 5 etapas y una
instrucción está en la etapa de decodificación, podemos captar otra instrucción y
así sucesivamente. Es una técnica que nos permite aprovechar mejor el hardware, la
corrida del programa es más rápida pero la velocidad de corrida de una instrucción
es la misma.
Con la necesidad de tener o querer mayores prestaciones, es decir tener máquinas
que corran programas más rápidamente, dieron lugar a la evolución de diseños de
cauces segmentados y surgieron dos técnicas de ejecución de mayores prestaciones:
los procesadores *Supersegmentados* y los *Superescalares*
*ENFOQUE SUPERSEGMENTADO:*
-> Muchas operaciones o etapas no necesitan un ciclo de reloj entero,
por ende puedo dividir ese ciclo en partes y asignárselo a la etapa que
corresponda, es decir puedo usar ese ciclo de reloj (dividido) y asignarlo a
distinto hardware. De esta manera estamos acelerando o adelantando la
corrida/ejecución de las instrucciones (al igual que en la segmentación de cause,
el tiempo para las instrucciones individuales no varía, es decir que tardan lo
mismo) dándonos una mayor frecuencia de ciclo de reloj, de esta forma las etapas de
las instrucciones se transforman en subetapas más pequeñas (por ende más rápidas) y
se transmiten los datos a la mayor velocidad del ciclo de reloj. Este enfoque nos
da un aumento del grado de paralelismo, voy a tener en forma simultanea diferentes
instrucciones que no necesariamente ocupan un ciclo de reloj dado que ahora está
subdividido e incrementa la aceleración percibida (el programa va a correr más
rápido)
*ENFOQUE SUPERESCALAR:* Está pensado para mejorar la velocidad de ejecución
de las instrucciones escalares. Un procesador superescalar usa múltiples cauces de
instrucciones independientes y nos permite procesar más de una instrucción a la
vez. Este enfoque nos da un mejor aprovechamiento del _paralelismo en las
instrucciones_ (grado en que las instrucciones de un programa pueden ejecutarse en
paralelo, es decir que son independiente). Esta mejora conlleva la duplicación de
algunas partes de la CPU/ALU para poder captar múltiples instrucciones, ejecutar
sumas y multiplicaciones y ejecutar carga/almacenamiento al mismo tiempo. La
aceleración de la máquina aumenta dado que se ejecutan más instrucciones en
paralelo.
-> *Limitaciones:* Dependencia de datos verdadera (RAW), dependencia
relativa al procedimiento (de saltos), conflictos en los recursos, dependencia de
salida (WAW), anti-dependencia (WAR).

*Paralelismo de máquina:* Es una medida de la capacidad del procesador para sacar


partido al paralelismo en las instrucciones. El paralelismo de la máquina depende
del número de instrucciones que pueden captarse y ejecutarse al mismo tiempo, del
numero de unidades funcionales y de los mecanismos que usa el procesador para
localizar instrucciones independientes (se utilizan compiladores "inteligentes" que
ven el programa y armar grupos de instrucciones que pueden correr o ejecutarse
simultáneamente sin perder cuidado con los problemas de dependencias de datos que
pueden aparecer al reordenar el código).
El procesador tiene que ser capaz de identificar el paralelismo en las
instrucciones y cuando localiza las instrucciones independientes debe tener en
cuenta: el orden en que se captan las instrucciones, el orden en que se ejecutan y
el orden en que las instrucciones actualizan los contenidos de los registros y de
las posiciones de memoria. Cuanto más sofisticado sea el procesador, menos limitado
estará por la relación entre este ordenamiento.
*Política de emisión de instrucciones:*
*Emisión en orden y finalización en orden:* Se emiten instrucciones en el
orden exacto en que lo haría una ejecución secuencial (emisión en orden) y escribir
los resultados en ese mismo orden (finaliza en orden). Es decir que si tengo una
instrucción 1 que tarda 2 ciclos de reloj y una instrucción 2 que tarda 1 ciclo de
reloj, no voy a poder escribir la instrucción 2 antes que la instrucción 1 dado que
deben finalizar en orden.
*Emisión en orden y finalización desordenada:* La finalización desordenada se
usa en los procesadores RISC escalares. Con esta finalización puede haber cualquier
número de instrucción en la etapa de ejecución en un momento dado, hasta alcanzar
el máximo grado de paralelismo de la máquina ocupando todas las unidades
funcionales. La emisión de instrucciones frena cuando hay una dependencia de datos
o una dependencia relativa al procedimiento. Además surge una dependencia de salida
o escritura-escritura (si ejecuto una instrucción posterior (I2) que escribirá un
valor en un registro que necesitará una instrucción posterior a ella (I3) y todavía
no finalizó una instrucción anterior (I1) que escribirá en ese mismo registro,
sobrescribirá el dato con un valor atrasado y la instrucción posterior a la
posterior (I3) tomará un dato erróneo. Para arreglar esto necesitamos algo más
complejo que la finalización en orden).
*Emisión y finalización desordenada:* Cuando al emisión era ordenada, se
ejecutaban instrucciones hasta que había una dependencia o conflicto. Para poder
emitir de forma desordenada necesitamos desacoplar las etapas del cauce de
decodificación y ejecución (con un buffer llamado ventana de instrucciones). Cuando
un procesador termina de decodificar una instrucción, la coloca en esta ventana.
Mientras el buffer no se llene, el procesador puede seguir captando y decodificando
nuevas instrucciones. Cuando una unidad funcional queda disponible, se puede emitir
una instrucción desde la ventana de instrucciones a la etapa de ejecución.

*RENOMBRE DE REGISTROS:*
Con la emisión desordenada de instrucción y/o finalización desordenada puede
darse el caso de dependencias de salida (WAW) (dos instrucciones intenten escribir
el mismo registro pero la instrucción anterior (I1) tarda más que la posterior
(I2), de esta manera la instrucción anterior y más lenta I1 sobrescribe con un
valor más antiguo el dato que escribió una instrucción posterior I2) y puede darse
también el caso de antidependencias (WAR) (se modifica un valor antes de que una
instrucción anterior lea el dato). Estas dependencias surgen porque los valores de
los registros no pueden reflejar la secuencia de valores dictada por el flujo del
programa, los valores entran en conflicto por el uso de los registros y el
procesador soluciona esto deteniendo alguna etapa del cause. Cuando la ejecución de
una instrucción guarda un resultado en registro, se almacena en un registro nuevo,
a esto se lo conoce como *renombramiento de registros*: el hardware del procesador
asigna *dinámicamente* los registros. Estos están asociados con los valores que
necesitan las instrucciones en diversos instantes de tiempo. Cuando se crea un
nuevo valor de registro, es decir, cuando se ejecuta una instrucción que tiene un
registro como operando destino, se asigna un nuevo registro para ese valor y las
referencias posteriores o sea las instrucciones que accedan a ese valor como
operando fuente, harán referencia a los registros nuevos y de esta manera
solucionaron los problemas de anti-dependencia y dependencia de salida. Sólo quedan
los riesgos de tipo RAW.

*Implementación superescalar*
El hardware que requiere la implementación superescalar tiene ciertos
elementos principales:
Tener bien estudiadas o analizadas las estrategias de captación
simultánea de múltiples instrucciones.
Debe haber una lógica para determinar dependencias verdaderas entre
valores de registros y mecanismos para comunicar esos valores a donde sean
necesarios.
Debe haber un mecanismo para iniciar o emitir múltiples instrucciones
en paralelo.
Recursos para la ejecución en paralelo de multiples instrucciones
(entre ellos: múltiples unidades funcionales segmentadas y jerarquías de memoria
capaces de atender multiples referencias a memoria)
Mecanismos para entregar el estado del procesador en el orden correcto
(es decir que cuando se presentan cosas como pedidos de interrupción debemos tener
un mecanismo que nos devuelva el procesador en el orden correspondiente, o sea sin
alterar los diferentes causes)
El compilador tiene una gran responsabilidad en el aprovechamiento del
procesamiento superescalar porque es el encargado de elegir las instrucciones que
van a correr en forma simultanea y va a tener que manejar las dependencias y
reordenar código.
*Consideraciones*
Cuando se produce una excepción y hay varias instrucciones en ejecución, por
ejemplo una instrucción presenta una excepción y en simultaneo se está ejecutando
otra instrucción, ésta no puede terminar hasta que no se resuelva la excepción de
la primer instrucción. Sin embargo la instrucción que no presentó la excepción pudo
haber modificado ya algún registro o valor y esto nos trae una inconsistencia ->
Estado inconsistente o *excepción imprecisa*. Se debe hacer lo siguiente: las
instrucciones anteriores a la que produjo el problema deben terminar correctamente,
la que origina la excepción y la siguiente se abortan (si la "siguiente" termina
antes que la que origina el problema, no es una finalización definitiva) y la
rutina de tratamiento se comienza por la que originó la excepción. Esto nos asegura
un estado consistente y evitamos que la instrucción siguiente termine antes que la
anterior, si termina antes se aborta o sea vuelve para atrás.
Cuando tenemos interrupciones externas (periféricos): se las llaman
*excepciones precisas*: la unidad de emisión deja de emitir (a la ALU no se le van
a pasar instrucciones para que ejecute) y se cancela la cola, se completan todas
las instrucciones pendientes y comienza el tratamiento de interrupciones.
Existe un compromiso en el funcionamiento de los Superescalares: nos conviene
tener una emisión o ejecución desordenada porque nos permite liberar rápidamente
las ALU (unidades funcionales). También necesitamos completas las instrucciones en
orden así evitamos las excepciones imprecisas (que una instrucción termine antes
que una posterior). La solución que existe para este compromiso es plantear una
*emisión desordenada y finalización ordenada* y así poder solucionar el problema
que nos presentan las excepciones imprecisas. Esta emisión, sumada al
renombramiento de registros nos da como resultado una arquitectura con una mejora
sustancial con respecto a la máquina de base segmentada y aun mejor a la maquina
supersegmentada.

*Resumen:* un procesador superescalar utiliza multiples causes de instrucciones


independientes, cada cause consta de varias etapas y así puede tratar varias
instrucciones a la vez. Introduce un nuevo nivel de paralelismo que permite que
varios flujos de instrucciones se procesen simultáneamente. Los procesadores sacan
provecho del paralelismo de instrucciones (Que tienen que ver con el grado en que
las instrucciones del programa pueden ejecutarse en paralelo). Una vez que se
identifican las instrucciones independientes, el procesador emite o completa
instrucciones en un orden diferente al del código original. El procesador puede
eliminar ciertas dependencias innecesarias mediante el uso de registros adicionales
y renombramiento. Para RISC el uso del salto retardado para evitar atascos no es
muy apropiado para el caso de Superescalares, se suele usar cualquier otra técnica
como btb (branch target buffer)

También podría gustarte