TRIPS fue una arquitectura de microprocesador diseñada por un equipo de la Universidad de Texas en Austin junto con IBM , Intel y Sun Microsystems . TRIPS utiliza una arquitectura de conjunto de instrucciones diseñada para dividirse fácilmente en grandes grupos de instrucciones (gráficos) que se pueden ejecutar en elementos de procesamiento independientes. El diseño recopila datos relacionados en los gráficos, intentando evitar lecturas y escrituras de datos costosas y manteniendo los datos en la memoria de alta velocidad cerca de los elementos de procesamiento. El procesador TRIPS prototipo contiene 16 de estos elementos. TRIPS esperaba llegar a 1 TFLOP en un solo procesador, ya que se publicaron artículos de 2003 a 2006.[1]
Fondo
Los programas de computadora consisten en una serie de instrucciones almacenadas en la memoria. Un procesador ejecuta un programa extrayendo estas instrucciones de la memoria, examinándolas y realizando las acciones que la instrucción requiere.
En las primeras máquinas, la velocidad de la memoria principal estaba generalmente en el mismo orden de tiempo que una operación básica dentro del procesador. Por ejemplo, una instrucción que suma dos números puede tomar tres o cuatro ciclos de instrucción , mientras que obtener los números de la memoria puede tomar uno o dos ciclos. En estas máquinas, no había penalización por que los datos estuvieran en la memoria principal, y las arquitecturas del conjunto de instrucciones generalmente se diseñaron para permitir el acceso directo, por ejemplo, una instrucción de suma podría tomar un valor de una ubicación en la memoria, sumarlo al valor de otro, y luego almacenar el resultado en una tercera ubicación.
La introducción de microprocesadores cada vez más rápidos y RAM dinámica barata pero más lenta cambió esta ecuación drásticamente. En las máquinas modernas, obtener un valor de la memoria principal puede llevar el equivalente a miles de ciclos. Uno de los avances clave en el concepto RISC fue incluir más registros de procesador que los diseños anteriores, por lo general varias docenas en lugar de dos o tres. Las instrucciones que antes se proporcionaban ubicaciones de memoria se eliminaron y se reemplazaron por otras que funcionaban solo en registros. La carga de esos datos en el registro fue explícita, se tuvo que realizar una acción de carga separada y los resultados se guardaron explícitamente. Se podría mejorar el rendimiento eliminando la mayor cantidad posible de estas instrucciones de memoria. Esta técnica alcanzó rápidamente sus límites y, desde la década de 1990, las CPU modernas han agregado cantidades cada vez mayores de caché de CPU para aumentar el almacenamiento local, aunque la caché es más lenta que los registros.
Desde finales de la década de 1990, las mejoras en el rendimiento se han logrado principalmente mediante el uso de "unidades funcionales" adicionales, que permiten que algunas instrucciones se ejecuten en paralelo. Por ejemplo, se pueden ejecutar dos instrucciones de suma que trabajen con datos diferentes al mismo tiempo, duplicando efectivamente la velocidad del programa. Las CPU modernas generalmente tienen docenas de estas unidades, algunas para matemáticas enteras y lógica booleana, algunas para matemáticas de coma flotante, algunas para palabras de datos largos y otras para lidiar con la memoria y otras tareas domésticas. Sin embargo, la mayoría de los programas no funcionan con datos independientes, sino que utilizan las salidas de un cálculo como entrada para otro. Esto limita el conjunto de instrucciones que se pueden ejecutar en paralelo a algún factor basado en la cantidad de instrucciones que el procesador puede examinar sobre la marcha. El nivel de paralelismo de instrucción se estabilizó rápidamente a mediados de la década de 2000.
Un intento de romper este límite es el concepto de palabra de instrucción muy larga (VLIW). VLIW entrega la tarea de buscar el paralelismo de instrucciones al compilador , eliminándolo del propio procesador. En teoría, esto permite examinar todo el programa en busca de instrucciones independientes, que luego pueden enviarse al procesador en el orden en que se aprovechen al máximo las unidades funcionales. Sin embargo, esto ha resultado difícil en la práctica y los procesadores VLIW no se han vuelto muy populares.
Incluso en el caso de VLIW, otro problema se ha convertido en un problema. En todos los diseños tradicionales, los datos y las instrucciones son manejados por diferentes partes de la CPU. Cuando las velocidades de procesamiento eran bajas, esto no causaba problemas, pero a medida que aumentaba el rendimiento, los tiempos de comunicación de un lado del chip (los registros) al otro (las unidades funcionales) aumentaban hasta convertirse en una fracción significativa del tiempo total de procesamiento. Para obtener mayores ganancias en el rendimiento, los registros deben distribuirse más cerca de sus unidades funcionales.
BORDE
TRIPS es un procesador basado en el concepto de ejecución explícita de gráficos de datos (EDGE). EDGE intenta evitar ciertos cuellos de botella de rendimiento que han llegado a dominar los sistemas modernos. [2]
EDGE se basa en que el procesador puede comprender mejor el flujo de instrucciones que se le envía, no considerándolo como un flujo lineal de instrucciones individuales, sino más bien como bloques de instrucciones relacionados con una sola tarea que utiliza datos aislados. EDGE intenta ejecutar todas estas instrucciones como un bloque, distribuyéndolas internamente junto con cualquier dato que necesiten procesar. [3] Los compiladores examinan el código y encuentran bloques de código que comparten información de una manera específica. A continuación, se ensamblan en "hiperbloques" compilados y se introducen en la CPU. Dado que el compilador garantiza que estos bloques tengan interdependencias específicas entre ellos, el procesador puede aislar el código en una sola unidad funcional con su propia memoria local .
Considere un ejemplo simple que agrega dos números de la memoria y luego agrega ese resultado a otro valor en la memoria. En este caso, un procesador tradicional tendría que notar la dependencia y programar las instrucciones para que se ejecuten una tras otra, almacenando los resultados intermedios en los registros. En un procesador EDGE, el compilador notaría las interdependencias entre los datos en el código, que compilaría estas instrucciones en un solo bloque. Luego, ese bloque se alimentaría, junto con todos los datos que necesitaba completar, en una sola unidad funcional y su propio conjunto privado de registros. Esto asegura que no se requiera recuperación de memoria adicional, además de mantener los registros físicamente cerca de la unidad funcional que necesita esos valores.
El código que no dependiera de estos datos intermedios se compilaría en hiperbloques separados. Por supuesto, es posible que un programa completo use los mismos datos, por lo que los compiladores también buscan instancias en las que los datos se transfieren a otro código y luego se abandonan de manera efectiva por el bloque original, que es un patrón de acceso común. En este caso, el compilador seguirá produciendo dos hiperbloques separados, pero codificará explícitamente la transferencia de los datos en lugar de simplemente dejarlos almacenados en alguna ubicación de memoria compartida. Al hacerlo, el procesador puede "ver" estos eventos de comunicaciones y programarlos para que se ejecuten en el orden correcto. El compilador reorganiza los bloques que tienen interdependencias considerables para extender las comunicaciones a fin de evitar cuellos de botella en el transporte.
El efecto de este cambio es aumentar en gran medida el aislamiento de las unidades funcionales individuales. Los procesadores EDGE están limitados en paralelismo por las capacidades del compilador, no por los sistemas en chip. Mientras que los procesadores modernos están llegando a una meseta en el paralelismo de cuatro anchos, los diseños EDGE pueden escalar mucho más. También pueden escalar "más profundamente", entregando bloques de una unidad a otra en una cadena que está programada para reducir la contención debido a los valores compartidos.
EXCURSIONES
La implementación del concepto EDGE de la Universidad de Texas en Austin es el procesador TRIPS , el sistema de procesamiento inteligente y confiable Tera-op . Una CPU TRIPS se construye repitiendo una sola unidad funcional básica tantas veces como sea necesario. El uso del diseño TRIPS de hiperbloques que se cargan en masa permite ganancias dramáticas en la ejecución especulativa . Mientras que un diseño tradicional puede tener algunos cientos de instrucciones para examinar para una posible programación en las unidades funcionales, el diseño TRIPS tiene miles, cientos de instrucciones por hiperbloque y cientos de hiperbloques examinados. Esto conduce a una utilización mucho mejor de la unidad funcional; Al escalar su rendimiento a un diseño superescalar típico de cuatro temas, TRIPS puede procesar aproximadamente tres veces más instrucciones por ciclo.
En los diseños tradicionales hay una variedad de diferentes tipos de unidades, enteros, de coma flotante, etc., lo que permite más paralelismo del que permitirían los programadores de cuatro anchos. Sin embargo, para mantener activas todas las unidades, el flujo de instrucciones debe incluir todos estos diferentes tipos de instrucción. Como este no suele ser el caso en la práctica, las CPU tradicionales suelen tener muchas unidades funcionales inactivas. En TRIPS, las unidades individuales son de propósito general, lo que permite que cualquier instrucción se ejecute en cualquier núcleo. Esto no solo evita la necesidad de equilibrar cuidadosamente el número de diferentes tipos de núcleos, sino que también significa que un diseño TRIPS puede construirse con cualquier número de núcleos necesarios para alcanzar un requisito de rendimiento particular. Una CPU TRIPS de un solo núcleo, con un programador simplificado (o eliminado) ejecutará un conjunto de hiperbloques exactamente como uno con cientos de núcleos, solo que más lento.
Mejor aún, el rendimiento no depende de los tipos de datos que se introducen, lo que significa que una CPU TRIPS ejecutará una variedad mucho más amplia de tareas al mismo nivel de rendimiento. Por ejemplo, si una CPU tradicional se alimenta de una carga de trabajo matemática pesada, se atascará tan pronto como todas las unidades de coma flotante estén ocupadas, con las unidades enteras inactivas. Si se alimenta con un programa intensivo en datos como un trabajo de base de datos, las unidades de punto flotante permanecerán inactivas mientras que las unidades enteras se estancarán. En una CPU TRIPS, cada unidad funcional se sumará al rendimiento de cada tarea, porque cada tarea puede ejecutarse en cada unidad. Los diseñadores se refieren a ellos como un "procesador polimórfico".
TRIPS es tan flexible en este sentido que los desarrolladores han sugerido que incluso reemplazaría algunos diseños personalizados de alta velocidad como los DSP . Al igual que TRIPS, los DSP obtienen un rendimiento adicional al limitar las interdependencias de datos, pero a diferencia de TRIPS, lo hacen al permitir que solo se ejecute en ellos un flujo de trabajo muy limitado. TRIPS sería tan rápido como un DSP personalizado en estas cargas de trabajo, pero igualmente capaz de ejecutar otras cargas de trabajo al mismo tiempo. Como han señalado los diseñadores, es poco probable que se pueda usar un procesador TRIPS para reemplazar diseños altamente personalizados como las GPU en las tarjetas gráficas modernas , pero es posible que puedan reemplazar o superar a muchos chips de menor rendimiento como los que se usan para el procesamiento de medios.
La reducción del archivo de registro global también da como resultado ganancias no obvias. La adición de nuevos circuitos a los procesadores modernos ha significado que su tamaño total se ha mantenido casi igual incluso cuando se mueven a tamaños de proceso más pequeños. Como resultado, la distancia relativa al archivo de registro ha aumentado y esto limita la posible velocidad del ciclo debido a retrasos en las comunicaciones. En EDGE, los datos son generalmente más locales o aislados en enlaces entre núcleos bien definidos, lo que elimina grandes retrasos "entre chips". Esto significa que los núcleos individuales se pueden ejecutar a velocidades más altas, limitadas por el tiempo de señalización de las rutas de datos mucho más cortas.
La combinación de estos dos efectos de cambios de diseño mejora enormemente el rendimiento del sistema. El objetivo es producir un sistema de un solo procesador con un rendimiento de 1 TFLOP para 2012. Sin embargo, a partir de 2008, las GPU de ATI y NVIDIA ya han superado la barrera de 1 teraflop (aunque para aplicaciones especializadas). En cuanto a las CPU tradicionales, una Mac Pro contemporánea (2007) que usa un Intel Xeon de 2 núcleos solo puede realizar alrededor de 5 GFLOP en aplicaciones individuales. [4]
En 2003, el equipo de TRIPS comenzó a implementar un chip prototipo. Cada chip tiene dos núcleos completos, cada uno con 16 unidades funcionales en una disposición de cuatro de ancho y cuatro de profundidad. En la implementación actual, el compilador construye "hiperbloques" de 128 instrucciones cada uno, y permite que el sistema mantenga ocho bloques "en vuelo" al mismo tiempo, para un total de 1.024 instrucciones por núcleo. El diseño básico puede incluir hasta 32 chips interconectados, acercándose a 500 GFLOPS. [5]