Uploaded by ismaelbecker90

Trabajo Final - VLIW

advertisement
UNIVERSIDAD NACIONAL DE MISIONES
FACULTAD DE INGENIERÍA
ARQUITECTURA DE COMPUTADORAS
TRABAJO FINAL
TEMA: FILOSOFÍA DE DISEÑO VLIW
Prof.
Dr. Ing. Carballo Roberto Esteban
Dr. Ing. Aldo Javier Benítez
Ing. Roberto Suenaga
Alumno:
Becker Ismael
FECHA: 14/12/22
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
Índice
Primera definición de VLIW ............................................................................................... 3
Principios básicos de diseño de VLIW ................................................................................ 4
Pipelining .......................................................................................................................... 4
Comparación de Arquitecturas: CISC, RISC y VLIW ............................................................. 6
VLIW en comparación con Superescalar CISC y Superescalarar RISC .................................. 7
El Camino de Datos ......................................................................................................... 12
Ubicación de operandos y resultados .............................................................................. 12
Registros ......................................................................................................................... 13
Modos de direccionamiento ............................................................................................ 13
Tipos de Saltos ................................................................................................................ 13
Diseño del Pipeline .......................................................................................................... 15
Instruction Fetch ............................................................................................................. 15
Longitud de instrucción y alineación ................................................................................ 16
Decodificación y Dispersión ............................................................................................. 16
Unidades Funcionales...................................................................................................... 17
Especulación de Control .................................................................................................. 17
Predicación ..................................................................................................................... 18
Implementación de la Filosofía de Diseño VLIW a partir de la ISA de la LC-3 en Logisim ... 19
Longitud de las Instrucciones .......................................................................................... 19
Diseño Canalizado ........................................................................................................... 21
Instruction Fetch ............................................................................................................. 21
Instruction Decode .......................................................................................................... 21
Execute ........................................................................................................................... 22
Memory .......................................................................................................................... 22
Writeback ....................................................................................................................... 23
Implementaciones........................................................................................................... 23
Conclusión ...................................................................................................................... 25
Bibliografía ...................................................................................................................... 25
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
Primera definición de VLIW
VLIW (Very Long Instruction Word) es una filosofía de diseño arquitectónico.
Más que una metodología definida con precisión, es un conjunto de pautas y creencias
vagamente conectadas. Una definición sintética de la filosofía VLIW podría ser: Exponer el
paralelismo a nivel de instrucción en la arquitectura.
Las arquitecturas VLIW son distintas de las arquitecturas RISC y CISC tradicionales. Los
microprocesadores VLIW y las implementaciones superescalares de conjuntos de instrucciones
tradicionales comparten algunas características: múltiples unidades de ejecución y la capacidad
de ejecutar múltiples operaciones simultáneamente. Las técnicas utilizadas para lograr un alto
rendimiento, sin embargo, son muy diferentes porque el paralelismo es explícito en las
instrucciones VLIW, pero debe ser descubierto por el hardware en tiempo de ejecución por los
procesadores superescalares.
Así como las arquitecturas RISC permiten implementaciones de alto rendimiento más sencillas
y económicas que las CISC, las arquitecturas VLIW son más sencillas y económicas que las RISC
debido a simplificaciones de hardware adicionales.
El término paralelismo hace referencia a las oportunidades en un programa para encontrar
tareas independientes, y realizarlas por separado en lugar de secuencialmente.
En una máquina ILP (Instruction Level Parallelism) se pueden ejecutar múltiples operaciones en
el mismo ciclo de reloj, lo que se logra codificando explícitamente este paralelismo de
ejecución en la arquitectura del conjunto de instrucciones.
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
Principios básicos de diseño de VLIW
El siguiente es un conjunto de características de diseño de VLIW.

Las instrucciones VLIW consisten en operaciones paralelas. Estas operaciones
se ejecutan en paralelo, en hardware paralelo. El compilador garantiza que la
ejecución paralela de estas operaciones sea segura y correcta.

Las implementaciones ejecutan el paralelismo señalado por el compilador.
La implementación confía en el compilador para producir código rápido y correcto. En
particular, no verifica dos veces ni adivina lo que emite el compilador.
Pipelining
El modelo de ejecución de referencia en muchas ISA es la ejecución secuencial, en la que cada
operación se ejecuta hasta su finalización antes de que comience la ejecución de la siguiente
operación.
Una alternativa a esto es la ejecución canalizada (Pipelining), en la que los efectos de una
operación pueden no ser visibles hasta una cierta cantidad de ciclos de reloj después de que se
emita la operación. Aunque se haya emitido una operación, es posible que la siguiente
operación no vea necesariamente los efectos de la operación anterior. El Pipelining es
paralelismo en el tiempo porque la ejecución de diferentes operaciones reutiliza la misma
pieza de hardware en diferentes momentos.
Por ejemplo, en una máquina RISC se logra la segmentación de un procesador de ciclo único,
subdividiéndolo en cinco etapas. Así, cinco instrucciones pueden ejecutarse simultáneamente,
una en cada etapa.
Específicamente, llamamos a las cinco etapas Fetch, Decode, Execute, Memory y Writeback.
En la etapa Fetch, el procesador lee la instrucción de la memoria de instrucciones. En la etapa
de Decode, el procesador lee los operandos fuente del archivo de registro y decodifica la
instrucción para producir las señales de control. En la etapa Execute, el procesador realiza un
cálculo con la ALU. En la etapa Memory, el procesador lee o escribe datos en la memoria, si
corresponde. Finalmente, en la etapa Writeback, el procesador escribe el resultado en el
archivo de registro, si corresponde.
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
La ejecución de operaciones en procesadores donde se incorpora el ILP se caracteriza por los
siguientes aspectos:

Las operaciones se subdividen en etapas de ejecución dentro de un solo ciclo de
máquina.

Las operaciones de más de un ciclo a menudo se dividen en etapas de un ciclo cada
una.

Las operaciones a menudo pueden superponerse, o incluso ejecutarse juntas, porque
utilizan unidades funcionales de hardware completamente separadas.
En un VLIW, el paralelismo se expone explícitamente en las múltiples operaciones que
componen una instrucción VLIW. Una instrucción se ejecuta como un todo, pero las partes de
la instrucción van a un hardware paralelo separado.
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
Comparación de Arquitecturas: CISC, RISC y VLIW
Desde una perspectiva general, las arquitecturas RISC, CISC y VLIW tienen más similitudes que
diferencias. Las diferencias que existen, sin embargo, tienen efectos profundos en las
implementaciones de estas arquitecturas.
Ilustración 1: Comparación de Arquitectura: CISC, RISC y VLIW.
Las diferencias entre RISC, CISC y VLIW están en los formatos y la semántica de las
instrucciones.
Las instrucciones CISC varían en tamaño, a menudo especifican una secuencia de operaciones
y pueden requerir algoritmos de decodificación en serie (lentos). Los CISC tienden a tener
pocos registros, y los registros pueden tener un propósito especial, lo que restringe las formas
en que pueden usarse. Las referencias a memoria normalmente se combinan con otras
operaciones (como agregar memoria al registro). Los conjuntos de instrucciones CISC están
diseñados para aprovechar el microcódigo.
Las instrucciones RISC especifican operaciones simples, tienen un tamaño fijo y son fáciles
(rápidas) de decodificar. Las arquitecturas RISC tienen un número relativamente grande de
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
registros de propósito general. Las instrucciones pueden hacer referencia a la memoria
principal solo a través de operaciones simples de carga de registro desde la memoria y
almacenamiento de registro en la memoria. Los conjuntos de instrucciones RISC no necesitan
microcódigo y están diseñados para simplificar la canalización.
Las instrucciones VLIW son como las instrucciones RISC excepto que son más largas para
permitirles especificar múltiples operaciones simples independientes. Una instrucción VLIW se
puede considerar como varias instrucciones RISC unidas. Las arquitecturas VLIW tienden a ser
similares a RISC en la mayoría de los atributos.
VLIW en comparación con Superescalar CISC y Superescalar RISC
Las diferencias entre las arquitecturas CISC, RISC y VLIW se manifiestan en sus respectivas
implementaciones. Comparar las implementaciones de alto rendimiento de cada uno es aún
más revelador.
Los diseños RISC y CISC de alto rendimiento se denominan implementaciones superescalares.
Superescalar en este contexto simplemente significa "más allá de escalar", donde escalar
significa una operación a la vez. Por lo tanto, superescalar significa más de una operación a la
vez.
Para que CISC o RISC alcancen niveles de rendimiento más altos que los proporcionados por
una sola canalización, se debe construir una implementación superescalar. La naturaleza de
una implementación superescalar es que obtiene, emite y completa más de una instrucción
CISC o RISC por ciclo.
Las implementaciones de RISC superescalar y CISC superescalar comparten complejidades
fundamentales: la necesidad de que el hardware descubra y explote el paralelismo a nivel de
instrucción.
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
Ilustración 2: Diagrama de bloques de alto nivel de una implementación de procesador RISC o
CISC superescalar.
Como se observa en la Ilustración 2, la implementación consta de una colección de unidades
de ejecución (ALU enteras, ALU de coma flotante, unidades de carga/almacenamiento,
unidades de saltos, etc.) que reciben operaciones de un despachador de instrucciones y
operandos de un archivo de registro.
Las unidades de ejecución cuentan con estaciones de reserva para amortiguar operaciones en
espera que han sido emitidas, pero aún no han sido ejecutadas.
Las operaciones pueden estar esperando operandos que aún no están disponibles.
El despachador de instrucciones examina una ventana de instrucciones contenida en un búfer.
El despachador mira las instrucciones en la ventana y decide cuáles se pueden despachar a las
unidades de ejecución. Intenta enviar tantas instrucciones a la vez como sea posible, es decir,
intenta descubrir cantidades máximas de paralelismo a nivel de instrucción. Grados más altos
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
de ejecución superescalar, es decir, más unidades de ejecución, requieren ventanas más
amplias y un despachador más sofisticado.
Los compiladores para procesadores RISC y CISC producen código con ciertos objetivos en
mente. Estos objetivos suelen ser minimizar el tamaño del código y el tiempo de ejecución.
Para implementaciones superescalares de alto rendimiento, el objetivo de minimizar el
tamaño del código limita el rendimiento que puede lograr la implementación superescalar. El
rendimiento es limitado porque la minimización del tamaño del código da como resultado
saltos condicionales frecuentes, aproximadamente cada seis instrucciones.
Conceptualmente, el procesador debe esperar hasta que se resuelva la condición antes de que
pueda comenzar a buscar paralelismo en el destino del salto.
Para evitar esperar a que se resuelvan los saltos condicionales, las implementaciones
superescalares de alto rendimiento implementan la predicción de saltos. Con la predicción de
saltos, el procesador hace una conjetura anticipada sobre el resultado de la condición y
comienza a buscar paralelismo a lo largo de la ruta predicha. El acto de enviar y ejecutar
instrucciones desde una ruta predicha, pero no confirmada, se denomina ejecución
especulativa.
Una implementación VLIW logra el mismo efecto que una implementación RISC o CISC
superescalar, pero el diseño VLIW lo hace sin las dos partes más complejas de un diseño
superescalar de alto rendimiento.
Debido a que las instrucciones VLIW especifican explícitamente varias operaciones
independientes, es decir, especifican explícitamente el paralelismo, no es necesario tener un
hardware de decodificación y envío que intente reconstruir el paralelismo a partir de un flujo
de instrucciones en serie. En lugar de que el hardware intente descubrir el paralelismo, los
procesadores VLIW confían en el compilador que genera el código VLIW para especificar
explícitamente el paralelismo. Confiar en el compilador tiene ventajas.
Primero, el compilador tiene la capacidad de ver ventanas de instrucciones (instrucciones que
pueden ejecutarse fuera de orden) mucho más grandes que el hardware. Para un procesador
superescalar, una ventana de hardware más grande implica una mayor cantidad de lógica y,
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
por lo tanto, de área de chip. Las principales diferencias entre las implementaciones
superescalares de alto rendimiento de RISC y CISC son una cuestión de grado.
Segundo, el compilador tiene conocimiento del código fuente del programa. El código fuente
generalmente contiene información importante sobre el comportamiento del programa que se
puede usar para ayudar a expresar el máximo paralelismo en el nivel del conjunto de
instrucciones. Se puede emplear una técnica poderosa llamada compilación impulsada por
rastreo para mejorar drásticamente la calidad de la salida del código por parte del compilador.
La compilación de unidad de rastreo primero produce un programa VLIW subóptimo, pero
correcto. El programa tiene rutinas integradas que toman nota del comportamiento del
programa. El compilador utiliza el comportamiento del programa registrado (qué ramas se
toman, con qué frecuencia, etc.) durante una segunda compilación para producir código que
aprovecha el conocimiento preciso de comportamiento del programa. Por lo tanto, con la
compilación impulsada por rastreo, el compilador tiene acceso a parte de la información
dinámica que sería evidente para la lógica de despacho de hardware en un procesador
superescalar.
En tercer lugar, con suficientes registros, es posible imitar las funciones del búfer de
reordenación de la implementación superescalar. El propósito del búfer de reordenación es
permitir que un procesador superescalar ejecute instrucciones de manera especulativa y luego
pueda descartar rápidamente los resultados especulativos si es necesario. Con suficientes
registros, una máquina VLIW puede colocar los resultados de instrucciones ejecutadas
especulativamente en registros temporales.
El compilador sabe cuántas instrucciones se ejecutarán especulativamente, por lo que
simplemente usa los registros temporales a lo largo de la ruta especulada (predicha) e ignora
los valores en esos registros a lo largo de la ruta que se tomará si la condición resulta haber
sido mal pronosticada.
Si bien una arquitectura VLIW reduce la complejidad del hardware en comparación con una
implementación superescalar, se requiere un compilador mucho más complejo.
Extraer el máximo rendimiento de una implementación RISC o CISC superescalar requiere
técnicas de compilación sofisticadas, pero el nivel de sofisticación en un compilador VLIW es
significativamente mayor.
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
VLIW simplemente traslada la complejidad del hardware al software. Afortunadamente, esta
compensación tiene un beneficio secundario significativo: la complejidad se paga solo una vez,
cuando se escribe el compilador en lugar de cada vez que se fabrica un chip. Entre los posibles
beneficios se encuentra un chip más pequeño, que conduce a mayores ganancias para el
proveedor del microprocesador y/o precios más bajos para los clientes que usan los
microprocesadores. La complejidad suele ser más fácil de manejar en un diseño de software
que en un diseño de hardware. Por lo tanto, el chip puede costar menos diseñar, ser más
rápido de diseñar y puede requerir menos depuración, todos los cuales son factores que
pueden hacer que el diseño sea más económico. Además, se pueden realizar mejoras en el
compilador después de que se hayan fabricado los chips; las mejoras en el hardware de
despacho superescalar requieren cambios en el microprocesador, que naturalmente incurre en
todos los gastos de convertir un diseño de chip.
El formato de instrucción VLIW más simple codifica una operación para cada unidad de
ejecución en la máquina. Esto tiene sentido bajo el supuesto de que cada instrucción siempre
tendrá algo útil para cada unidad de ejecución. Desafortunadamente, a pesar de los mejores
esfuerzos de los mejores algoritmos de compilación, normalmente no es posible empaquetar
cada instrucción con trabajo para todas las unidades de ejecución. Además, en una máquina
VLIW que tiene unidades de ejecución tanto de enteros como de coma flotante, el mejor
compilador no podría mantener ocupadas las unidades de coma flotante durante la ejecución
de una aplicación de solo enteros.
El problema con las instrucciones que no hacen un uso completo de todas las unidades de
ejecución es que desperdician valiosos recursos del procesador: espacio de memoria de
instrucciones, espacio de caché de instrucciones y ancho de banda del bus.
Las instrucciones se pueden comprimir con una representación más codificada. Se puede
utilizar cualquier número de técnicas, como la codificación Huffman para asignar la menor
cantidad de bits a las operaciones utilizadas con mayor frecuencia.
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
El Camino de Datos
El camino de datos de una arquitectura VLIW se entiende como el conjunto de sus unidades de
ejecución, que realizan la transformación de datos. Un compilador desglosa el cálculo de un
programa en operaciones básicas que luego asigna a las unidades de cálculo correspondientes.
Ilustración 3: Implementación genérica de VLIW.
Ubicación de operandos y resultados
Las arquitecturas VLIW, como muchos procesadores RISC, se basan en archivos de registro
grandes y una semántica de instrucciones más simple. Como consecuencia, un conjunto de
instrucciones VLIW se limita en gran medida a operaciones de registro a registro que leen y
escriben valores hacia y desde registros individuales.
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
Registros
Un registro es básicamente cualquier contenedor arquitectónicamente visible que no sea
memoria. La colección de registros representa el estado del núcleo del procesador. Los
registros se organizan en conjuntos homogéneos, llamados archivos de registro.
Además de las propiedades estándar de los archivos de registro (direccionabilidad, no
volatilidad, velocidad y tamaño pequeño), la arquitectura VLIW sigue dos principios de diseño
principales. Primero, todos los registros son direccionables individualmente, y el hardware
proporciona un mecanismo para acceder a cualquier registro y copiar su contenido en otro
lugar. En segundo lugar, las operaciones nunca escriben registros implícitamente; todos los
destinos deben ser explícitos.
Modos de direccionamiento
La mayoría de los accesos a la memoria en la ejecución de un programa se asignan
naturalmente a una forma base + desplazamiento.
Tipos de Saltos
Los Saltos (Branches) son todas las técnicas arquitectónicas que admiten cambios de flujo de
control en la ejecución del programa.

Los Saltos Condicionales son cambios de flujo de control basados en una condición. Si
la condición es falsa, la ejecución continúa en la ruta de acceso fallido.

Los Saltos Incondicionales (gotos) siempre hacen que el programa cambie el flujo de
control a la nueva ubicación del programa.

Las Llamadas a Funciones (branch-and-link) son saltos incondicionales que también
guardan la ubicación de la instrucción que sigue a la llamada (la dirección de retorno).

Los Saltos Indirectos hacen que el programa salte incondicionalmente a una dirección
variable (típicamente, la dirección se almacena en un registro).
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
Diseño del archivo de registro
Los archivos de registro son direccionables, en el sentido de que cada puerto de lectura o
escritura puede especificar un registro independiente para leer o escribir durante el ciclo actual.
Los procesadores acceden a los registros en su tamaño natural; típicamente 8, 16 o 32 bits.
Cada bit de un registro está representado por una celda de bit, que es el bloque de
construcción fundamental del archivo de registro general.
Para crear un archivo de registro, las celdas de bits se agrupan para formar registros
individuales y los registros se agrupan para formar el archivo de registro general. Los archivos
de registro normalmente se organizan como cuadrículas bidimensionales de cables, donde
(por ejemplo) las rutas de control se ejecutan horizontalmente y las rutas de datos se ejecutan
verticalmente. Por ejemplo, en un archivo de registro RISC canónico, con 32 registros, cada uno
con un tamaño de palabra de 32 bits. En este caso, las rutas de datos verticales corresponden
a las posiciones de bit dentro de la palabra, mientras que las rutas de control horizontales
seleccionan un solo registro del archivo. Al afirmar una de las 32 líneas de control, cada una de
las celdas de bits en esa fila coloca datos en su línea de datos correspondiente, lo que permite
que el valor de 32 bits del registro se lea desde las rutas de datos.
En los archivos de registro con múltiples puertos, hay muchas líneas de datos y control
adicionales correspondientes, ya que las líneas de control y las líneas de datos deben
implementarse por separado para el acceso independiente a las celdas de bits.
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
Diseño del Pipeline
Las etapas iniciales de una ejecución de pipeline (front-end) se utilizan para obtener,
decodificar, emitir y preparar las operaciones para la ejecución. Transforma el flujo de
instrucciones de la memoria de instrucciones en operaciones.
Instruction Fetch
Suponiendo una caché de instrucciones estándar que alimenta el front-end, el front-end debe
obtener (fetch) instrucciones del caché de instrucciones en un búfer de instrucciones VLIW, lo
que puede incluir la alineación de la instrucción desde su posición de memoria original para
que coincida con el diseño del búfer de instrucciones.
Dependiendo de la instrucción y la codificación de la operación, es posible que el front-end
tenga que segmentar la instrucción en operaciones separadas.
Luego, decodifica (decode) al menos parcialmente cada operación, lo que proporciona
información sobre los requisitos de registro y unidad funcional.
Después de la decodificación, el front-end dispersa (disperse) las operaciones a las unidades
funcionales apropiadas.
Ilustración 4: Fetching de instrucciones VLIW. Una primera fase Aling (alineación) desplaza el
paquete de búsqueda a una posición conocida. Luego una segunda fase Disperse(dispersión)
enruta las operaciones a los slots que corresponden a las unidades funcionales controladas.
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
Longitud de instrucción y alineación
Una operación VLIW corresponde a una sola operación para una sola unidad funcional,
independientemente de la latencia que requiera la operación para completarse. Una
instrucción VLIW consta de un conjunto de operaciones VLIW (una instrucción puede tener una
longitud variable o fija, según el esquema de codificación de la ISA). Un paquete es una unidad
orientada a la obtención y decodificación, que puede incluir instrucciones múltiples, únicas o
parciales y operaciones únicas o múltiples, pero se alinea claramente con los límites de la línea
de caché.
El tema fundamental en el paso Aling es determinar los límites de instrucción; es decir, dónde
comienza y termina cada instrucción VLIW. Una vez que se han encontrado los límites de
instrucción, la unidad de alineación utiliza un cambiador o multiplexor grande para seleccionar
una subsecuencia contigua de la línea de caché de instrucción y colocarla en el búfer de
instrucción.
Decodificación y Dispersión
Con la instrucción alineada en el búfer de instrucciones, las tareas restantes del front-end son
decodificar parcialmente las operaciones en la instrucción y dispersar esas instrucciones a los
grupos y unidades funcionales que las ejecutarán.
Dentro de una instrucción VLIW, la codificación de operaciones similar a RISC hace que la
decodificación o la decodificación parcial sean relativamente simples. Los bits del Opcode para
las operaciones pueden ser completamente independientes (como con la codificación RISC).
Dado que los clústeres y las unidades funcionales son entidades separadas geográficamente,
las conexiones entre la unidad de dispersión y sus clientes son cables largos que funcionan
lentamente debido a la disminución de las capacidades de conducción de los transistores cada
vez más pequeños en la tecnología actual. Hay poco que hacer al respecto, y muchas
microarquitecturas asignan uno o más ciclos para el retardo de propagación del cable en la
etapa de dispersión.
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
Unidades Funcionales
Las máquinas modernas incluyen una variedad de tipos de unidades funcionales, aunque la
ALU sigue siendo la base de muchas operaciones.
Las unidades funcionales son funcionales en el sentido de que su salida es una función bien
definida de sus entradas.
Dependiendo de la cantidad de niveles de lógica necesarios para implementar una función en
particular, se puede optar por dividir los niveles en múltiples ciclos de reloj y, por lo tanto, en
múltiples etapas de canalización, pero es posible que los resultados correspondientes no estén
disponibles hasta varios ciclos de reloj después de que se hayan presentado las entradas. Esta
canalización es la razón de las latencias expuestas en muchas máquinas orientadas a ILP.
Especulación de Control
La Especulación de Control es una técnica utilizada en los diseños VLIW, que consiste en elevar
un bloque básico de instrucciones sobre un branch. Estas instrucciones se vuelven
especulativas y no pueden comprometerse hasta que se conozca la condición del branch.
Las ventajas de esta especulación son que los recursos se pueden utilizar mejor en partes de
los programas que exhiben un ILP bajo, y las instrucciones con latencia larga se pueden iniciar
antes. Sin embargo, además del hecho de que los resultados de las instrucciones especulativas
deben almacenarse temporalmente hasta que se resuelva la condición, otro problema que
puede surgir es el de las excepciones. Una excepción provocada por una instrucción
especulativa no debe manejarse si la instrucción especulativa no se va a ejecutar. Una forma
de evitar este problema es agregar una etiqueta de 1 bit (bit venenoso), al registro de
resultados de una instrucción especulativa que ha generado una excepción. El bit se filtra a
través de registros de resultados.
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
Predicación
En un procesador VLIW el número de saltos condicionales a ejecutar se puede reducir
utilizando la predicación. La forma más simple de una instrucción predicada es un movimiento
condicional.
Ilustración 5: Ejemplo de sentencia if-then-else: (a)Código Usual, (b)Código Predicado.
A la izquierda está el código habitual: se evalúa la expresión condicional. Luego se prueba: si es
verdadero, se toma el Branch y se ejecuta la secuencia de sentencias S1; si es falso, se ejecuta
la secuencia de sentencias S2. Además, será necesario un Salto Incondicional después de la
última declaración en S2.
Con la predicación, la expresión condicional se calcula y produce un predicado. Todas las
declaraciones en S1 y S2 se predican con el nombre del predicado. Las declaraciones en S1
deben ejecutarse si el predicado es verdadero, y las de S2 deben ejecutarse si el predicado es
falso.
El valor del predicado solo se necesita cuando los resultados deben confirmarse, por lo que si,
por ejemplo, S1 es una declaración única con una latencia prolongada, puede iniciarse antes de
que se conozca el valor del predicado. Además, las declaraciones en S1 y S2 se pueden ejecutar
simultáneamente. El ejemplo muestra que se han evitado dos instrucciones de transferencia de
control, una de las cuales debe predecirse. Como se muestra en este ejemplo, la predicación es
bastante atractiva si el número de instrucciones en S1 y S2 es bastante pequeño.
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
Implementación de la Filosofía de Diseño VLIW a partir de la ISA de la LC-3 en Logisim
En esta sección se describen los rasgos generales de un intento de implementación VLIW
teniendo como base a la ISA de la LC-3, la cual fue detalladamente estudiada durante el curso
de la Asignatura.
La implementación es de carácter demostrativa, no real y posiblemente sujeta a numerosas
carencias e inconsistencias, producto de la inexperiencia o la falta de recursos intelectuales.
Longitud de las Instrucciones
Desde un principio se tuvo la intención de que, en base al tema principal, las instrucciones
fueran de una longitud considerablemente extensa, es por este motivo que en este aspecto se
hizo uso de la mayor cantidad de bits de datos que el Logisim permita manipular, 64 bits.
Cada instrucción se constituye de 4 operaciones paralelas e independientes entre sí, de 16 bits
cada una.
Una operación puede ser entendida como una instrucción de la LC-3, en el sentido de que el
funcionamiento implementado en distintas secciones del diseño, es análogo al de la LC-3. Esto
último no debería de sorprender a nadie, dado de que ese es el punto de partida de toda la
implementación.
Todas las instrucciones se encuentran almacenadas en una Caché de Instrucciones,
representada a partir de una Memoria ROM Word Adressable de 65536 direcciones, con datos
de 16 bits.
Cada instrucción en la Memoria es accedida mediante un Contador de Programa que se
incrementa de a 4 bits, con el fin de señalar acceder correctamente a la nueva instrucción de
64 bits en cada ciclo de Reloj.
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
Ilustración 6: Implementación de la Filosofía de Diseño VLIW a partir de la ISA de la LC-3 en Logisim.
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
Diseño Canalizado
Dado que esto es un intento de implementación VLIW, el mismo debe explotar el Paralelismo
a Nivel de Instrucciones. Es por este motivo que a diferencia de la LC-3, donde cada instrucción
requiere de únicamente un ciclo de reloj, el diseño debe ser canalizado.
Por tanto, se hizo uso del Pipelining, segmentando al procesador en 5 etapas: Instruction
Fetch, Instruction Decode, Memory, Execute y Write Back.
Instruction Fetch
El Instruction Fetch constituye la primera etapa del Pipelining establecido. En ella el Contador
de Programa direcciona una instrucción de la Caché de Instrucciones, y esta es sustraída de la
Memoria. Finalmente se escribe el primer Registro de Estado con la instrucción, para su
posterior decodificación y ejecución en las demás etapas.
El Contador de Programa se incrementa de a 4 bits para poder direccionar correctamente a
cada instrucción de 64 bits en la Memoria de datos de 16 bits.
Si alguna de las operaciones decodificadas en la etapa del Instruction Decode indica la
realización de algún salto (Condicional o Incondicional), en el próximo ciclo de reloj el
componente denotado como AS (Add Selector) indicará al Contador del Programa
incrementarse en base al PC + Offset9 (Salto Condicional), el Registro R7 (Salto Incondicional).
En cualquier otro caso el incremento seleccionado será el PC + 4.
Instruction Decode
El Instruction Decode constituye la segunda etapa del Pipelining establecido. En ella se
decodifica la instrucción que previamente se dispuso en el primer Registro de Estado, durante
el Instruction Fetch. La instrucción de 64 bits se divide en 4 operaciones de 16 bits de longitud,
las cuales se ejecutarán de manera independiente y simultánea.
Además, en esta etapa se producen las Señales de Control que individualmente requerirán las
4 operaciones en sus respectivos trayectos hasta finalizar el Pipelining. Estas Señales formarán
parte del conjunto de datos que se cargarán en los Registros de Estados, entre cada una de las
etapas restantes.
Teniendo las 4 operaciones segmentadas de la instrucción, éstas se dispersan en dirección a
una Unidad Funcional específica (existen 4 Unidades Funcionales), para la etapa del Execute.
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
Finalmente, las operaciones llegan y se cargan en el segundo Registro de Estado, el cual
constituye el límite entre el Instruction Decode y el Execute.
Execute
Execute es la tercera etapa del Pipelining establecido. En ella se realizan simultáneamente las
operaciones aritmético-lógicas que requiera la instrucción a través de sus operaciones en las
Unidades Funcionales.
Cada Unidad funcional está constituida por una tradicional ALU de la ISA LC-3, con sus
tradicionales operaciones aritméticas (Suma/Resta Binaria) y lógicas (AND/NOT).
Los operandos requeridos se obtienen de la lectura directa del Archivo de Registros.
Otra de las funciones que se llevan a cabo en esta etapa, es el cálculo previo de Direcciones de
Memoria Efectivas, las cuáles posteriormente se requerirán para leer o guardar un dato en la
Memoria. Por supuesto, esta función se limita simplemente a los casos donde se tratan
operaciones de Carga/Guardado de datos en Memoria.
Se destaca que el único Modo de Direccionamiento de Memoria admitido por la filosofía VLIW
es la de Base + Offset (LDR/STR).
Finalmente, el bus de datos constituido por algunas Señales de Control que se requerirán en las
últimas etapas, y los datos de las operaciones que pueden ser escritos en Memoria o en el
Archivo de Registro llegan y se cargan en el tercer Registro de Estado, el cual constituye el
límite entre Execute y Memory.
Memory
Memory es la cuarta etapa del Pipelining establecido. En ella, las operaciones que requieran
acceso de Lectura/Escritura de Memoria, podrán hacerlo según corresponda, haciendo uso de
la Dirección de Memoria Efectiva calculada en la etapa anterior. Cada operación tiene un
acceso individual de Lectura/Escritura a una Memoria Multipuertos de 16 bits de datos, y de
65536 posiciones.
Por último, el bus de datos con las últimas Señales de Control y datos de las operaciones que
requieren de la escritura del Archivo de Registros, llegan y se cargan en el cuarto y último
Registro de Estado, el cual constituye el límite entre Memory y Writeback.
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
Writeback
El Writeback constituye la quinta y última etapa del Pipelining establecido. En ella, las
operaciones que lo requieran podrán escribir el Archivo de Registros que contiene a los
tradicionales 8 Registros de la LC-3.
Implementaciones
En la década de 1980, algunas pequeñas empresas intentaron comercializar arquitecturas
VLIW en el mercado de uso general. Desafortunadamente, no tuvieron éxito. Multiflow es el
más conocido. Los fundadores de Multiflow fueron académicos que realizaron una
investigación fundamental y pionera en las técnicas de compilación VLIW.
Las computadoras de Multiflow funcionaban, pero la compañía probablemente estaba una
década adelantada a su tiempo. Las máquinas Multiflow, construidas a partir de piezas
discretas, no pudieron seguir el ritmo de los rápidos avances en los microprocesadores de un
solo chip. Usando la tecnología actual, tendrían una mejor oportunidad de ser competitivos.
A principios de la década de 1990, Intel presentó el microprocesador i860 RISC. Este simple
chip tenía dos modos de operación: un modo escalar y un modo VLIW. En el modo VLIW, el
procesador siempre obtenía dos instrucciones y asumía que una era una instrucción de
número entero y la otra de punto flotante. Un solo programa podría cambiar (algo
dolorosamente) entre los modos escalar y VLIW, implementando así una forma cruda de
compresión de código. Finalmente, el i860 fracasó en el mercado. El chip estaba posicionado
para competir con otros microprocesadores de propósito general para computadoras de
escritorio, pero tenía compiladores de calidad insuficiente para satisfacer las necesidades de
este mercado.
Ejemplos
de
CPU
VLIW
contemporáneas
incluyen
los
procesadores
de
medios TriMedia de NXP (antes Philips Semiconductors), el DSP Super Harvard Architecture
Single-Chip Computer (SHARC) de Analog Devices, y el FR-V de Fujitsu. Estas CPU VLIW
contemporáneas tienen éxito principalmente como procesadores de medios integrados para
dispositivos electrónicos de consumo.
Fuera de los mercados de procesamiento integrado, el Itanium IA-64 de Intel y la computación
de instrucción explícitamente paralela (EPIC) aparece como único ejemplo de arquitecturas de
CPU VLIW ampliamente utilizadas. Sin embargo, la arquitectura EPIC a veces se distingue de
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
una arquitectura VLIW pura, ya que EPIC aboga por predicación de instrucciones completas,
archivos de registro rotativos y una palabra de instrucción muy larga que puede codificar
grupos de instrucciones no paralelos. Las VLIW también lograron una penetración significativa
entre los consumidores en el mercado de unidades de procesamiento de gráficos (GPU),
aunque desde entonces tanto Nvidia como AMD se han mudado a arquitecturas RISC para
mejorar el rendimiento en cargas de trabajo no gráficas.
La
microarquitectura
TeraScale de
ATI
Technologies (ATI)
y
Advanced
Micro
Devices (AMD) para unidades de procesamiento de gráficos (GPU) es una microarquitectura
VLIW.
Ilustración 7: De derecha a izquierda. Arriba: el TriMedia Processor y el Itanium IA-64.
Abajo: el Fujitsu FR-V y SHARC de Analog Devices.
2021 - Año de Homenaje al Premio Nobel de Medicina
Dr. César Milstein
Conclusión
En conclusión, se puede entender como principal aspecto ventajoso de esta filosofía de diseño
a la simplificación de la arquitectura de hardware, dado la explotación del Paralelismo a Nivel
de Instrucciones se lleva a cabo mediante software. Esto trae como consecuencia otro punto a
favor: el menor consumo de energía eléctrica. Pero también supone quizás su principal
desventaja: el requerimiento de compiladores mucho más complejos, y que cualquier intento
de actualización en la arquitectura de hardware implique un cambio en el juego de
instrucciones (compatibilidad hacia atrás nula).
A pesar de que estos aspectos negativos hacen a las arquitecturas VLIW poco adecuadas para
la computación de propósito general, son irrelevantes en la computación embebida: el menor
consumo y el bajo coste del hardware los transforman en procesadores adecuados para dichos
sistemas, y por esa razón en la actualidad es posible encontrar VLIW en TVs, discos duros,
reproductores bluray, etc.
Bibliografía
1. Joseph A. Fisher, Paolo Faraboschi, Cliff Young - Embedded Computing A VLIW
Approach to Architecture, Compilers and Tools.
2. Jean Loup Baer - Microprocessor Architecture From Simple Pipelines To Chip
Multiprocessors.
3. Philips Semiconductors - An Introduction To Very-Long Instruction Word (VLIW)
Computer Architecture.
4. Sarah Harris, David Harris - Digital Design and Computer Architecture RISC-V
Download