stringtranslate.com

Ejecución explícita de gráficos de datos

La ejecución explícita de gráficos de datos , o EDGE , es un tipo de arquitectura de conjunto de instrucciones (ISA) que pretende mejorar el rendimiento informático en comparación con los procesadores comunes como la línea Intel x86 . EDGE combina muchas instrucciones individuales en un grupo más grande conocido como "hiperbloque". Los hiperbloques están diseñados para poder ejecutarse fácilmente en paralelo.

El paralelismo de los diseños de CPU modernos generalmente comienza a estabilizarse en aproximadamente ocho unidades internas y de uno a cuatro "núcleos", los diseños EDGE pretenden admitir cientos de unidades internas y ofrecer velocidades de procesamiento cientos de veces mayores que los diseños existentes. El desarrollo principal del concepto EDGE fue liderado por la Universidad de Texas en Austin bajo el programa de Arquitecturas de Computación Polimórfica de DARPA , con el objetivo declarado de producir un diseño de CPU de un solo chip con un rendimiento de 1 TFLOPS para 2012, lo que aún no se ha hecho realidad a partir de 2018. [1]

Diseños tradicionales

Casi todos los programas informáticos constan de una serie de instrucciones que convierten datos de un formato a otro. La mayoría de las instrucciones requieren varios pasos internos para completar una operación. Con el tiempo, el rendimiento relativo y el coste de los diferentes pasos han cambiado drásticamente, lo que ha dado lugar a varios cambios importantes en el diseño de ISA.

CISC a RISC

En la década de 1960 , la memoria era relativamente cara y los diseñadores de CPU produjeron conjuntos de instrucciones que codificaban densamente las instrucciones y los datos para utilizar mejor este recurso. Por ejemplo, la add A to B to produce Cinstrucción se proporcionaría en muchas formas diferentes que reunirían A y B de diferentes lugares: memoria principal, índices o registros. Proporcionar estas diferentes instrucciones permitía al programador seleccionar la instrucción que ocupaba el menor espacio posible en la memoria, lo que reducía las necesidades del programa y dejaba más espacio para los datos. Por ejemplo, el MOS 6502 tiene ocho instrucciones ( códigos de operación ) para realizar sumas, que difieren solo en dónde recogen sus operandos. [2]

En realidad, para que estas instrucciones funcionaran era necesario contar con circuitos en la CPU, lo que suponía una limitación importante en los primeros diseños y obligaba a los diseñadores a seleccionar solo las instrucciones que realmente se necesitaban. En 1964, IBM presentó su serie System/360 , que utilizaba microcódigo para permitir que una única arquitectura de conjunto de instrucciones (ISA) expansiva se ejecutara en una amplia variedad de máquinas implementando más o menos instrucciones en el hardware según la necesidad. [3] Esto permitió que la ISA del 360 fuera expansiva, y se convirtió en el modelo de diseño informático en los años 60 y 70, el llamado diseño ortogonal . Este estilo de acceso a la memoria con una amplia variedad de modos dio lugar a conjuntos de instrucciones con cientos de instrucciones diferentes, un estilo conocido hoy como CISC (Complex Instruction Set Computing).

En 1975, IBM inició un proyecto para desarrollar un conmutador telefónico que requería un rendimiento aproximadamente tres veces superior al de sus computadoras contemporáneas más rápidas. Para alcanzar este objetivo, el equipo de desarrollo comenzó a estudiar la enorme cantidad de datos de rendimiento que IBM había recopilado durante la última década. Este estudio demostró que la compleja ISA era de hecho un problema importante; debido a que solo se garantizaba la implementación en hardware de las instrucciones más básicas, los compiladores ignoraban las más complejas que solo se ejecutaban en hardware en ciertas máquinas. Como resultado, la gran mayoría del tiempo de un programa se gastaba en solo cinco instrucciones. Además, incluso cuando el programa llamaba a una de esas cinco instrucciones, el microcódigo requería un tiempo finito para decodificarlo, incluso si era solo para llamar al hardware interno. En máquinas más rápidas, esta sobrecarga era considerable. [4]

Su trabajo, conocido en su momento como IBM 801 , finalmente condujo al concepto RISC (Reduced Instruction Set Computing). Se eliminó el microcódigo y solo las versiones más básicas de cualquier instrucción dada se colocaron en la CPU. Cualquier código más complejo se dejó al compilador. La eliminación de tantos circuitos, aproximadamente 13 de los transistores en el Motorola 68000 , por ejemplo, permitió que la CPU incluyera más registros, lo que tuvo un impacto directo en el rendimiento. A mediados de la década de 1980, versiones más desarrolladas de estos conceptos básicos ofrecían un rendimiento hasta 10 veces superior al de los diseños CISC más rápidos, a pesar de utilizar una fabricación menos desarrollada. [4]

Paralelismo interno

En la década de 1990, el proceso de diseño y fabricación de chips creció hasta el punto en que fue posible construir un procesador de consumo con todas las características potenciales incorporadas. Las unidades que antes estaban en chips separados, como las unidades de punto flotante y las unidades de gestión de memoria , ahora se podían combinar en el mismo chip, produciendo diseños todo en uno. Esto permite ejecutar diferentes tipos de instrucciones al mismo tiempo, lo que mejora el rendimiento general del sistema. A finales de la década de 1990, también se añadieron las unidades de instrucción única, datos múltiples (SIMD) y, más recientemente, los aceleradores de IA .

Aunque estas adiciones mejoran el rendimiento general del sistema , no mejoran el rendimiento de los programas que operan principalmente con lógica básica y matemáticas enteras , que es la mayoría de los programas (uno de los resultados de la ley de Amdahl ). Para mejorar el rendimiento en estas tareas, los diseños de CPU comenzaron a agregar paralelismo interno, volviéndose " superescalares ". En cualquier programa hay instrucciones que trabajan con datos no relacionados, por lo que al agregar más unidades funcionales, estas instrucciones se pueden ejecutar al mismo tiempo. Una nueva parte de la CPU, el planificador , busca estas instrucciones independientes y las alimenta a las unidades, tomando sus salidas y reordenándolas de manera que externamente parezca que se ejecutaron en sucesión.

La cantidad de paralelismo que se puede extraer en diseños superescalares está limitada por la cantidad de instrucciones que el programador puede examinar en busca de interdependencias. Examinar una mayor cantidad de instrucciones puede mejorar la posibilidad de encontrar una instrucción que se pueda ejecutar en paralelo, pero solo a costa de aumentar la complejidad del programador en sí. A pesar de los esfuerzos masivos, los diseños de CPU que utilizan RISC clásicos o CISC ISA se estancaron a fines de la década de 2000. Los diseños Haswell de Intel de 2013 tienen un total de ocho unidades de despacho [5] , y agregar más resulta en complicar significativamente el diseño y aumentar las demandas de energía. [6]

Se puede obtener un rendimiento adicional de los sistemas examinando las instrucciones para encontrar las que funcionan con diferentes tipos de datos y agregando unidades dedicadas a ese tipo de datos; esto llevó a la introducción de unidades de coma flotante incorporadas en los años 80 y 90 y, más recientemente, unidades de instrucción única, múltiples datos (SIMD). El inconveniente de este enfoque es que hace que la CPU sea menos genérica; alimentar la CPU con un programa que utiliza casi todas las instrucciones de coma flotante, por ejemplo, atascará las FPU mientras las otras unidades permanecen inactivas.

Un problema más reciente en los diseños de CPU modernos es el retraso en la comunicación con los registros. En términos generales, el tamaño de la matriz de la CPU se ha mantenido prácticamente igual a lo largo del tiempo, mientras que el tamaño de las unidades dentro de la CPU se ha vuelto mucho más pequeño a medida que se añadían más y más unidades. Eso significa que la distancia relativa entre cualquier unidad de función y el archivo de registro global ha crecido con el tiempo. Una vez introducido para evitar retrasos en la comunicación con la memoria principal, el archivo de registro global se ha convertido en un retraso que vale la pena evitar.

¿Una nueva ISA?

Así como los retrasos en la comunicación con la memoria mientras su precio caía sugerían un cambio radical en ISA (Arquitectura del conjunto de instrucciones) de CISC a RISC, los diseñadores están considerando si los problemas de escalado en paralelismo y los retrasos crecientes en la comunicación con los registros exigen otro cambio en ISA básica.

Entre las formas de introducir una nueva ISA están las arquitecturas de palabras de instrucción muy largas (VLIW), tipificadas por Itanium . VLIW mueve la lógica del planificador fuera de la CPU y dentro del compilador, donde tiene mucha más memoria y líneas de tiempo más largas para examinar el flujo de instrucciones. Este modelo de ejecución de problemas estáticos y ubicación estática funciona bien cuando se conocen todos los retrasos, pero en presencia de latencias de caché, llenar palabras de instrucción ha demostrado ser un desafío difícil para el compilador. [7] Una instrucción que podría tomar cinco ciclos si los datos están en la caché podría tomar cientos si no lo están, pero el compilador no tiene forma de saber si esos datos estarán en la caché en tiempo de ejecución; eso está determinado por la carga general del sistema y otros factores que no tienen nada que ver con el programa que se está compilando.

El principal obstáculo para el rendimiento en los diseños tradicionales es que los datos y las instrucciones que operan sobre ellos están teóricamente dispersos en la memoria. El rendimiento de la memoria domina el rendimiento general, y los diseños clásicos de ubicación dinámica y emisión dinámica parecen haber alcanzado el límite de sus capacidades de rendimiento. VLIW utiliza un modelo de ubicación estática y emisión estática , pero ha demostrado ser difícil de dominar porque el comportamiento de los programas en tiempo de ejecución es difícil de predecir y programar adecuadamente con antelación.

BORDE

Teoría

Las arquitecturas EDGE son una nueva clase de ISA basadas en un diseño de asignación dinámica y ubicación estática . Los sistemas EDGE compilan el código fuente en un formato que consiste en hiperbloques asignados estáticamente que contienen muchas instrucciones individuales, cientos o miles. Estos hiperbloques son luego programados dinámicamente por la CPU. EDGE combina así las ventajas del concepto VLIW de buscar datos independientes en tiempo de compilación, con el concepto RISC superescalar de ejecutar las instrucciones cuando los datos para ellas están disponibles.

En la gran mayoría de los programas del mundo real, la vinculación de datos e instrucciones es obvia y explícita. Los programas se dividen en pequeños bloques denominados subrutinas , procedimientos o métodos (según la época y el lenguaje de programación que se utilice) que generalmente tienen puntos de entrada y salida bien definidos por donde se pasan los datos hacia adentro o hacia afuera. Esta información se pierde a medida que el lenguaje de alto nivel se convierte al ISA mucho más simple del procesador. Pero esta información es tan útil que los compiladores modernos han generalizado el concepto como el " bloque básico ", intentando identificarlos dentro de los programas mientras optimizan el acceso a la memoria a través de los registros . Un bloque de instrucciones no tiene instrucciones de control pero puede tener instrucciones predicadas. El gráfico de flujo de datos se codifica utilizando estos bloques, especificando el flujo de datos de un bloque de instrucciones a otro, o a alguna zona de almacenamiento.

La idea básica de EDGE es brindar soporte y operar directamente sobre estos bloques en el nivel ISA. Dado que los bloques básicos acceden a la memoria de maneras bien definidas, el procesador puede cargar bloques relacionados y programarlos de manera que la salida de un bloque se alimente directamente en el que consumirá sus datos. Esto elimina la necesidad de un archivo de registro global y simplifica la tarea del compilador de programar el acceso a los registros por parte del programa en su conjunto; en cambio, a cada bloque básico se le asignan sus propios registros locales y el compilador optimiza el acceso dentro del bloque, una tarea mucho más sencilla.

Los sistemas EDGE guardan una gran similitud con los lenguajes de flujo de datos de los años 1960 y 1970, y nuevamente en los años 1990. Las computadoras de flujo de datos ejecutan programas de acuerdo con la "regla de activación del flujo de datos", que estipula que una instrucción puede ejecutarse en cualquier momento después de que sus operandos estén disponibles. Debido al aislamiento de los datos, similar a EDGE, los lenguajes de flujo de datos son inherentemente paralelos, y el interés en ellos siguió al interés más general en el paralelismo masivo como una solución a los problemas informáticos generales. Los estudios basados ​​en la tecnología de CPU existente en ese momento demostraron que sería difícil para una máquina de flujo de datos mantener suficientes datos cerca de la CPU para ser ampliamente paralela, y es precisamente este cuello de botella que las técnicas de fabricación modernas pueden resolver colocando cientos de CPU y su memoria en una sola matriz.

Otra razón por la que los sistemas de flujo de datos nunca se hicieron populares es que a los compiladores de la época les resultaba difícil trabajar con lenguajes imperativos comunes como C++ . En cambio, la mayoría de los sistemas de flujo de datos usaban lenguajes dedicados como Prograph , lo que limitaba su interés comercial. Una década de investigación de compiladores ha eliminado muchos de estos problemas, y una diferencia clave entre los enfoques de flujo de datos y EDGE es que los diseños EDGE tienen como objetivo trabajar con lenguajes de uso común.

CPU

Una CPU basada en EDGE estaría formada por uno o más motores de bloques pequeños con sus propios registros locales; los diseños realistas podrían tener cientos de estas unidades. Las unidades están interconectadas entre sí mediante enlaces de comunicación entre bloques dedicados. Debido a la información codificada en el bloque por el compilador, el programador puede examinar un bloque completo para ver si sus entradas están disponibles y enviarlo a un motor para su ejecución; no hay necesidad de examinar las instrucciones individuales que contiene.

Con un pequeño aumento de la complejidad, el planificador puede examinar varios bloques para ver si las salidas de uno se introducen como entradas de otro y colocar estos bloques en unidades que reduzcan los retrasos en las comunicaciones entre unidades. Si una CPU moderna examina mil instrucciones para detectar un posible paralelismo, la misma complejidad en EDGE le permite examinar mil hiperbloques, cada uno de los cuales consta de cientos de instrucciones. Esto le da al planificador un alcance considerablemente mejor sin ningún coste adicional. Es este patrón de funcionamiento el que da nombre al concepto; el "grafo" es la cadena de bloques conectados por los datos que fluyen entre ellos.

Otra ventaja del concepto EDGE es que es enormemente escalable. Un diseño de gama baja podría consistir en un motor de bloque único con un planificador de bloques que simplemente envía los bloques a medida que el programa los llama. Un procesador EDGE destinado a su uso en equipos de escritorio incluiría, en cambio, cientos de motores de bloque. Fundamentalmente, lo único que cambia entre estos diseños es la disposición física del chip y la información privada que sólo conoce el planificador; un programa escrito para la máquina de una sola unidad se ejecutaría sin ningún cambio en la versión de escritorio, aunque miles de veces más rápido. El escalado de energía también se mejora y simplifica drásticamente; los motores de bloque se pueden activar o desactivar según sea necesario con un efecto lineal en el consumo de energía.

Quizás la mayor ventaja del concepto EDGE es que es adecuado para ejecutar cualquier tipo de carga de datos. A diferencia de los diseños de CPU modernos, en los que distintas partes de la CPU están dedicadas a distintos tipos de datos, una CPU EDGE normalmente constaría de un único tipo de unidad similar a una ALU . Un usuario de escritorio que ejecutase varios programas diferentes al mismo tiempo obtendría tanto paralelismo como un usuario científico que alimentara un único programa utilizando únicamente coma flotante; en ambos casos, el programador simplemente cargaría todos los bloques que pudiera en las unidades. A un nivel bajo, el rendimiento de los motores de bloques individuales no sería comparable al de una FPU dedicada, por ejemplo, pero intentaría superar cualquier ventaja de ese tipo mediante un paralelismo masivo.

Implementaciones

VIAJES

La Universidad de Texas en Austin estaba desarrollando una ISA EDGE conocida como TRIPS . Para simplificar la microarquitectura de una CPU diseñada para ejecutarla, la ISA TRIPS impone varias restricciones bien definidas en cada hiperbloque TRIPS:

El compilador TRIPS agrupa estáticamente las instrucciones en hiperbloques, pero también compila estáticamente estos bloques para que se ejecuten en ALU específicas. Esto significa que los programas TRIPS tienen cierta dependencia de la implementación precisa para la que se compilan.

En 2003, produjeron un prototipo de muestra de TRIPS con dieciséis motores de bloques en una cuadrícula de 4x4, junto con un megabyte de memoria caché local y de transferencia. Una versión de un solo chip de TRIPS, fabricada por IBM en Canadá mediante un proceso de 130 nm, contiene dos de esos "motores de cuadrícula" junto con una caché de nivel 2 compartida y varios sistemas de soporte. Cuatro de esos chips y un gigabyte de RAM se colocan juntos en una tarjeta hija para la experimentación.

El equipo TRIPS se había fijado como objetivo final producir una implementación de un solo chip capaz de funcionar con un rendimiento sostenido de 1 TFLOPS, aproximadamente 50 veces el rendimiento de las CPU de gama alta disponibles en 2008 (el Xeon 5160 de doble núcleo proporciona aproximadamente 17 GFLOPS).

DINERO

CASH de CMU es un compilador que produce un código intermedio llamado "Pegasus". [8] CASH y TRIPS son muy similares en concepto, pero CASH no está destinado a producir salida para una arquitectura específica y, por lo tanto, no tiene límites estrictos en el diseño de bloques.

Onda escalar

La arquitectura WaveScalar de la Universidad de Washington es sustancialmente similar a EDGE, pero no coloca instrucciones estáticamente dentro de sus "ondas". En cambio, las instrucciones especiales ( phi y rho ) marcan los límites de las ondas y permiten la programación. [9]

Referencias

Citas

  1. ^ Universidad de Texas en Austin, "TRIPS: Un billón de cálculos por segundo para 2012"
  2. ^ Pickens, John (17 de octubre de 2020). "Códigos de operación NMOS 6502".
  3. ^ Shirriff, Ken. "Simulación del mainframe IBM 360/50 a partir de su microcódigo".
  4. ^ ab Cocke, John; Markstein, Victoria (enero de 1990). "La evolución de la tecnología RISC en IBM" (PDF) . IBM Journal of Research and Development . 34 (1): 4–11. doi :10.1147/rd.341.0004.
  5. ^ Shimpi, Anand Lal (5 de octubre de 2012). "Análisis de la arquitectura Haswell de Intel: cómo construir una nueva PC y un nuevo Intel". AnandTech .
  6. ^ Tseng, Francis; Patt, Yale (junio de 2008). "Lograr un rendimiento fuera de orden con una complejidad casi dentro del orden". ACM SIGARCH Computer Architecture News . 36 (3): 3–12. doi :10.1145/1394608.1382169.
  7. ^ W. Havanki, S. Banerjia y T. Conte. "Programación de regiones para procesadores de amplio espectro", en Actas del Cuarto Simposio Internacional sobre Arquitecturas de Computadoras de Alto Rendimiento , enero de 1998, págs. 266-276
  8. ^ "Proyecto Fénix"
  9. ^ "La ISA de WaveScalar"

Bibliografía