Mismo - la Palabra de la Instrucción Larga (VLIW) las arquitecturas son una
alternativa conveniente por aprovecharse de la instrucción - el paralelismo
nivelado (ILP) en los programas, eso está, por ejecutar más de uno básico
(primitivo) la instrucción en un momento. Éstos los procesadores contienen
las unidades funcionales múltiples, saque de la instrucción esconda un Mismo
- Palabra de la Instrucción Larga que contiene varias instrucciones primitivas,
y despacha el VLIW entero para la ejecución paralela. Estas capacidades son
se aprovechado de por recopiladores que generan código que se ha agrupado
las instrucciones primitivas independientes ejecutable en paralelo. Los
procesadores tenga la lógica del mando relativamente simple porque ellos no
realizan cualquiera planificación dinámica ni pidiendo de nuevo de
funcionamientos (como es el caso en la mayoría los procesadores del
superscalar contemporáneos).
VLIW se ha descrito como un sucesor natural a RISC, porque mueve la
complejidad del hardware al recopilador, permitiendo más simple, los
procesadores más rápidos. Como declarado en El Informe del
microprocesador (2/14/94).
El objetivo de VLIW es eliminar la instrucción complicada fijando y parangona
expedición que ocurre en más moderno los microprocesadores. En la teoría
un procesador de VLIW debe ser más rápido y menos caro que una astilla de
RISC comparable.
La instrucción puesta para una arquitectura de VLIW tiende a consistir de
simple las instrucciones (RISC - gusta). El recopilador debe congregar
muchos primitivo los funcionamientos en una sola" palabra de la instrucción"
tal que el múltiplo se guardan las unidades funcionales ocupado que requiere
bastante la instrucción - el paralelismo nivelado (ILP) en una sucesión del
código para llenar el las hendeduras del funcionamiento disponibles.
El tal paralelismo es descubierto por el el recopilador a través de fijar
el código especulativamente por los bloques básicos, el pipelining del
software realizando, reduciendo el número de funcionamientos, ejecutado,
entre otros.
VLIW se ha percibido como padecer las limitaciones importantes, tal, como
la necesidad para un recopilador poderoso, tamaño del código aumentado
que se levanta de aggresive que fija políticas, bandwidth de memoria más
grande y registro - el archivo el bandwidth, limitaciones debido a la
cerradura - el funcionamiento del paso, binario, la compatibilidad por las
aplicaciones con el número variante de funcional las unidades y latencias.
En los recientes años, ha habido progreso significante con respecto a estos
problemas, debido a los adelantos generales en la tecnología del
semiconductor así como a VLIW - las actividades específicas. Por ejemplo,
nuestro el árbol - la arquitectura de VLIW basado proporciona el binario la
compatibilidad para las aplicaciones de VLIW de anchura variante, y nuestro
El recopilador de VLIW contiene el estado - de - el - el arte el parallelizing /
perfeccionando los algoritmos.
En nuestra arquitectura de VLIW, un programa consiste en una sucesión de
el árbol - las instrucciones, o simplemente los árboles, a cada uno de que
corresponde un la rama del multiway ilimitada con los blancos de la rama
múltiples y un el juego ilimitado de primitivo los funcionamientos. Todos los
funcionamientos y ramas son independientes y ejecutable en paralelo. La
rama del multiway es asociada con los nodos interiores del árbol,
considerando que los funcionamientos son asociado con los arcos. La rama
del multiway es el resultado de un juego de las pruebas binarias en los
códigos de la condición; la salida izquierda forme arco de un nodo del árbol
corresponde al resultado falso del la prueba asociada, considerando que el
arco saliente correcto corresponde a su el verdadero resultado.
Basado en la evaluación de la rama del multiway, un solo camino dentro de
un árbol - la instrucción se selecciona en momento de la ejecución como el
camino tomado. Se ejecutan funcionamientos en el camino tomado a la
realización, y sus resultados puesto en los registros designado
correspondientes o situaciones del almacenamiento. En contraste,
funcionamientos no en el camino tomado del multiway - la rama es
inhibido de comprometer sus resultados a almacenamiento o registros.
Tal los funcionamientos no producen efecto en el estado del procesador.
Los funcionamientos primitivos en un árbol son sujeto a secuencial la
semántica para cada camino del árbol, como si cada primitivo el
funcionamiento se ejecutó en el orden en que aparece en el árbol - el
camino (un árbol - el camino empieza de la raíz del árbol y los extremos en
un blanco de la rama). Por consiguiente, un funcionamiento primitivo no
pueda usar un recurso que ha sido fijo por un funcionamiento anterior en
el mismo árbol - el camino. Si este requisito no se cumple dentro de un
árbol - la instrucción, los resultados del funcionamientos tener primitivo,
un operando puesto por un funcionamiento anterior en el mismo árbol - el
camino es indefinido. La semántica secuencial en cada árbol - las garantías
del camino la compatibilidad binaria entre las aplicaciones diferentes de esto
la arquitectura, cada uno con los grados variantes de ejecución paralela, las
capacidades, permitiendo la descomposición de un árbol grande en, subtrees
que se ejecuta en los ciclos diferentes.
Cada funcionamiento primitivo se pone en código como una instrucción
primitiva en uno la palabra de memoria. Cada árbol - la instrucción se
representa en el almacenamiento principal como un la sucesión inmediata
de árbol - los pedazos cortos y gruesos (o simplemente los pedazos cortos
y gruesos), con cada pedazo corto y grueso que contiene las instrucciones
primitivas. Un pedazo corto y grueso es la unidad mínima de especificación
del programa, y el tamaño de un árbol - la instrucción es un múltiplo del
tamaño de un pedazo corto y grueso. Para el ejemplo, un pedazo corto y
grueso simplemente podría corresponder a una sola palabra de memoria,
o a cuatro la memoria formula (un quadword). El tamaño del pedazo corto
y grueso determina el tradeoffs en el espacio de memoria y la complejidad
descifrando, pero es arreglado para una arquitectura particular.
La sucesión de pedazos cortos y gruesos se obtiene del la profundidad -
primero el traversal de un árbol - la instrucción, listando las pruebas en la
Condición, Los campos del registro, e instrucciones primitivas que se ejecutan
cuando el camino correspondiente del árbol se selecciona. Lo siguiente la
sucesión del código representa un 6 - instrucciones de árbol de manera
cuyas echan ramas los blancos son (A,B,D,C,C,E) y de quien el tamaño del
pedazo corto y grueso es una palabra de memoria:
Probando un campo de Registro de Condición han realizado con un el salto
el condicional instrucción que corresponde a un flujo - el mando el
funcionamiento dentro del árbol, y qué indica donde el árbol - el camino
correspondiendo al verdadero resultado de la prueba continúa en el
almacenamiento; como resultado, un salto la instrucción condicional es
una rama con un (corto) el desplazamiento positivo. Por otro lado, los
blancos de la rama de un el árbol se representa como las instrucciones
de la rama incondicionales, qué especifique el próximo árbol en ser
ejecutado cuando el camino correspondiente del el árbol actual se selecciona.
En el caso cuando el blanco de una instrucción del salto contiene simplemente
una rama incondicional a otro árbol, entonces el salto, la instrucción puede
reemplazarse por una rama la instrucción condicional (un la composición de
un condicional del salto inmediatamente seguida por una rama incondicional).
El recopilador asigna los caminos de la ejecución para obligar a refugiarse en
un árbol los caminos en la izquierda - a - el orden correcto; es decir, el más
más - el camino probable es el leftmost uno, considerando que el menor - el
camino probable es el rightmost uno. Como resultado, todos los
funcionamientos en el más más - el camino probable aparece en las
situaciones adyacentes en la memoria (de L0 a a" la rama UN" en el ejemplo
sobre).
La representación del programa ilustrada sobre es directamente ejecutable
por un procesador del superscalar que puede usar la dependencia del
hardware - verificando y fijando los recursos para determinar qué
funcionamientos pueden ejecutarse simultáneamente. En el caso de
un procesador de VLIW, el el extremo de un árbol - la instrucción se
delimita por una instrucción primitiva que sigue una rama incondicional
que no es ningún reachable por cualquier salto la instrucción condicional
dentro del árbol. En el árbol - la instrucción anteriormente, el extremo del
árbol se descubre a la etiqueta "L1": porque semejante etiqueta no aparece
en cualquiera de las instrucciones del salto. El descubrimiento de este límite
en el hardware es simple.
La nota que cualquier palabra dentro de un árbol - la instrucción también
puede corresponder a el punto de arranque de otro árbol. Como resultado,
echando ramas en un el árbol - la instrucción lleva a la ejecución de un árbol
que es un subconjunto de un árbol más grande.
Si el tamaño de un árbol - la instrucción excede los recursos disponible en
un la aplicación del procesador (como echar ramas el grado, número de fijo -
el punto o flotando - los funcionamientos del punto), entonces el árbol - la
instrucción es dinámicamente descompuesto (recortó) para encajar los
recursos. El subtrees resultante se ejecuta en los ciclos sucesivos, a menos
que el camino tomado es completamente contenido dentro de los primeros
subtree. El proceso de la poda transforma arbitrario - el árbol del tamaño -
las instrucciones en subtrees que encajó los recursos disponible en una
aplicación del procesador. Estos subtrees tienen el mismo la estructura
general como los árboles originales (es decir, un multiway - el árbol de la
rama con los funcionamientos en el árbol - los caminos), pero su tamaño
está limitado. Estos subtrees corresponden a La Instrucción muy Larga
Formula (VLIWs) qué se ejecuta directamente por el procesador.
Como un ejemplo del proceso de la poda, considere la ejecución de el árbol -
la instrucción listó antes en un procesador de VLIW capaz de ejecutar sólo un
4 - la rama de la manera. Desde el árbol - la instrucción contiene un 6 - la
rama de la manera, debe recortarse para encajar el constreñimiento. En
este caso, el árbol - la instrucción se recorta a dos del salto las instrucciones.
El árbol original - la instrucción se descompone en tres árbol más pequeño -
las instrucciones, el primero uno en conteniendo un 4 - la manera la rama
(los blancos T1,T2,A,B), y el otro dos que contienen 2 - la manera las ramas
(los blancos D,C y C,E, respectivamente).
Subsecuentemente sólo el camino tomado en un árbol se ejecuta a la
realización, el la ejecución de todos los caminos del untaken es especulativa;
de hecho, el recopilador las instrucciones de los lugares en esos caminos
para tomar la ventaja de disponible los recursos, si ellos existen. Para el
caso de aplicaciones del procesador con menos recursos, el proceso de la
poda elimina automáticamente algunos de los funcionamientos especulativos.
Es decir, mientras recortando un árbol - la instrucción implícitamente realiza
el unspeculation. La nota que, si el camino tomado se contiene totalmente
dentro de los primeros subtree, entonces el subtrees restante, no se accede
en absoluto.
Nuestro recopilador de VLIW tiene las metas siguientes:
1. LA ACTUACIÓN DEL CÓDIGO COMPILADO
Además de la mayoría de las optimizaciones normales, nuestro recopilador
está construido alrededor de un software - scheduler del pipelining que es
un reforzó la versión de un previamente describió el algoritmo.
Los perfeccionamientos de la actuación incluyen:
· los heuristics basaron en el modulo - fijando;
· la ventana de planificación infinita.
Se centran otras optimizaciones en exponer la tanta instrucción - el nivel el
paralelismo como posible. El disambiguation de memoria es un muy
importante emita para estos propósitos para que nosotros aplicamos una
combinación de estrategias:
· sofisticado el cómputo de dirección / el disambiguation;
· clonando de vueltas en paralelo / las versiones secuenciales;
· la dirección - compare los pulidores.
Nosotros también usamos alguna vuelta - vuelva a escribir las optimizaciones
para exponer el paralelismo en las vueltas, como:
· el vuelta desenrollando;
· la expresión - árbol que vuelve a escribir para reducir el mínimo -
el intervalo de la iniciación (MII);
· los árboles del funcionamiento asociativos volviendo a escribir.
2. LA APROBACIÓN
Nuestro recopilador es flexible, en el sentido que cambia, en la arquitectura
designado puede acomodarse rápidamente. Un uso mayor de nuestro
recopilador es como sigue:
· proponga un cambio arquitectónico;
· agregue una optimización para aprovecharse de / el trabajo
alrededor de ese rasgo;
· mida el impacto de la actuación y así acepte / el desecho el cambio.
Rasgos arquitectónicos que han sido considerados incluyen:
· los pulidores de comparación de dirección;
· los funcionamientos dependientes combinando;
· los varios sabores de prefetching;
· seleccione (el condicional) los funcionamientos.
El recopilador es capaz de manejo los modelos de recurso de procesador
diferentes. Por ejemplo, la varios carrera - los interruptores de tiempo
permiten cambiar el número y tipo de unidades funcionales y el tamaño
del registro archiva, así como habilite / desactive los varios rasgos
arquitectónicos.
3. LA FORMA DEL INTERMEDIO
El factor dominando logrando las dos metas listadas sobre simplemente es la
aplicación y pone a punto tiempo. Esto se refleja en el plan del recopilador
por lo que se refiere a los mecanismos los deseamos apoyábamos las
transformaciones.
DFGs
La representación de código de intermedio y estructuras de los datos son la
llave los factores en la habilidad para agregar las optimizaciones rápidamente
y experimentar con ellos. Nosotros hemos escogido una versión modificada
del gráfico de flujo de dependencia (DFG), una representación originalmente
desarrollada por el grupo de Dr. Pingali a Cornell La universidad [el Pingali et
al., Los gráficos de flujo de dependencia: un algebraico acerqúese para
programar las dependencias, 18 ACM Symp. en los Principios de Progr.
Los idiomas, pp. 67-78, 1991].
El DFG combina el flujo del mando y " información de dependencia en un sola
forma coherente que proporciona toda la información de dependencia
necesitó por la mayoría de las optimizaciones en un fácil - a - analice la
forma. Por ejemplo, el DFG es una representación ejecutable, para que
se satisface bien al análisis las técnicas basaron en la evaluación parcial.
La información de dependencia es totalmente" fijó," es decir, está en ambos
la estática - la sola asignación y estática de la marcha atrás - la sola
asignación forma que simplifica los movimientos del código por los bloques.
Este rasgo representa nuestro el cambio mayor a DFGs, porque nosotros no
haga realice desviando (desviando las hechuras codifican el movimiento
demasiado difícil).
ALIASING
Otra ventaja en nuestra forma del intermedio es la representación de la
carga / las dependencias de la tienda. Anti / el Rendimiento / las
dependencias de Flujo proporcionan un mecanismo eso habilita el anti
de memoria de representación - el aliasing una vez, y entonces representa
el el resultado para que todas las otras optimizaciones puedan usarlo.
LOS INTERVALOS
Nosotros usamos sólo un otros datos globales - la estructura: un (pseudo -)
el intervalo la jerarquía. Para los gráficos reducibles, ésta es la jerarquía del
intervalo usual. Para los gráficos irreducibles, ciertas porciones irreducibles se
vueltas pseudo - los intervalos (ellos tienen la entrada múltiple apunta de
fuera de la vuelta).
LA RAJA DEL BORDE
Nosotros mantenemos el invariant siguiente: no hay ningún borde de flujo de
mando uniéndose un elemento esencial - el bloque con los predecesores
múltiples a los sucesores múltiples. Si semejante borde existe en la entrada,
nosotros nos lo hendimos introduciendo un elemento esencial mudo el bloque.
Esto resulta ser sumamente útil.