La ejecución de gráficos de datos explícitos , o EDGE , es un tipo de arquitectura de conjunto de instrucciones (ISA) que pretende mejorar el rendimiento informático en comparación con 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 tienen la intención de admitir cientos de unidades internas y ofrecen velocidades de procesamiento cientos de veces mayores que los diseños existentes. El desarrollo principal del concepto EDGE había sido liderado por la Universidad de Texas en Austin bajo el programa Polymorphous Computing Architectures 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, que aún no se ha realizado. a partir de 2018. [1]
Diseños tradicionales
Casi todos los programas de computadora constan de una serie de instrucciones que convierten datos de una forma a otra. La mayoría de las instrucciones requieren varios pasos internos para completar una operación. Con el tiempo, el rendimiento relativo y el costo 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 producían conjuntos de instrucciones que codificaban densamente instrucciones y datos para utilizar mejor este recurso. Por ejemplo, la add A to B to produce C
instrucció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 permitió al programador seleccionar la instrucción que ocupaba el menor espacio posible en la memoria, reduciendo las necesidades del programa y dejando más espacio para los datos.
En realidad, hacer que estas instrucciones funcionaran requería circuitos en la CPU, lo cual era una limitación significativa en los primeros diseños y requería que los diseñadores seleccionaran solo aquellas instrucciones que realmente se necesitaban. En 1964, IBM presentó su serie System / 360 que usaba microcódigo para permitir que una única arquitectura de conjunto de instrucciones expansiva (ISA) se ejecutara en una amplia variedad de máquinas implementando más o menos instrucciones en hardware según la necesidad. Esto permitió que la ISA fuera expansiva, y se convirtió en el modelo del diseño por computadora en las décadas de 1960 y 1970, el llamado diseño ortogonal . Este estilo de acceso a la memoria con una amplia variedad de modos llevó a conjuntos de instrucciones con cientos de instrucciones diferentes, un estilo conocido hoy como CISC (Computación de conjuntos de instrucciones complejas).
En 1975 IBM inició un proyecto para desarrollar un conmutador telefónico que requería un rendimiento aproximadamente tres veces mayor que el 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 el complejo 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.
Su trabajo, conocido en ese momento como IBM 801 , finalmente condujo al concepto RISC (Informática de conjunto de instrucciones reducido). Se eliminó el microcódigo y solo se colocaron en la CPU las versiones más básicas de cualquier instrucción dada. Cualquier código más complejo se dejó al compilador. La eliminación de tantos circuitos, aproximadamente 1 ⁄ 3 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, las 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.
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 básico con todas las funciones potenciales incorporadas. Para mejorar el rendimiento, los diseños de CPU comenzaron a agregar paralelismo interno, convirtiéndose en " superescalares ". En cualquier programa hay instrucciones que funcionan 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 introduce en las unidades, tomando sus salidas y reordenándolas de manera externa que parezca que se ejecutaron en sucesión.
La cantidad de paralelismo que se puede extraer en diseños superescalares está limitada por el número de instrucciones que el programador puede examinar para determinar si existen interdependencias. El examen de un mayor número de instrucciones puede mejorar las posibilidades de encontrar una instrucción que se pueda ejecutar en paralelo, pero solo a costa de aumentar la complejidad del propio planificador. A pesar de los esfuerzos masivos, los diseños de CPU que utilizan RISC clásico o CISC ISA se han estancado en aproximadamente tres o cuatro unidades funcionales [ cita requerida ] .
Se puede obtener un rendimiento adicional de los sistemas examinando las instrucciones para encontrar las que operan con diferentes tipos de datos y agregando unidades dedicadas a ese tipo de datos; esto ha llevado a la introducción de unidades de coma flotante 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 usa casi todas las instrucciones de punto flotante, por ejemplo, atascará las FPU mientras que las otras unidades permanecerán inactivas.
Un problema más reciente en los diseños de CPU modernos es la demora en hablar con los registros. En términos generales, el tamaño 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 reducido mucho 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 aumentado 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 sí mismo en un retraso que vale la pena evitar.
¿Una nueva ISA?
Así como los retrasos en hablar con la memoria mientras bajaba su precio sugirieron un cambio radical en ISA (Arquitectura de conjunto de instrucciones) de CISC a RISC, los diseñadores están considerando si los problemas de escalado en el paralelismo y los crecientes retrasos en hablar con los registros exigen otro cambio en ISA básico.
Entre las formas de introducir una nueva ISA se encuentran las arquitecturas de palabras de instrucción muy largas (VLIW), tipificadas por Itanium . VLIW mueve la lógica del planificador de la CPU al compilador, donde tiene mucha más memoria y líneas de tiempo más largas para examinar el flujo de instrucciones. Esta ubicación estática, modelo de ejecución de problemas estáticos funciona bien cuando se conocen todos los retrasos, pero en presencia de latencias de caché, el llenado de palabras de instrucción ha demostrado ser un desafío difícil para el compilador. [2] Una instrucción que puede tardar cinco ciclos si los datos están en la caché podría tardar cientos si no lo está, 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 cuello de botella clave del rendimiento en los diseños tradicionales es que los datos y las instrucciones que operan en ellos están teóricamente dispersos en la memoria. El rendimiento de la memoria domina el rendimiento general, y la ubicación dinámica clásica , los diseños de problemas dinámicos parecen haber llegado al límite de sus capacidades de rendimiento. VLIW utiliza un modelo de problema estático de ubicación estática , pero ha demostrado ser difícil de dominar porque el comportamiento en tiempo de ejecución de los programas es difícil de predecir y programar adecuadamente con anticipación.
BORDE
Teoría
Las arquitecturas EDGE son una nueva clase de ISA basadas en una ubicación estática y un diseño dinámico . Los sistemas EDGE compilan el código fuente en una forma 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. Por lo tanto, EDGE combina las ventajas del concepto VLIW de buscar datos independientes en tiempo de compilación, con el concepto superescalar RISC de ejecutar las instrucciones cuando los datos para ellos están disponibles.
En la gran mayoría de los programas del mundo real, la vinculación de datos e instrucciones es tanto obvia como 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 donde los datos entran o salen. Esta información se pierde cuando el lenguaje de alto nivel se convierte en el 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 sentencias 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 área de almacenamiento.
La idea básica de EDGE es apoyar y operar directamente en estos bloques a nivel ISA. Dado que los bloques básicos acceden a la memoria de formas bien definidas, el procesador puede cargar bloques relacionados y programarlos para 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 al programar el acceso a los registros por parte del programa en su conjunto; en cambio, a cada bloque básico se le otorgan sus propios registros locales y el compilador optimiza el acceso dentro del bloque, una cantidad mucho mayor. tarea más sencilla.
Los sistemas EDGE tienen un gran parecido con los lenguajes de flujo de datos de los años sesenta y setenta, y nuevamente en los noventa. 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 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 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 paralelos, y es precisamente este cuello de botella que las técnicas de fabricación modernas pueden resolver colocando cientos de CPU y sus memoria en un solo dado.
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 , 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 el flujo de datos y los enfoques de EDGE es que los diseños de EDGE pretenden trabajar con lenguajes de uso común.
CPU
Una CPU basada en EDGE consistiría en uno o más motores de bloques pequeños con sus propios registros locales; los diseños realistas pueden 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 es necesario examinar las instrucciones individuales que contiene.
Con un pequeño aumento en la complejidad, el programador puede examinar varios bloques para ver si las salidas de uno se alimentan como entradas de otro y colocar estos bloques en unidades que reducen sus retrasos en las comunicaciones entre unidades. Si una CPU moderna examina mil instrucciones en busca de paralelismo potencial, la misma complejidad en EDGE le permite examinar mil hiperbloques, cada uno de los cuales consta de cientos de instrucciones. Esto le da al programador un alcance considerablemente mejor sin costo adicional. Es este patrón de funcionamiento el que da nombre al concepto; el "gráfico" 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 programador de stub que simplemente envía bloques a medida que los llama el programa. En cambio, un procesador EDGE diseñado para uso de escritorio incluiría cientos de motores de bloques. Fundamentalmente, todo lo que cambia entre estos diseños es el diseño físico del chip y la información privada que solo 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. La escala de potencia también se mejora y simplifica drásticamente; Los motores de bloque se pueden encender o apagar 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 donde diferentes partes de la CPU están dedicadas a diferentes tipos de datos, una CPU EDGE normalmente consistiría en un solo tipo de unidad similar a ALU . Un usuario de escritorio que ejecute varios programas diferentes al mismo tiempo obtendría tanto paralelismo como un usuario científico que se alimentara de un solo programa utilizando sólo punto flotante; en ambos casos, el planificador simplemente cargaría todos los bloques que pudiera en las unidades. En un nivel bajo, el rendimiento de los motores de bloque individuales no coincidiría con el de una FPU dedicada, por ejemplo, pero intentaría superar cualquier ventaja de este tipo a través de un paralelismo masivo.
Implementaciones
EXCURSIONES
La Universidad de Texas en Austin estaba desarrollando una EDGE ISA conocida como TRIPS . Para simplificar la microarquitectura de una CPU diseñada para ejecutarla, TRIPS ISA impone varias restricciones bien definidas en cada hiperbloque TRIPS, que:
- tener como máximo 128 instrucciones,
- emitir como máximo 32 cargas y / o tiendas,
- emitir como máximo 32 lecturas y / o escrituras bancarias del registro,
- tener una decisión de bifurcación, que se utiliza para indicar el final de un bloque.
El compilador TRIPS agrupa estáticamente las instrucciones en hiperbloques, pero también compila estáticamente estos bloques para que se ejecuten en ALU particulares. Esto significa que los programas ADPIC dependen en cierta medida de la implementación precisa para la que se compilan.
En 2003, produjeron un prototipo de muestra de TRIPS con dieciséis motores de bloque en una cuadrícula de 4 por 4, junto con un megabyte de caché local y memoria de transferencia. Una versión de un solo chip de TRIPS, fabricada por IBM en Canadá utilizando un proceso de 130 nm, contiene dos de estos "motores de cuadrícula" junto con una caché de nivel 2 compartida y varios sistemas de soporte. Cuatro de estos chips y un gigabyte de RAM se colocan juntos en una tarjeta secundaria para la experimentación.
El equipo de TRIPS se había fijado el objetivo final de 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 básicas de gama alta disponibles en 2008 (el Xeon 5160 de doble núcleo proporciona aproximadamente 17 GFLOPS).
DINERO EN EFECTIVO
CMU 's EFECTIVO es un compilador que genera un código intermedio llamado 'Pegasus'. [3] EFECTIVO y TRIPS son muy similares en concepto, pero EFECTIVO no está destinado a producir resultados para una arquitectura específica y, por lo tanto, no tiene límites estrictos en el diseño de bloques.
WaveScalar
La Universidad de Washington 's WaveScalar arquitectura es sustancialmente similar a EDGE, pero no de forma estática colocar instrucciones dentro de sus 'ondas'. En cambio, instrucciones especiales ( phi y rho ) marcan los límites de las olas y permiten la programación. [4]
Referencias
Notas
- ^ Universidad de Texas en Austin, "VIAJES: un billón de cálculos por segundo en 2012"
- ^ W. Havanki, S. Banerjia y T. Conte. "Programación de Treegion para procesadores de amplio espectro", en Actas del Cuarto Simposio Internacional sobre Arquitecturas de Computadoras de Alto Rendimiento , enero de 1998, pág. 266–276
- ^ "Proyecto Phoenix"
- ^ "El WaveScalar ISA"
Bibliografía
- Universidad de Texas en Austin, "Descripción general técnica de los ADPIC"
- A. Smith et al., "Compiling for EDGE Architectures" , 2006 International Conference on Code Generation and Optimization , marzo de 2006