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