Las palabras de instrucción muy largas ( VLIW ) se refieren a arquitecturas de conjuntos de instrucciones que están diseñadas para explotar el paralelismo a nivel de instrucción (ILP). Un procesador VLIW permite que los programas especifiquen explícitamente instrucciones para ejecutar en paralelo , mientras que las unidades centrales de procesamiento (CPU) convencionales en su mayoría permiten que los programas especifiquen instrucciones para ejecutar solo en secuencia. VLIW está destinado a permitir un mayor rendimiento sin la complejidad inherente a algunos otros diseños.
Los medios tradicionales para mejorar el rendimiento en los procesadores incluyen dividir las instrucciones en subpasos para que las instrucciones puedan ejecutarse parcialmente al mismo tiempo (denominado pipeline ), enviar instrucciones individuales para que se ejecuten de forma independiente, en diferentes partes del procesador ( arquitecturas superescalares ) e incluso ejecutar instrucciones en un orden diferente del programa ( ejecución fuera de orden ). [1] Todos estos métodos complican el hardware (circuitos más grandes, mayor costo y uso de energía) porque el procesador debe tomar todas las decisiones internamente para que estos métodos funcionen.
En cambio, el método VLIW depende de que los programas proporcionen todas las decisiones sobre qué instrucciones ejecutar simultáneamente y cómo resolver los conflictos. En la práctica, esto significa que el compilador (el software utilizado para crear los programas finales) se vuelve más complejo, pero el hardware es más simple que en muchos otros medios de paralelismo.
El concepto de arquitectura VLIW, y el término VLIW , fueron inventados por Josh Fisher en su grupo de investigación en la Universidad de Yale a principios de la década de 1980. [2] Su desarrollo original de la programación de trazas como método de compilación para VLIW se desarrolló cuando era un estudiante de posgrado en la Universidad de Nueva York . Antes de VLIW, la noción de preprogramación de unidades de ejecución y paralelismo a nivel de instrucción en software estaba bien establecida en la práctica del desarrollo de microcódigo horizontal . Antes de Fisher, los aspectos teóricos de lo que luego se llamaría VLIW fueron desarrollados por el científico informático soviético Mikhail Kartsev [3] basado en su trabajo de los años sesenta en las computadoras M-9 y M-10 orientadas a lo militar. Sus ideas se desarrollaron más tarde y se publicaron como parte de un libro de texto [4] dos años antes del artículo seminal de Fisher, pero debido a la Cortina de Hierro y a que el trabajo de Kartsev estaba principalmente relacionado con lo militar, permaneció en gran parte desconocido en Occidente.
Las innovaciones de Fisher implicaron el desarrollo de un compilador que pudiera apuntar al microcódigo horizontal de programas escritos en un lenguaje de programación común . Se dio cuenta de que para obtener un buen rendimiento y apuntar a una máquina de problemas amplios , sería necesario encontrar paralelismo más allá del que generalmente se encuentra dentro de un bloque básico . También desarrolló métodos de programación de regiones para identificar paralelismo más allá de los bloques básicos. La programación de trazas es un método de este tipo e implica programar primero la ruta más probable de los bloques básicos, insertar código de compensación para lidiar con los movimientos especulativos, programar la segunda traza más probable, y así sucesivamente, hasta que se complete la programación.
La segunda innovación de Fisher fue la noción de que la arquitectura de la CPU de destino debería estar diseñada para ser un objetivo razonable para un compilador; que el compilador y la arquitectura para un procesador VLIW deben ser codiseñados. Esto se inspiró en parte en la dificultad que Fisher observó en Yale de compilar para arquitecturas como FPS164 de Floating Point Systems , que tenía una arquitectura de computación de conjunto de instrucciones complejas (CISC) que separaba el inicio de la instrucción de las instrucciones que guardaban el resultado, lo que necesitaba algoritmos de programación muy complejos. Fisher desarrolló un conjunto de principios que caracterizan un diseño VLIW adecuado, como tuberías de autodrenaje, archivos de registro multipuerto anchos y arquitecturas de memoria . Estos principios facilitaron a los compiladores la emisión de código rápido.
El primer compilador VLIW fue descrito en una tesis doctoral de John Ellis, dirigida por Fisher. El compilador se llamó Bulldog, en honor a la mascota de Yale. [5]
Fisher dejó Yale en 1984 para fundar una empresa emergente, Multiflow , junto con los cofundadores John O'Donnell y John Ruttenberg. Multiflow produjo la serie TRACE de minisupercomputadoras VLIW , y envió sus primeras máquinas en 1987. La VLIW de Multiflow podía emitir 28 operaciones en paralelo por instrucción. El sistema TRACE se implementó en una mezcla de integración a escala media (MSI), integración a gran escala (LSI) e integración a muy gran escala (VLSI) , empaquetada en gabinetes, una tecnología que quedó obsoleta a medida que se hizo más rentable integrar todos los componentes de un procesador (excluyendo la memoria) en un chip.
Multiflow llegó demasiado pronto para captar la siguiente ola, cuando las arquitecturas de chips comenzaron a permitir CPU de emisión múltiple. [ aclaración necesaria ] Las principales empresas de semiconductores reconocieron el valor de la tecnología Multiflow en este contexto, por lo que el compilador y la arquitectura fueron posteriormente licenciados a la mayoría de estas empresas.
Un procesador que ejecuta cada instrucción una después de la otra (es decir, una arquitectura escalar no segmentada ) puede utilizar los recursos del procesador de manera ineficiente, lo que produce un rendimiento potencialmente deficiente. El rendimiento se puede mejorar ejecutando diferentes subpasos de instrucciones secuenciales simultáneamente (denominado segmentación ), o incluso ejecutando múltiples instrucciones completamente simultáneamente como en las arquitecturas superescalares . Se puede lograr una mejora adicional ejecutando instrucciones en un orden diferente de aquel en el que ocurren en un programa, denominado ejecución fuera de orden . [1]
Estos tres métodos aumentan la complejidad del hardware. Antes de ejecutar cualquier operación en paralelo, el procesador debe verificar que las instrucciones no tengan interdependencias . Por ejemplo, si el resultado de una primera instrucción se utiliza como entrada de una segunda instrucción, no se pueden ejecutar al mismo tiempo y la segunda instrucción no se puede ejecutar antes que la primera. Los procesadores modernos fuera de orden han aumentado los recursos de hardware que programan las instrucciones y determinan las interdependencias.
Por el contrario, VLIW ejecuta operaciones en paralelo, según un cronograma fijo, determinado cuando se compilan los programas . Dado que la determinación del orden de ejecución de las operaciones (incluidas las operaciones que se pueden ejecutar simultáneamente) la maneja el compilador, el procesador no necesita el hardware de programación que requieren los tres métodos descritos anteriormente. Por lo tanto, las CPU VLIW ofrecen más computación con menos complejidad de hardware (pero mayor complejidad de compilación) que la mayoría de las CPU superescalares. [1] Esto también es complementario a la idea de que se deben realizar tantos cálculos como sea posible antes de que se ejecute el programa, en el momento de la compilación.
En los diseños superescalares, la cantidad de unidades de ejecución es invisible para el conjunto de instrucciones. Cada instrucción codifica solo una operación. En la mayoría de los diseños superescalares, el ancho de la instrucción es de 32 bits o menos.
Por el contrario, una instrucción VLIW codifica múltiples operaciones, al menos una operación por cada unidad de ejecución de un dispositivo. Por ejemplo, si un dispositivo VLIW tiene cinco unidades de ejecución, entonces una instrucción VLIW para el dispositivo tiene cinco campos de operación, cada uno de los cuales especifica qué operación debe realizarse en esa unidad de ejecución correspondiente. Para dar cabida a estos campos de operación, las instrucciones VLIW suelen tener un ancho de al menos 64 bits, y mucho más en algunas arquitecturas.
Por ejemplo, la siguiente es una instrucción para la Super Harvard Architecture Single-Chip Computer (SHARC). En un ciclo, realiza una multiplicación de punto flotante, una suma de punto flotante y dos cargas de incremento automático. Todo esto cabe en una instrucción de 48 bits:
f12 = f0 * f4, f8 = f8 + f12, f0 = dm(i0, m3), f4 = pm(i8, m9);
Desde los primeros días de la arquitectura informática, [6] algunas CPU han añadido varias unidades lógicas aritméticas (ALU) para ejecutarse en paralelo. Las CPU superescalares utilizan hardware para decidir qué operaciones pueden ejecutarse en paralelo en tiempo de ejecución, mientras que las CPU VLIW utilizan software (el compilador) para decidir qué operaciones pueden ejecutarse en paralelo de antemano. Debido a que la complejidad de la programación de instrucciones se traslada al compilador, la complejidad del hardware se puede reducir sustancialmente. [ aclaración necesaria ]
Un problema similar ocurre cuando el resultado de una instrucción paralelizable se utiliza como entrada para una bifurcación. La mayoría de las CPU modernas adivinan qué bifurcación se tomará incluso antes de que se complete el cálculo, de modo que pueden cargar las instrucciones para la bifurcación o (en algunas arquitecturas) incluso comenzar a calcularlas de manera especulativa . Si la CPU adivina mal, todas estas instrucciones y su contexto deben eliminarse y cargar las correctas, lo que lleva tiempo.
Esto ha llevado a una lógica de despacho de instrucciones cada vez más compleja que intenta adivinar correctamente , y se ha erosionado la simplicidad de los diseños originales de computación con conjunto de instrucciones reducido (RISC). VLIW carece de esta lógica y, por lo tanto, carece de su consumo de energía, posibles defectos de diseño y otros aspectos negativos.
En un VLIW, el compilador utiliza información de perfil o heurística para adivinar la dirección de una bifurcación. Esto le permite mover y preprogramar operaciones de manera especulativa antes de que se tome la bifurcación, lo que favorece la ruta más probable que espera a través de la bifurcación. Si la bifurcación toma un camino inesperado, el compilador ya ha generado código de compensación para descartar los resultados especulativos y preservar la semántica del programa.
Los núcleos de procesadores vectoriales (diseñados para grandes conjuntos unidimensionales de datos llamados vectores ) se pueden combinar con la arquitectura VLIW, como en el microprocesador Fujitsu FR-V , lo que aumenta aún más el rendimiento y la velocidad . [ cita requerida ]
Cydrome era una empresa que producía procesadores numéricos VLIW que utilizaban circuitos integrados de lógica acoplada a emisor (ECL) en el mismo período (finales de la década de 1980). Esta empresa, al igual que Multiflow, fracasó al cabo de unos años.
Uno de los licenciatarios de la tecnología Multiflow es Hewlett-Packard , a la que se incorporó Josh Fisher tras la desaparición de Multiflow. Bob Rau , fundador de Cydrome, también se incorporó a HP tras el fracaso de Cydrome. Estos dos liderarían la investigación de arquitectura informática en Hewlett-Packard durante la década de 1990.
Junto con los sistemas anteriores, durante la misma época (1989-1990), Intel implementó VLIW en el Intel i860 , su primer microprocesador de 64 bits y el primer procesador en implementar VLIW en un chip. [7] Este procesador podía funcionar tanto en modo RISC simple como en modo VLIW:
A principios de los años 90, Intel presentó el microprocesador RISC i860. Este sencillo chip tenía dos modos de funcionamiento: un modo escalar y un modo VLIW. En el modo VLIW, el procesador siempre buscaba dos instrucciones y asumía que una era una instrucción entera y la otra de punto flotante. [7]
El modo VLIW del i860 se utilizó ampliamente en aplicaciones de procesadores de señales digitales (DSP) integrados , ya que la ejecución de la aplicación y los conjuntos de datos eran simples, bien ordenados y predecibles, lo que permitía a los diseñadores aprovechar al máximo las ventajas de ejecución paralela que permitía VLIW. En el modo VLIW, el i860 podía mantener un rendimiento de punto flotante en el rango de 20 a 40 MFLOPS de doble precisión; un valor muy alto para su época y para un procesador que funcionaba a 25-50 Mhz.
En la década de 1990, Hewlett-Packard investigó este problema como un efecto secundario del trabajo en curso sobre su familia de procesadores PA-RISC . Descubrieron que la CPU se podía simplificar en gran medida eliminando la lógica de despacho compleja de la CPU y colocándola en el compilador. Los compiladores de la época eran mucho más complejos que los de la década de 1980, por lo que la complejidad añadida en el compilador se consideró un coste pequeño.
Las CPU VLIW suelen estar formadas por varias unidades de ejecución de tipo RISC que funcionan de forma independiente. Las VLIW contemporáneas suelen tener entre cuatro y ocho unidades de ejecución principales. Los compiladores generan secuencias de instrucciones iniciales para la CPU VLIW de forma similar a las CPU tradicionales, generando una secuencia de instrucciones de tipo RISC. El compilador analiza este código en busca de relaciones de dependencia y requisitos de recursos. A continuación, programa las instrucciones de acuerdo con esas restricciones. En este proceso, se pueden programar instrucciones independientes en paralelo. Debido a que las VLIW suelen representar instrucciones programadas en paralelo con una palabra de instrucción más larga que incorpora las instrucciones individuales, esto da como resultado un código de operación mucho más largo (denominado very long ) para especificar qué se ejecuta en un ciclo determinado.
Entre los ejemplos de CPU VLIW actuales se incluyen los procesadores multimedia TriMedia de NXP (anteriormente Philips Semiconductors), el DSP Super Harvard Architecture Single-Chip Computer (SHARC) de Analog Devices, la familia ST200 de STMicroelectronics basada en la arquitectura Lx (diseñada en el laboratorio HP de Josh Fisher por Paolo Faraboschi), el FR-V de Fujitsu , el BSP15/16 [8] de Pixelworks , el DSP CEVA-X de CEVA, el DSP Jazz de Improv Systems, la serie HiveFlex [9] de Silicon Hive y la familia MPPA Manycore de Kalray. La línea de DSP TMS320 de Texas Instruments ha evolucionado, en su familia C6000 , para parecerse más a un VLIW, en contraste con la familia C5000 anterior . Estas CPU VLIW actuales tienen éxito principalmente como procesadores multimedia integrados para dispositivos electrónicos de consumo.
También se han añadido características VLIW a los núcleos de procesador configurables para diseños de sistemas en un chip (SoC). Por ejemplo, el procesador Xtensa LX2 de Tensilica incorpora una tecnología denominada Flexible Length Instruction eXtensions (FLIX) que permite instrucciones de múltiples operaciones. El compilador C/C++ de Xtensa puede entremezclar libremente instrucciones FLIX de 32 o 64 bits con las instrucciones RISC de una operación del procesador Xtensa, que tienen un ancho de 16 o 24 bits. Al empaquetar múltiples operaciones en una palabra de instrucción ancha de 32 o 64 bits y permitir que estas instrucciones de múltiples operaciones se entremezclen con instrucciones RISC más cortas, FLIX permite a los diseñadores de SoC obtener las ventajas de rendimiento de VLIW al tiempo que elimina la hinchazón de código de las primeras arquitecturas VLIW. El DSP Infineon Carmel es otro núcleo de procesador VLIW diseñado para SoC. Utiliza un método de mejora de la densidad de código similar llamado palabra de instrucción larga configurable (CLIW). [10]
Fuera de los mercados de procesamiento integrado, el Itanium IA-64 de Intel con computación de instrucciones explícitamente paralelas (EPIC) y Elbrus 2000 parecen ser los únicos ejemplos de arquitecturas de CPU VLIW ampliamente utilizadas. Sin embargo, la arquitectura EPIC a veces se distingue de una arquitectura VLIW pura, ya que EPIC aboga por la predicción completa de instrucciones, archivos de registro rotatorios y una palabra de instrucción muy larga que puede codificar grupos de instrucciones no paralelas. Las VLIW también ganaron una penetración significativa en el mercado de las unidades de procesamiento gráfico (GPU), aunque desde entonces tanto Nvidia como AMD han migrado 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 gráfico (GPU) es una microarquitectura VLIW.
En diciembre de 2015 se realizó en Rusia el primer envío de PC basados en CPU VLIW Elbrus-4s . [11]
El Neo de REX Computing es un procesador que consta de una malla 2D de núcleos VLIW orientados a la eficiencia energética. [12]
El Elbrus 2000 ( en ruso : Эльбрус 2000 ) y sus sucesores son microprocesadores VLIW rusos de 512 bits de ancho desarrollados por el Centro de Tecnologías SPARC de Moscú (MCST) y fabricados por TSMC .
Cuando la tecnología de silicio permitió construir implementaciones más amplias (con más unidades de ejecución), los programas compilados para la generación anterior no se ejecutaban en las implementaciones más amplias, ya que la codificación de instrucciones binarias dependía del número de unidades de ejecución de la máquina.
Transmeta abordó este problema al incluir una capa de compilación de software binario a binario (denominada transformación de código ) en su implementación Crusoe de la arquitectura x86 . Se promocionó este mecanismo para básicamente recompilar, optimizar y traducir códigos de operación x86 en tiempo de ejecución al código de máquina interno de la CPU. Por lo tanto, el chip Transmeta es internamente un procesador VLIW, efectivamente desacoplado del conjunto de instrucciones CISC x86 que ejecuta.
La arquitectura Itanium de Intel (entre otras) resolvió el problema de compatibilidad con versiones anteriores con un mecanismo más general. Dentro de cada una de las instrucciones de código de operación múltiple, se asigna un campo de bits para indicar la dependencia de la instrucción VLIW anterior dentro del flujo de instrucciones del programa. Estos bits se configuran en tiempo de compilación , lo que libera al hardware de calcular esta información de dependencia. Tener esta información de dependencia codificada en el flujo de instrucciones permite que las implementaciones más amplias emitan múltiples instrucciones VLIW no dependientes en paralelo por ciclo, mientras que las implementaciones más limitadas emitirían una cantidad menor de instrucciones VLIW por ciclo.
Otra deficiencia percibida de los diseños VLIW es la hinchazón del código que se produce cuando una o más unidades de ejecución no tienen trabajo útil que hacer y, por lo tanto, deben ejecutar instrucciones NOP de No Operation . Esto ocurre cuando hay dependencias en el código y se debe permitir que las secuencias de instrucciones se vacíen antes de que puedan continuar las operaciones posteriores.
A medida que ha aumentado el número de transistores en un chip, las desventajas percibidas de las arquitecturas VLIW han disminuido en importancia. Las arquitecturas VLIW están ganando popularidad, especialmente en el mercado de sistemas integrados , donde es posible personalizar un procesador para una aplicación en un sistema en un chip .
Por su tesis
Bulldog: A Compiler for VLIW Architecture
.