MAJC (Microprocessor Architecture for Java Computing) fue un microprocesador multinúcleo, multihilo y de instrucciones muy largas (VLIW) de Sun Microsystems , desarrollado entre mediados y finales de la década de 1990. Originalmente llamado procesador UltraJava, el procesador MAJC estaba diseñado para ejecutar programas Java , cuya compilación tardía permitió a Sun tomar varias decisiones de diseño ventajosas. El procesador se integró en dos tarjetas gráficas comerciales de Sun. Las lecciones aprendidas sobre el procesamiento multihilo en un procesador multinúcleo sentaron las bases para implementaciones posteriores de OpenSPARC, como la UltraSPARC T1 .
Elementos de diseño
Trasladar la planificación de instrucciones al compilador.
Al igual que otros diseños VLIW, en particular el IA-64 (Itanium) de Intel , MAJC intentó mejorar el rendimiento trasladando varias operaciones costosas del procesador a los compiladores correspondientes. En general, los diseños VLIW buscan eliminar el planificador de instrucciones , que suele representar una parte considerable del presupuesto total de transistores del procesador. Al trasladar esta parte de la CPU al software, esos transistores pueden utilizarse para otros fines, como añadir unidades funcionales adicionales para procesar más instrucciones a la vez o aumentar la cantidad de memoria caché para reducir el tiempo de espera de los datos procedentes de la memoria principal , mucho más lenta . Si bien MAJC compartía estos conceptos generales, se diferenciaba de otros diseños VLIW, y de los procesadores en general, en varios detalles específicos.
Unidades funcionales generalizadas
La mayoría de los procesadores incluyen varios subprocesadores independientes, conocidos como unidades funcionales , que están optimizados para operar con un tipo de datos específico. Por ejemplo, una CPU moderna suele tener dos o tres unidades funcionales dedicadas al procesamiento de datos enteros e instrucciones lógicas ( ALU) , mientras que otras unidades manejan números de coma flotante ( FPU) o datos multimedia ( SIMD) . MAJC, en cambio, utilizaba una única unidad funcional multipropósito que podía procesar cualquier tipo de datos. En teoría, este enfoque implicaba que procesar un tipo de datos concreto llevaría más tiempo, quizás mucho más, que procesar los mismos datos en una unidad dedicada a ese tipo. Sin embargo, estas unidades de propósito general también evitaban que grandes porciones de la CPU quedaran sin usar porque el programa estuviera realizando muchos cálculos de coma flotante (por ejemplo) en ese momento.
Paquetes de instrucciones de longitud variable
Otra diferencia radica en que MAJC permitía paquetes de instrucciones de longitud variable , que en VLIW contienen varias instrucciones que el compilador ha determinado que pueden ejecutarse simultáneamente. La mayoría de las arquitecturas VLIW utilizan paquetes de longitud fija y, cuando no encuentran una instrucción para ejecutar, la rellenan con un valor nulo NOPque simplemente ocupa espacio. Si bien los paquetes de instrucciones de longitud variable añadían cierta complejidad a la CPU, reducían el tamaño del código y, por lo tanto, el número de costosos fallos de caché, al aumentar la cantidad de código en la caché en un momento dado.
Evitar bloqueos y paradas
La principal diferencia radicaba en que el diseño MAJC requería que el compilador evitara los bloqueos , pausas en la ejecución mientras se procesan los resultados de una instrucción para que la siguiente pueda ejecutarse. Por ejemplo, si al procesador se le proporcionan las instrucciones C = A + B, E = C + D, la segunda instrucción solo puede ejecutarse después de que la primera se complete. La mayoría de los procesadores incluyen bloqueos en su diseño para detener y reprogramar este tipo de instrucciones bloqueadas, permitiendo que otras instrucciones se ejecuten mientras se calcula el valor de C. Sin embargo, estos bloqueos son muy costosos en términos de espacio en el chip y representan la mayor parte de la lógica del planificador de instrucciones.
Para que el compilador evite estos bloqueos, tendría que saber con exactitud cuánto tiempo tardaría en completarse cada una de estas instrucciones. Por ejemplo, si una implementación concreta tardara tres ciclos en completar una multiplicación de punto flotante, los compiladores MAJC intentarían programar otras instrucciones que también tardaran tres ciclos en completarse y que no estuvieran bloqueadas. Sin embargo, un cambio en la implementación real podría reducir este retraso a solo dos instrucciones, y el compilador tendría que estar al tanto de este cambio.
Esto significa que el compilador no estaba vinculado a MAJC en su conjunto, sino a una implementación particular de MAJC, cada CPU individual basada en el diseño de MAJC. Normalmente, esto supondría un grave problema logístico; por ejemplo, considérese la cantidad de variantes del diseño Intel IA-32 : cada una necesitaría su propio compilador dedicado y el desarrollador tendría que generar un binario diferente para cada una. Sin embargo, es precisamente este concepto el que impulsa el mercado de Java : existe un compilador diferente para cada ISA , y se instala en la máquina del cliente en lugar de en la del desarrollador. El desarrollador solo distribuye una única versión de código de bytes de su programa, y la máquina del usuario la compila para la plataforma subyacente.
En realidad, programar instrucciones de esta manera resulta ser un problema muy difícil. En la práctica, los procesadores que intentan realizar esta programación en tiempo de ejecución se encuentran con numerosos eventos en los que los datos necesarios están fuera de la caché y no hay ninguna otra instrucción en el programa que no dependa también de dichos datos. En estos casos, el procesador puede bloquearse durante largos periodos, esperando a que se cargue la memoria principal. El enfoque VLIW no ayuda mucho en este sentido; aunque el compilador pueda dedicar más tiempo a buscar instrucciones para ejecutar, eso no significa que realmente pueda encontrar alguna.
MAJC intentó solucionar este problema mediante la capacidad de ejecutar código de otros subprocesos si el subproceso actual se bloqueaba por falta de memoria. Cambiar de subproceso suele ser un proceso muy costoso, conocido como cambio de contexto , y en un procesador normal, este cambio anularía cualquier ahorro y, por lo general, ralentizaría la máquina. En MAJC, el sistema podía mantener el estado de hasta cuatro subprocesos en memoria simultáneamente, reduciendo el cambio de contexto a unas pocas instrucciones. Esta característica se ha incorporado posteriormente a otros procesadores; Intel la denomina HyperThreading .
MAJC llevó esta idea un paso más allá e intentó precargar los datos e instrucciones necesarios para los hilos mientras estaban bloqueados. La mayoría de los procesadores incluyen una funcionalidad similar para partes de una secuencia de instrucciones, conocida como ejecución especulativa , donde el procesador ejecuta ambos resultados posibles de una bifurcación mientras espera a que se calcule la variable decisiva. MAJC, en cambio, continuó ejecutando el hilo como si no estuviera bloqueado, utilizando esta ejecución para encontrar y cargar cualquier dato o instrucción que pronto se necesitaría cuando el hilo dejara de estar bloqueado. Sun se refirió a esto como Computación Espacio-Temporal (STC), y es un diseño de multihilo especulativo .
Hasta ese momento, los procesadores habían intentado extraer paralelismo en un solo hilo, una técnica que estaba llegando a sus límites en términos de rendimientos decrecientes. Parece que, en general, el diseño de MAJC intentó evitar bloqueos ejecutando en varios hilos (y programas) en lugar de buscar paralelismo en un solo hilo. Se espera que VLIW sea algo peor en términos de bloqueos, ya que es difícil comprender el comportamiento en tiempo de ejecución en tiempo de compilación, lo que hace que el enfoque de MAJC para abordar este problema sea particularmente interesante.
Implementaciones
Sun fabricó un único modelo del MAJC, el MAJC 5200 de dos núcleos , que constituía el núcleo de las tarjetas gráficas para estaciones de trabajo Sun XVR-1000 y XVR-4000 . Sin embargo, muchas de las ideas de diseño de multinúcleo y multihilo, especialmente en lo que respecta al uso de múltiples hilos para reducir los retrasos por bloqueo, se incorporaron a la línea de procesadores Sun SPARC , así como a diseños de otras compañías. Además, la idea del MAJC de diseñar el procesador para ejecutar tantos hilos como fuera posible, en lugar de instrucciones, parece ser la base del posterior diseño UltraSPARC T1 (nombre en clave Niagara ).
Véase también
Lecturas adicionales
- Case, Brian (25 de octubre de 1999). "El Sol hace MAJC con espejos". Microprocessor Report .
- Gwennap, Linley (13 de septiembre de 1999). "MAJC le da un nuevo giro a VLIW". Microprocessor Report .
- Halfhill, Tom (24 de agosto de 1999). "Sun revela los secretos de 'Magic ' " . Microprocessor Report .
Enlaces externos
- MAJC de Sun e IA-64 de Intel
- Microprocesadores Sun
- Informática con palabras de instrucción muy largas