Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Project
Project
Curso 2005–2006
Ingenierı́a Informática
Reducción de consumo de
energı́a estática en memorias
cache mediante
apagado de ceros
Autor:
Rafael Ubal Tena
Directores:
Julio Sahuquillo Borrás
Salvador Petit Martı́
Índice
Índice i
Resumen iv
1 Introducción 1
1.1 Descripción de la problemática actual . . . . . . . . . . . . . . 1
1.2 Disipación de energı́a . . . . . . . . . . . . . . . . . . . . . . . 3
1.2.1 Soluciones propuestas sobre energı́a estática . . . . . . 3
Modelos identificando las lı́neas menos utilizadas . . . 4
Modelos basados en la localidad . . . . . . . . . . . . . 5
1.2.2 Soluciones propuestas sobre energı́a dinámica . . . . . 5
Compresión dinámica de ceros . . . . . . . . . . . . . . 6
Dynamic Zero-Sensitivity . . . . . . . . . . . . . . . . . 6
Frequent Value Cache . . . . . . . . . . . . . . . . . . 7
1.3 Objetivos y organización del proyecto . . . . . . . . . . . . . . 8
i
2.2.1 Descripción . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.2 Implementación hardware . . . . . . . . . . . . . . . . 14
2.3 Técnica propuesta: apagado de ceros . . . . . . . . . . . . . . 15
2.3.1 Descripción . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3.2 Implementación hardware . . . . . . . . . . . . . . . . 18
Primera aproximación . . . . . . . . . . . . . . . . . . 20
Segunda aproximación . . . . . . . . . . . . . . . . . . 21
2.3.3 Resolución de apagado . . . . . . . . . . . . . . . . . . 24
2.3.4 Área del chip . . . . . . . . . . . . . . . . . . . . . . . 30
3 Simulador desarrollado 32
3.1 Ficheros del simulador . . . . . . . . . . . . . . . . . . . . . . 35
3.2 Descripción de la arquitectura MIPS . . . . . . . . . . . . . . 39
3.2.1 Juego de instrucciones . . . . . . . . . . . . . . . . . . 40
3.3 Partes principales del simulador . . . . . . . . . . . . . . . . . 41
3.3.1 Etapas del procesador superescalar genérico . . . . . . 41
Etapa fetch . . . . . . . . . . . . . . . . . . . . . . . . 42
Etapa dispatch . . . . . . . . . . . . . . . . . . . . . . 42
Etapa issue . . . . . . . . . . . . . . . . . . . . . . . . 44
Etapa writeback . . . . . . . . . . . . . . . . . . . . . . 45
Etapa commit . . . . . . . . . . . . . . . . . . . . . . . 46
3.3.2 RUU (Register Update Unit) . . . . . . . . . . . . . . . 47
3.3.3 Control de dependencias de datos . . . . . . . . . . . . 51
Referencias a elementos de la RUU . . . . . . . . . . . 51
Listas de dependencias . . . . . . . . . . . . . . . . . . 54
3.3.4 Definición del juego de instrucciones . . . . . . . . . . 56
Definición del comportamiento de una instrucción . . . 57
Definición del formato de una instrucción . . . . . . . . 59
ii
3.4 Herramientas adicionales para el desarrollo y depuración . . . 63
3.4.1 Cálculo de máscaras de instrucción . . . . . . . . . . . 63
3.4.2 Visor de archivos binarios . . . . . . . . . . . . . . . . 64
3.4.3 Aplicación pedagógica de la herramienta . . . . . . . . 65
4 Resultados 68
4.1 Entorno de simulación . . . . . . . . . . . . . . . . . . . . . . 68
4.2 Resultados de las simulaciones . . . . . . . . . . . . . . . . . . 70
5 Conclusiones 74
5.1 Contribuciones . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.2 Trabajo futuro . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Referencias 79
iii
Resumen
iv
tura o el mecanismo de apagado/encendido de las celdas SRAM.
Las ventajas de la aplicación de la técnica de apagado de ceros quedan
avaladas por los resultados estadı́sticos obtenidos a partir de la simulación
de la ejecución de la suite de benchmarks SPEC2000. Para tal efecto, se
considera parte de este proyecto el desarrollo completo de una herramienta
de simulación, basada en otra ya existente, de nombre SimpleScalar.
La nueva herramienta pretende disminuir la complejidad de SimpleSca-
lar, de forma que no se pierda potencia de simulación para los experimentos
que afectan a este proyecto. Por el contrario, se amplı́a dicha potencia,
permitiendo obtener estadı́sticas sobre el consumo de energı́a estática de la
memoria cache.
La construcción del modelo está orientada a tareas de investigación futu-
ras, incorporando cierto soporte para simulación de procesadores multi-hilo
o multiprocesadores.
v
Capı́tulo 1
Introducción
Hasta hace pocos años las memorias cache ocupaban un porcentaje elevado
del área del procesador, del orden de 1/3 a 3/4 [1]. Este hecho motivó que
durante el periodo de tiempo comprendido desde 1996 hasta aproximada-
mente 2002 ó 2003, muchos trabajos de investigación sobre memorias cache
se centraran en la propuesta de organizaciones alternativas a la cache con-
vencional. El problema crı́tico residı́a en el hecho de que los transistores eran
un bien preciado dentro del procesador. Por tanto, si se reducı́a el tamaño
de la cache, manteniendo las prestaciones, se disponı́a de un mayor número
de transistores que se podı́a dedicar otros aspectos del procesador.
1
el tiempo de ciclo y ii) reducción del consumo.
2
porcentaje del área del chip, o donde la frecuencia de conmutación de
los transistores es más elevada: por ejemplo la lógica de emisión de
instrucciones (issue) o las memorias cache.
3
que se beneficie de la localidad de los datos.
Los modelos que identifican las lı́neas menos utilizadas argumentan que du-
rante un periodo de tiempo dado, el procesador sólo referencia a un porcen-
taje relativamente pequeño de lı́neas de la cache. Por tanto, si se pudieran
identificar estas lı́neas, podrı́an desactivarse para reducir el consumo. Los
modelos deben resolver las siguientes cuestiones:
2. ¿Cuándo desactivarlas?
Por otro lado, algunos de los modelos de este primer grupo desactivan
las lı́neas completamente perdiendo la información almacenada. Por ello,
previo a la desactivación, en caso de que la lı́nea se encuentre modificada
debe actualizarse en la cache de nivel 2. Este es el caso del modelo Cache
Decay propuesto por Kaxiras et al [8]. Por supuesto, si se accede a una lı́nea
que se acaba de desactivar, se producirá un fallo en la cache de nivel 1 y se
accederá a la de nivel 2. Por este motivo, se produce una penalización en las
prestaciones respecto a una cache convencional.
Otros modelos sugieren no desactivar las lı́neas completamente, sino de-
jarlas en un estado dormido o drowsy. En este caso, el funcionamiento es el
siguiente: supongamos que un conjunto tiene 4 vı́as y 2 se encuentran activas
mientras que las otras 2 en estado drowsy. Si se produce un fallo en las lı́neas
activas, se despierta a las que están en estado drowsy para ver si alguna de
4
ellas contiene la lı́nea referenciada. Sólo en el caso de que continúe habiendo
fallo después de despertarlas, se accederá a la cache de nivel 2. Es el caso
del modelo de las Drowsy Caches propuesto por Flautner et al [9]. Se puede
observar que, al igual que el esquema anterior, surge una penalización en las
prestaciones.
5
A continuación se da una breve descripción de las técnicas existentes:
Dynamic Zero-Sensitivity
El modelo DZS fue propuesto por Y.J. Chang et al [12]. Al igual que el
anterior, pretende explotar la asimetrı́a de distribución de 1’s y 0’s, pero esta
vez reduciendo el consumo dinámico de las lecturas de bits a 0 aislados. Esto
se consigue impidiendo que las lı́neas de bits se descarguen cuando durante
la lectura de un 0, haciendo que ésta sea mucho menos costosa que la lectura
de un 1.
En su publicación, los autores proponen dos alternativas de implemen-
6
tación para su esquema: DZS D y DZS S. Cada una de ellas supone una
desventaja frente a la implementación de una cache normal. La primera im-
plica un aumento considerable del área ocupada dentro del chip, mientras
que la degradación de la estabilidad de la señal es un inconveniente de la
segunda. En cualquier caso, la celda de memoria queda modificada ligera-
mente, incorporando varios transistores extra.
En ambas implementaciones, el diseño se centra en el amplificador que
suministra los datos leı́dos de las celdas al procesador. Para el caso de la
lectura de un 1, el amplificador debe funcionar normalmente, detectando y
amplificando la diferencia de potencial entre las lı́neas de bit. En cambio, es
al leer un 0 cuando debe transformar la ausencia de diferencia de potencial
en un 0 lógico, puesto que el contenido de la celda implicada no ha sido
descargado.
7
1.3 Objetivos y organización del proyecto
Observando las técnicas ya disponibles, el objetivo del proyecto se centra en
idear una técnica de reducción de consumo innovadora, basada en la energı́a
estática. Una vez establecido su funcionamiento, se trata de evaluar sus
beneficios y de analizar el efecto de su implantación sobre la arquitectura y
las prestaciones globales de un procesador. Tras dicho análisis, el diseñador
se encuentra en condiciones de tomar la decisión de adaptar la nueva técnica
a su implementación, y de elegir coherentemente entre una de sus posibles
variantes.
Esta lı́nea de argumentación conduce a la siguiente estructuración del pro-
yecto: en el capı́tulo 2 se describen diferentes técnicas de ahorro de energı́a
estática, entre las que se encuentra la técnica propuesta; se hacen constar
sus variantes y sus posibles implementaciones hardware. El capı́tulo 3 pre-
senta una herramienta de simulación construida para llevar a cabo el proceso
de evaluación de la técnica, mientras que el capı́tulo 4 describe y muestra
gráficamente los resultados que el simulador proporciona. Por último, el
capı́tulo 5 contiene las conclusiones que se pueden extraer del trabajo reali-
zado (ámbito de aplicación de la técnica, grado de innovación, investigaciones
futuras, etc).
8
Capı́tulo 2
2.1.1 Descripción
9
a una determinada lı́nea de cache: normalmente, cuando se incorpora un
nuevo bloque a una lı́nea, éste recibe una secuencia continua de accesos;
cuando termina esta secuencia, comienza un periodo de tiempo muerto (dead
time) antes de que la lı́nea sea sustituida por otra nueva. Raramente existe
un acceso a la misma lı́nea de cache después de haber entrado en la zona de
tiempo muerto, con lo que es posible apagarla por completo, perdiendo ası́
lo datos, sin afectar prácticamente a las prestaciones.
Concretamente, estiman mediante experimentos que el intervalo entre
accesos a una lı́nea de cache durante su tiempo de vida es del orden de 100
ciclos. Por otra parte, la duración media de los tiempos muertos es del orden
de 20.000 ciclos. La gran diferencia entre estos dos tiempos hace intuir que
se podrá identificar de una manera fiable el comienzo del tiempo muerto
durante la ejecución atendiendo a estos valores.
En general, se busca una aproximación al caso ideal de apagado, en el
que una lı́nea deja de recibir tensión tras el momento en que es accedida por
última vez y hasta que deba ser sustituida por un nuevo bloque, es decir, justo
en el comienzo del tiempo muerto. Esta aproximación requerirı́a información
de lo que va a suceder durante la ejecución de instrucciones futuras, por lo
que su implementación no es viable.
Por otro lado, un apagado equivocado antes de haber alcanzado el tiempo
muerto (tras el cual se accede la misma lı́nea), produce una penalización de
un fallo extra de cache y un posible writeback en el caso en que el bloque
apagado hubiera sido modificado (dirty). Teniendo esto en cuenta, se pro-
pone la polı́tica de apagado basado en el tiempo (time-based leakage control):
la lı́nea se apaga en el momento en que se ha consumido desde el último
acceso la misma energı́a que se habrı́a consumido si se hubiera apagado de
forma errónea justo después de ese acceso. Esto se traduce, dependiendo del
10
fabricante, en un rango de 1K a 512K ciclos del procesador.
Para evaluar las prestaciones en cada caso, los autores realizan simula-
ciones utilizando el conjunto de benchmarks SPEC2000.
11
ración de una gran cantidad de writebacks simultáneos, en el caso en que se
deban apagar múltiples bloques que hayan sido modificados. Esto se solu-
ciona incorporando la señal del reloj global en cascada a todos los contadores
locales. Cuando un contador local recibe un tic del reloj global, lo transmi-
tirá al contador local siguiente con un ciclo de latencia. Esto no cambia el
funcionamiento de la polı́tica de apagado, mientras que evita un surgimiento
masivo de writebacks.
La cuenta de ciclos del reloj del procesador mediante el sistema de con-
tadores locales y uno global induce también un comsumo extra en las tran-
siciones de los bits de los contadores locales, al igual que en las del contador
global. Los experimentos realizados demuestran que este consumo es de cua-
tro órdenes de magnitud menor que la energı́a estática de toda la memoria
cache en un ciclo y, por tanto, despreciable.
2.2.1 Descripción
Esta técnica fue propuesta por K. Flautner, N.S. Kim, S. Martin, D. Blaauw
y T. Mudge [9]. Consiste en alimentar las lı́neas de cache con una tensión
menor en el momento en que se prevea que no van a ser accedidas. La
reducción del consumo es menor que en el caso del apagado completo, pero
se obtiene la ventaja de que los datos persisten mientras están en modo de
bajo consumo. Por esta razón, se puede aplicar esta polı́tica de una forma
mucho más agresiva que en el caso de cache decay. Las lı́neas en modo
drowsy requieren una pequeña latencia de activación de uno o dos ciclos del
procesador antes de poder ser accedidos.
La diferencia principal en prestaciones entre el mecanismo de apagado
12
completo y el del modo de bajo consumo es la penalización por una aplicación
errónea. Cuando se predice que una lı́nea no va a accederse, se le aplica una
tensión menor; si la predicción fue incorrecta y la lı́nea se accede, obtenemos
únicamente una latencia y el consumo extra correspondiente a la activación
de esa lı́nea, mientras que en el caso de cache decay, un error implica la
recuperación del bloque desde un nivel inferior de memoria.
Los autores presentan en su publicación una serie de factores que, com-
binados, dan lugar a un conjunto de polı́ticas de puesta en modo de bajo
consumo. El algoritmo genérico consiste en evaluar periódicamente los con-
tenidos de la cache y establecer las lı́neas cuya alimentación es susceptible
de ser reducida. Las variables que perfilan el algoritmo son los siguientes:
13
Combinando diferentes valores para estos cuatro parámetros, los auto-
res realizan simulaciones cuyos resultados exponen en su publicación. Los
programas de prueba que utilizan son, de nuevo, el conjunto de benchmarks
SPEC2000, con la herramienta de simulación SimpleScalar.
Para implementar una cache que soporte el modo de bajo consumo, son
necesarios los siguientes elementos extra en cada lı́nea: un bit de drowsy,
activo cuando la lı́nea se encuentre en modo de bajo consumo, un mecanismo
que controle la tensión de alimentación de las celdas de memoria y un circuito
de acceso a la lı́nea, denominado word line gating.
El voltaje de operación de un vector de celdas de memoria en la cache
viene determinado por el controlador de voltaje, que cambia la tensión su-
ministrada según el estado del bit de drowsy. Cuando este bit esté activo,
la alimentación de las celdas SRAM será Vdd (1V), mientras que cuando esté
inactivo, ésta será de VddLow (0.3V).
El mecanismo de control de la tensión de alimentación consiste en dos
únicos transistores PMOS. El primero de ellos une la alimentación de la
lı́nea con Vdd , y está gobernado por la señal drowsy (salida negada del bit
de drowsy, conectada a la puerta del transistor). El segundo transistor
une la alimentación de su lı́nea de cache correspondiente con VddLow , y está
gobernado por la señal drowsy.
Por último, el citado circuito de acceso a la lı́nea impide el acceso a la
lı́nea de cache cuando ésta se encuentra en modo de bajo consumo. Un acceso
indiscriminado al contenido de las lı́neas puede ocasionar la pérdida de los
datos.
14
2.3 Técnica propuesta: apagado de ceros
2.3.1 Descripción
15
100
164.gzip
95 175.vpr
176.gcc
90 181.mcf
186.crafty
Cumulative percentage
85 197.parser
253.perlbmk
80 254.gap
256.bzip2
300.twolf
75
70
65
60
55
50
32 30 28 26 24 22 20 18 16 14 12 10 8 6 4 2 0
Number of zeros
100
168.wupwise
95 171.swim
172.mgrid
90 173.applu
177.mesa
Cumulative percentage
85 179.art
183.equake
80 187.facerec
188.ammp
301.apsi
75
70
65
60
55
50
32 30 28 26 24 22 20 18 16 14 12 10 8 6 4 2 0
Number of zeros
16
71.96% − 68.34% = 3.62%. Definimos, pues, M(x, B) como el porcentaje
medio de palabras que tienen x y sólo x bits de mayor peso a B.
Observando las gráficas, se puede intuir el ahorro de energı́a estática
que puede suponer esta técnica, teniendo en cuenta que todas las curvas
comienzan con un porcentaje muy alto, que oscila entre el 50% y el 85%.
Para estimar el ahorro de energı́a máximo teórico que podemos alcanzar,
vamos a suponer que tenemos un algoritmo ideal sin sobrecarga hardware que
apaga en cada ciclo todos los bits de mayor peso a 0 de todas las palabras
de la cache. De esta forma, podemos establecer el número medio de bits
apagados por ciclo mediante la expresión
17
Integer benchmarks Floating-point benchmarks Averages
100
80
Leakage energy savings (%)
60
40
20
0
16
17 gzip
17 vpr
18 gcc
18 mcf
19 craf
25 par
25 per
25 gap k
30 bzip
16
17 wup
17 swi se
17 gr
17 app
17 me
18 art
18 equ
18 face e
30 amm c
in
fp
al
t
l
4.
5.
6.
1.
6.
7. ty
3. se
4. lbm
6.
0. 2
8.
1. w
2. m
3. id
7. lu
9. sa
3.
7. ak
8. re
1.
tw
ap p
ol
si
f
r
18
(0 ó 1), formando un simple latch. Los dos transistores laterales desempeñan
la función de transistores de paso, que al conducir, permiten escribir o leer
del latch.
Word select
1V
C /C
Gnd
19
escrituras y lecturas (para estas últimas el retardo es un factor crı́tico).
Con este objetivo, se plantean dos aproximaciones, que se discuten a
continuación.
Primera aproximación
20
controlada por otro transistor de paso T0 , que conducirá en los casos 00, 01
y 10.
El último elemento necesario es la lógica que controle las entradas a los
transistores de paso según los bits C1 C0 . Las funciones lógicas que determi-
nan la activación de cada uno de ellos son las siguientes:
T32 C1 · C0
T1 C1
T0 C1 + C0
B3 B2 B1 B0
C1 C0
Segunda aproximación
La codificación en dos bits del estado de una palabra tiene una serie de
desventajas, entre las cuales se puede destacar la inclusión de lógica para la
21
B3 B2 B1 B0
S3 S2 S1 S0
22
B3 B2 B1 B0
S3 8 S2 8 S1 8 S0 8
8 8 8 8
8 8 8 8
32
23
S3 S2 S1 S0
8 8 8 8
D31…24 D23…16 D15…8 D7…0
24
Tabla 2.1: Ahorro de energı́a dependiendo de la resolución de apagado para 256.bzip2
x m(x, 0) M (x, 0) Individual Ideal 1 alter. 32 32+24 32+24+16 32+24+16+8 32+16 32+16+8 32+8
32 0.5584 0.5584 0.5584 0.5584 0.5584 0.5584 0.5584 0.5584 0.5584 0.5584 0.5584 0.5584
31 0.5598 0.0014 0.0014 0.5598 0.5423
30 0.5617 0.0019 0.0018 0.5615 0.5266
29 0.5646 0.0029 0.0026 0.5642 0.5117
28 0.5676 0.003 0.0026 0.5668 0.4967
27 0.5713 0.0037 0.0031 0.5699 0.4820
26 0.5763 0.005 0.0041 0.5740 0.4682
25 0.5809 0.0046 0.0036 0.5776 0.4538
24 0.5846 0.0037 0.0028 0.5803 0.4385 0.0197 0.0197 0.0197
23 0.5908 0.0062 0.0045 0.5848 0.4246
22 0.5948 0.004 0.0028 0.5876 0.4089
21 0.5988 0.004 0.0026 0.5902 0.3930
20 0.6024 0.0036 0.0023 0.5924 0.3765
19 0.6042 0.0018 0.0011 0.5935 0.3587
18 0.6056 0.0014 0.0008 0.5943 0.3407
17 0.6073 0.0017 0.0009 0.5952 0.3226
25
26
• Resto de columnas: indican todas las posibilidades de resolución de
apagado. Por ejemplo, la columna con etiqueta 32+24+16 indica que
tenemos la posibilidad de apagar bien 32 bits (palabra completa), o bien
24 bits, o bien 16 (además de la posibilidad de no apagar ninguno). Los
contenidos de la columna indican el ahorro obtenido según las palabras
afectadas por cada posibilidad de apagado.
• Ahorro en energı́a bruto: esta fila calcula el ahorro bruto que se obtiene
para una determinada combinación de números de bits apagados. Es
la suma de todos los valores situados por encima en la misma columna.
27
• Ahorro neto: en los resultados de esta fila, por fin, se basa la decisión de
la codificación escogida. El ahorro neto se calcula restando el porcen-
taje de energı́a disipada por S (hardware extra de control de apagado)
del ahorro bruto en cada una de las combinaciones de apagado.
28
80
75
Leakage energy savings (%)
70
65
60
55
50
45
40
16
17
17
18
18
19
25
25
25
30
Av
4.
5.
6.
1.
6.
7.
3.
4.
6.
0.
er
gz
vp
gc
cr
pa
pe
ga
bz
tw
ag
cf
ol
ip
ip
rs
rlb
e
fty
f
2
er
m
k
32 32+16 32+24+16 32+16+8
32+24 32+8 32+24+8 32+24+16+8
80
75
Leakage energy savings (%)
70
65
60
55
50
45
40
16
17
17
17
17
17
18
18
18
30
Av
8
er
.w
.s
.m
.a
.m
.a
.e
.fa
.a
.a
ag
w
pp
rt
qu
ps
up
gr
es
ce
im
e
m
i
lu
ak
id
w
re
p
is
c
e
29
Es a partir de esta información de donde se extrae la conclusión de que
una resolución de apagado de 32+24 ó 32+16 es óptima para los benchmarks
de enteros, contrastando con la optimalidad de una resolución de apagado de
32 (únicamente la palabra completa) para el caso de la aritmética en coma
flotante.
En cualquier caso, la diferencia entre los resultados para las diferentes
resoluciones de apagado plausibles (que explotan una o dos combinaciones)
es pequeña. Sea cual sea la combinación escogida, se va a obtener un ahorro
neto que ronda el 60%.
30
Resoluciones Bits en S Área extra
32 1 2.94%
32+24, 32+16, 32+8 2 5.88%
32+24+16, 32+24+8, 32+16+8 3 8.82%
32+24+16+8 4 11.76%
31
Capı́tulo 3
Simulador desarrollado
32
• Adopción de partes principales de SimpleScalar. Por ejemplo, se ha
replicado prácticamente (con las modificaciones pertinentes) la simu-
lación del núcleo del procesador, el predictor de saltos, la memoria
principal, el cargador de ejecutables en formato ELF, gestor de llama-
das al sistema o gestor de lı́nea de órdenes y de estadı́sticas.
33
3.4.3, y ofrece un enfoque pedagógico al simulador, puesto que analiza los fi-
cheros de traza de una determinada ejecución y los muestra en forma tabular
ciclo a ciclo, junto con el estado del procesador en cada instante.
Por otra parte, el simulador desarrollado incorpora ciertas caracterı́sticas
que van más allá del diseño de SimpleScalar. Todas ellas se basan en la
temática asociada a las perspectivas de investigación de cara al futuro: los
multiprocesadores, los procesadores multi-hilo (multithread) y los procesado-
res CMP (core multi-processor).
Estos aspectos no han sido explotados en las simulaciones llevadas a cabo
en este proyecto. Sin embargo, constituyen una serie de decisiones de imple-
mentación que afectan a las partes principales del simulador. Las extensiones
al diseño original de SimpleScalar se resumen en los siguientes componentes:
34
espacios de direccionamiento de memoria de los procesos presentes en
el modelo. Por tanto, van a ser las direcciones fı́sicas generadas por la
MMU las que se utilizarán para acceder a la memoria cache.
35
para un predictor de saltos adaptativo de dos niveles (con sus variacio-
nes GAg, GAp, PAg y PAp), predictor de dos bits, predictor estático de
saltos siempre tomados y predictor estático de saltos nunca tomados.
36
para programas compilados con la opción -g, lo cual resulta útil para
la utilidad de visualización de archivos binarios implementada.
37
• options.c: Control de la lı́nea de órdenes y el fichero de configuración.
38
programa pasado como parámetro. Resulta útil para comprobar la
correcta implementación del juego de instrucciones, o que el compor-
tamiento de un programa compilado para MIPS es el esperado.
39
sirven como resultados de ciertas operaciones de coma flotante. Los
registros hi y lo reciben los resultados de las multiplicaciones enteras.
Por último, el registro pc almacena el contador de programa, es decir,
la dirección de la siguiente instrucción a ejecutar.
40
Formato R
31 26 25 21 20 16 15 11 10 6 5 0
op rs rt rd shift func
Formato I
31 26 25 21 20 16 15 0
op rs rt imm
31 26 25
Formato J 0
op target
Para los tres formatos, existe alguna instrucción aislada que viola esta
clasificación general. La tabla 3.1 muestra los campos que impone cada
formato, ası́ como el número de bits que abarca.
41
Etapa fetch
Etapa dispatch
42
En primer lugar, se toman los datos de la nueva instrucción a decodificar
desde la cola fetch-dispatch, cuyas entradas fueron rellenadas en la etapa
anterior. Las instrucciones de esta cola se han buscado siguiendo el orden que
estableció el predictor de saltos, con lo que puede haber alguna instrucción
que suponga el comienzo de una ejecución especulativa.
Seguidamente, el modelo utiliza la información del fichero machine.def
(explicado en 3.3.4) para actualizar los valores del banco de registros y la
memoria según la instrucción que se esté ejecutando, y para extraer las de-
pendencias de datos y la unidad funcional consumida por dicha instrucción.
Esta información servirá en etapas posteriores para controlar la ejecución
fuera de orden y el lanzamiento a ejecución.
Dicho de otra forma, en esta etapa se ejecuta la funcionalidad de la ins-
trucción, especificada en machine.def, modificando el banco de registros y la
memoria. En un procesador real, esto no ocurre hasta la etapa commit. Sin
embargo, en el modelo se sigue esta estrategia con el objetivo de facilitar
el diseño centralizado del juego de instrucciones y aumentar la velocidad de
simulación. Las siguientes etapas simplemente se encargan de simular los
aspectos temporales.
Para ello, se dispone de mecanismos de reversibilidad de ejecución espe-
culativa en cuanto al estado de los registros y la memoria. En un procesador
real, sólo se conoce la presencia de especulación en la etapa commit. Sin
embargo, en el modelo podemos ser conscientes de ella en esta misma etapa,
puesto que ya se conoce el resultado de la operación de salto (en su caso), que
a su vez se puede comparar con el resultado del predictor de saltos, proferido
en la etapa anterior. En el caso de que ambos difieran, se establece un punto
de recuperación del banco de registros y la memoria, restaurándolo cuando
la instrucción especulativa alcance la etapa commit del procesador.
43
Nótese que es necesario continuar la simulación funcional tras un fallo de
especulación, puesto que la secuencia de instrucciones decodificadas y ejecu-
tadas (sin llegar a la etapa commit) en dicho intervalo puede repercutir sobre
los contenidos de la memoria cache, la utilización de las unidades funcionales,
etc.; en definitiva, sobre las estadı́sticas de la simulación.
Seguidamente, se rellena una entrada de la RUU. También se establecen
las listas de dependencias de los datos, que determinan el orden en que las
instrucciones se lanzan a ejecución. Además, las instrucciones de acceso a
memoria rellenan una entrada de la LSQ.
El número de instrucciones que pueden decodificarse en la etapa dispatch
viene determinado por el parámetro ruu decode width.
Etapa issue
44
principal).
La comunicación de la etapa issue con las siguientes no ocurre a través de
una estructura de datos hardware. Las instrucciones se encuentran disemina-
das en las diferentes unidades funcionales, o esperando el acceso a memoria.
En ambos casos, la latencia de la operación se conoce en el simulador desde
el momento en que se lanzan a ejecución.
La forma de permitir a las instrucciones continuar en la siguiente etapa
(writeback) es mediante una simulación orientada a eventos, insertándolos en
una lista de eventos y adjuntando el ciclo en que se deben disparar, depen-
diendo de la latencia de los operadores.
Etapa writeback
45
Etapa commit
46
Si se observa la definición de la macro SET GPR, utilizada en la imple-
mentación del juego de instrucciones, se ve que el acceso al banco de
registros varı́a según el estado del campo spec mode. Cuando se da eje-
cución especulativa, se crea una copia auxiliar del banco de registros,
que se accede temporalmente, hasta que se restaure el modo de eje-
cución normal.
47
etapa del procesador se van a utilizar las entradas de la RUU para modificar
convenientemente el estado del pipeline.
La RUU es una cola FIFO, en la que se incorpora una nueva entrada en
la etapa dispatch y en cuya cabeza se extrae otra entrada en la etapa commit.
También se admite la operación de vaciado completo de la RUU.
La estructura que modela la RUU es la siguiente:
struct RUU_struct {
int size;
int num;
int head, tail;
struct RUU_station *elem;
[...]
};
struct RUU_station {
word inst;
struct md_inst_fld_t inst_fld;
dword regs_PC, regs_NPC, regs_NNPC;
dword pred_NPC, pred_NNPC;
int thread_id;
int in_LSQ;
int ea_comp;
int spec_mode;
48
int kill;
dword addr;
dword tag;
dword seq;
byte data[8];
int recover_inst;
int stack_recover_idx;
struct bpred_update_t dir_update;
int queued;
int issued;
int completed;
int squashed;
int onames[2];
struct RS_link *odep_list[2];
int idep_ready[3];
};
49
(etapa en que se simula la funcionalidad de las instrucciones), puesto
que nos encontramos ante una arquitectura con un delay slot de una
instrucción.
50
• seq: identificador de secuencia de la instrucción, útil para la generación
de una traza de ejecución.
Desde múltiples posiciones del código del simulador es necesario hacer refe-
rencia a elementos de la RUU. Estas referencias tienen normalmente asociada
cierta información; por ejemplo, si tenemos referencias a instrucciones que
fueron lanzadas a ejecución y están esperando la finalización de la actividad
de su unidad funcional correspondiente, es necesario almacenar el tiempo en
que se dará este evento. Para este y otros propósitos, nos encontramos con
la estructura RS link:
51
struct RS_link {
struct RS_link *next;
struct RUU_station *rs;
dword tag;
union {
sdword when;
dword seq;
int opnum;
} x;
};
El campo next de la estructura sirve para formar una lista enlazada que
forma el conjunto de elementos RS link libres.
52
Por otra parte, hay que recordar que la estructura RUU station posee
a su vez un campo tag, al que se asigna un valor en el momento de
la creación de la entrada en la RUU. Dicho valor es creciente en una
unidad respecto a la última asignación, por lo que nunca puede haber
dos instrucciones cuyo campo tag haya recibido el mismo valor a lo
largo de toda la simulación.
Ası́ pues, cuando se elimine una entrada de la RUU, habrá que tomar
como precaución el establecimiento de su campo tag a 0. Como ninguna
instrucción que se instale en la misma entrada tomará el mismo valor,
el enlace quedará sin efecto permanentemente.
53
– opnum: cuando se usa una referencia a una instrucción dentro de
una lista de dependencias de salida de una operación, este campo
indica cuál de los posibles operandos de salida (0, 1 ó 2) es el que
provoca la dependencia.
Listas de dependencias
struct CV_link {
struct RUU_station *rs;
int odep_num;
};
struct proc_t {
struct {
struct CV_link create_vector[MD_TOTAL_REGS];
struct CV_link spec_create_vector[MD_TOTAL_REGS];
int use_spec_cv[MD_TOTAL_REGS];
...
} thread[MAX_THREADS];
...
}
54
use spec cv contiene TRUE en aquellas posiciones correspondientes a los regis-
tros cuyos valores se escribieron estando en modo especulativo, y por tanto,
aquéllos para los que se accederá al vector de creadores a través del campo
spec create vector.
struct RUU_station {
...
int onames[2];
struct RS_link *odep_list[2];
int idep_ready[3];
};
55
int idep_num, int idep_name);
ADDI
rs rt immediate
001000
6 5 5 16
#define ADDI_IMPL { \
int_t temp = (int_t) GPR(RS) + (int_t) IMM; \
SET_GPR(RT, SEXT64(temp, 32)); \
}
56
DEFINST(ADDI, 0x20000000,
0xfc000000, "t,s,i",
IntALU, F_ICOMP|F_IMM,
DGPR(RT),DNA, DGPR(RS),DNA,DNA)
El código encerrado entre las llaves que siguen a ADDI IMPL en el ejemplo
especifica el comportamiento de la instrucción ADDI. Puede definir variables al
comienzo y puede usar cada una de las siguientes macros, que se presuponen
definidas y dedicadas al uso en la definición del comportamiento de una
instrucción:
• OPCODE, RS, RT, RD, SHIFT, FUNC, TARGET: campos de la instrucción de-
codificada. Por ejemplo, la macro RS devuelve un valor entre 0 y 31,
correspondiente a los 5 bits de la instrucción correspondientes al campo
rs.
57
• GPR(X), FPRS(X), FPRD(X): lectura del banco de registros. Con la macro
GPR se accede al banco de registros de enteros. Con FPRS, al banco de
registros de coma flotante, como valores IEEE de simple precisión. Por
último, con FPRD se accede a este mismo banco de registros, aunque
considerando grupos de dos registros que, combinados, forman valores
IEEE de doble precisión. En este último caso, X debe ser un número
par.
• SET GPR, SET FPRS, SET FPRD: escritura en el banco de registros. Las dife-
rentes posibilidades son las citadas en el punto anterior.
• PC, NPC: lectura del registro contador de programa y de NPC, que indica
el siguiente valor que tomará PC.
• READ XXX, WRITE XXX: lectura y escritura en memoria. XXX puede ser BYTE,
HALF, WORD o DWORD.
58
Definición del formato de una instrucción
DEFINST(INST, BITS,
MASK, FORMAT,
FUCLASS, FLAGS,
O1, O2, I1, I2, I3)
• BITS y MASK: éstos son los dos campos que identifican los bits de la
función. El valor de MASK es una máscara de bits, cuyos bits a 1 indican
las posiciones de una instrucción a las que se les exige tomar un cierto
valor para poderse considerar que representan a la instrucción INST. El
valor de BITS indica cuáles son los valores de esas posiciones.
59
definiciones, correspondiéndole la que cumpla que w and MASK sea igual
a BITS, siendo la operación and un producto lógico bit a bit.
• FORMAT: este campo indica los argumentos que tiene la instrucción en en-
samblador. Está compuesto por una serie de letras, indicando cada una
de ellas un campo de la instrucción. Cualquier otro carácter es interpre-
tado como un literal. Las siguientes letras, distinguiendo mayúsculas
y minúsculas, y entre otras, son posibles en este campo:
60
funcionales, en el caso de que estén libres. Cada instrucción tiene una
(o ninguna) unidad funcional asociada. Los posibles valores de FUCLASS
son los siguientes:
61
• INx y OUTx: estos campos indican las dependencias de entrada (3 como
máximo) y de salida (2 como máximo) de la instrucción. Las depen-
dencias se expresan mediante las siguientes macros:
Hay que destacar que DEFINST es una macro que no está definida global-
mente, lo cual proporciona una gran flexibilidad para la definición del juego
de instrucciones. El fichero machine.def está diseñado para ser incluido (me-
diante la directiva #include) desde cualquier punto del resto de ficheros de
código, los cuales deben proporcionar una definición de la macro DEFINST.
Según la conveniencia en cada instante, se utilizan en la definición unos ar-
gumentos u otros, de entre todos los incorporados en machine.def.
Como ejemplo de la versatilidad de este mecanismo, podemos citar
la inclusión de este fichero desde machine.h para construir la enumeración
enum md opcode, que contiene una lista con los nombres de todas las instruc-
ciones máquina, incorporándoles el prefijo “OP ”:
enum md_opcode {
OP_ERR = 0,
#define DEFINST(NAME,BITS,MASK,FORMAT,FUCLASS,FLAGS,O1,O2,I1,I2,I3) OP_##NAME,
#include "machine.def"
62
#undef DEFINST
OP_MAX
};
Para calcular los valores de estos dos campos, se ha construido una he-
rramienta simple, de nombre inst, que recibe como parámetros los bits que
63
deben tomar un valor determinado. Por tanto, a partir de la especificación del
formato de la instrucción en [15], se pueden extraer fácilmente las máscaras
de instrucción, para su posterior inserción en la macro DEFINST.
Considérese, por ejemplo, la instrucción de comparación de números en
coma flotante C.cond.fmt:
31 26 25 21 20 16 15 11 10 8 7 6 5 4 3 0
COP1 A FC
fmt ft fs cc 0 cond
010001 0 11
6 5 5 5 3 1 1 2 4
64
etiquetas de instrucciones), y las muestra en el listado final. Las direcciones
a zonas de código emitidas en las instrucciones se muestran relativas a la
etiqueta más cercana anterior.
La utilidad del visor de archivos binarios como herramienta depuradora
del simulador reside en la comparación del código decodificado con el de
objdump de GNU, y en la posibilidad de localizar instrucciones todavı́a no
implementadas (se muestran con el código -err-).
Una posible ejecución del visor provoca una salida como ésta:
...
4003e4 00000000 nop
4003e8 03e00008 jr ra
4003ec 27bd0020 addiu sp, sp, 32
004003f0 <main>:
4003f0 3c1c0fc1 lui gp, 4033
4003f4 279cc0e0 addiu gp, gp, -16160
4003f8 0399e021 addu gp, gp, t9
4003fc 27bdff70 addiu sp, sp, -144
400400 afbc0028 sw gp, 40(sp)
...
65
estado del pipeline del procesador, es decir, se notifica la entrada, avance
o salida de una instrucción a través de sus diferentes etapas.
66
***** Traza (seq, thread_id, pc, inst) - ciclo = 10075 *****************************
46 47 48 49 50 51 52 53 54 55 56 57 58
---- 0 4377c4 ’ld/st interno’ WB C
---- 0 4377c8 lw s5, 44(sp) IF DI EX WB C
---- 0 4377cc lw s4, 40(sp) IF DI EX WB C
---- 0 4377d0 lw s3, 36(sp) IF DI EX WB C
---- 0 4377d4 lw s2, 32(sp) IF DI EX WB C
---- 0 4377c8 ’ld/st interno’ DI EX WB C
---- 0 4377d8 lw s1, 28(sp) IF DI EX WB C
---- 0 4377dc lw s0, 24(sp) IF DI EX WB C
---- 0 4377e0 addu v0, a0, zero IF DI EX WB C
---- 0 4377e4 jr ra IF DI EX WB C
---- 0 4377cc ’ld/st interno’ DI EX WB C
---- 0 4377e8 addiu sp, sp, 56 IF DI EX WB C
---- 0 434c10 lw gp, 16(sp) IF DI EX WB
67
Capı́tulo 4
Resultados
68
Tabla 4.1: Parámetros de la máquina
69
4.2 Resultados de las simulaciones
Como ya se ha explicado en secciones anteriores, la técnica de apagado
de ceros es ortogonal a otras polı́ticas de reducción de consumo. Resulta,
por tanto, de gran interés experimentar con la combinación de más de una
técnica, para observar en qué grado aumentan los ahorros de energı́a estática.
En concreto, la técnica cache decay es la escogida para los experimentos reali-
zados, puesto que supera el ahorro de consumo de técnicas alternativas exis-
tentes y utiliza el mismo mecanismo de desconexión de celdas que apagado
de ceros(Gated-Vdd).
Los parámetros especı́ficos de cache decay son los siguientes:
• Siendo cache decay una técnica basada en contadores locales por cada
lı́nea de cache y un contador global para toda la memoria, se deben
establecer sus rangos, que repercutirán en los ahorros de energı́a y en
el grado de disminución del IPC. Se asumen contadores locales de 2 bits,
con rango de 3 a 0. Una lı́nea de cache se apaga cuando su contador
local asociado vale 0 y recibe una notificación del contador global. En
ese momento, se produce una pérdida de los datos de la lı́nea, debido
a la naturaleza de la técnica de apagado utilizada por cache decay.
70
Integer benchmarks Floating-point benchmarks Averages
100
80
Leakage energy savings (%)
60
40
20
0
16
17 gzip
17 vpr
18 gcc
18 mcf
19 craf
25 par
25 per
25 gap k
30 bzip
16
17 wup
17 swi se
17 gr
17 app
17 me
18 art
18 equ
18 face e
30 amm c
in
fp
al
t
l
4.
5.
6.
1.
6.
7. ty
3. se
4. lbm
6.
0. 2
8.
1. w
2. m
3. id
7. lu
9. sa
3.
7. ak
8. re
1.
tw
ap p
ol
si
f
r
71
Integer benchmarks Floating-point benchmarks Averages
1.1
1
0.9
0.8
0.7
IPC loss (%)
0.6
0.5
0.4
0.3
0.2
0.1
0
16
17 gzip
17 vpr
18 gcc
18 mcf
19 craf
25 par
25 per
25 gap k
30 bzip
16
17 wup
17 swi se
17 gr
17 app
17 me
18 art
18 equ
18 face e
30 amm c
in
fp
al
t
l
4.
5.
6.
1.
6.
7. ty
3. se
4. lbm
6.
0. 2
8.
1. w
2. m
3. id
7. lu
9. sa
3.
7. ak
8. re
1.
tw
ap p
ol
si
f
r
72
ninguna variación en el IPC, y a su vez mejora los ahorros de cache decay.
En consecuencia, la técnica de apagado de ceros se revela como una opción
más efectiva que cache decay. Por otra parte, si para un determinado diseño
no resulta especialmente crı́tica la pequeña pérdida de prestaciones y sı́ lo es,
en cambio, el consumo, queda en manos del diseñador la decisión de escoger
o no una implementación que combine ambas técnicas, y por tanto ofrezca
un consumo todavı́a más bajo.
73
Capı́tulo 5
Conclusiones
74
radas tiene una carga hardware extra distinta, además de que proporciona
diferentes formas de explotación en mayor o menor medida de las posibilida-
des de apagar bits en las palabras. Implementando una resolución más alta,
se tendrán en promedio más bits apagados en los datos de la memoria cache;
sin embargo, la circuiterı́a de control aumenta en complejidad y, por tanto,
en consumo.
En el capı́tulo 2, se muestran los experimentos realizados, algunos de ellos
centrados en hallar la resolución de apagado idónea, que consiga un mayor
ahorro de consumo teniendo en cuenta ambos factores. Se ha llegado a la
conclusión de que la resolución 32+24 es la óptima para las cargas SPEC2000
de aritmética entera, mientras que la resolución 32 lo es para las de aritmética
en coma flotante (la nomenclatura utilizada en las resoluciones de apagado
queda descrita en la sección 2.3.3). Un diseñador puede escoger una de estas
dos según la aplicación más común que vaya a recibir su implementación.
En el capı́tulo 4, se muestran los experimentos destinados a analizar la
combinación de apagado de ceros con cache decay, utilizando ya para la pri-
mera técnica las resoluciones óptimas establecidas en el capı́tulo 2. Para las
cargas SPEC2000, apagado de ceros proporciona un ahorro medio de energı́a
estática del 60.3%, mientras que la combinación de ambas técnicas alcanza el
67.3%. Estos resultados consideran la carga hardware adicional ocasionada
por la lógica de control.
El incremento del área de la cache depende de la resolución escogida. En
el caso de 32+24, la porción del chip ocupada por la memoria cache L1 crece
en un 5.88%. Para una resolución de apagado de 32, el aumento del área
es del 2.94%. De nuevo, apagado de ceros ofrece flexibilidad en este sentido.
Si el tamaño del chip es crı́tico en un determinado diseño, por ejemplo por
existir una limitación en el número de transistores empleados, puede optarse
75
por una resolución de 32, que incrementa casi de forma despreciable el área
de la memoria cache, obteniendo ahorros de consumo muy altos incluso en
los casos en los que no se trata de la resolución óptima.
Por último, y si bien no es reciente la idea del aprovechamiento de la
distribución de los datos para disminuir el consumo, se puede decir que sı́
resulta novedosa su aplicación a la reducción de la energı́a estática disipada
debida a las corrientes de fuga. Teniendo en cuenta todas las consideraciones
previas, procede afirmar que la técnica de apagado de ceros constituye una
propuesta original, factible y efectiva en el ámbito de las arquitecturas de
bajo consumo.
5.1 Contribuciones
El trabajo realizado puede ser reutilizado con diferentes objetivos. Uno de
ellos es la docencia, ámbito en el que se puede hacer uso de la herramienta
diseñada para la evaluación de las prestaciones de un procesador ante dife-
rentes configuraciones de sus parámetros. Adicionalmente, al tratarse de una
aplicación de código abierto, se pueden proponer a los estudiantes ejercicios
de modificación de la arquitectura, ampliándola para dar soporte a nuevas
técnicas de procesamiento, reducción del consumo, etc.
El programa de visualización de traza (ptrace) pretende potenciar la apli-
cación del simulador a la docencia, dando la posibilidad al estudiante de exa-
minar paso a paso la ejecución de un programa sobre una arquitectura ya
implementada o sobre un nuevo diseño propio.
Asimismo, la técnica de apagado de ceros ha supuesto una contribución
a la investigación en el ámbito de arquitectura del procesador. Los resulta-
dos preliminares de este proyecto se han enviado a diferentes congresos, de
76
ámbito nacional e internacional, para su evaluación y, si procede, su posterior
publicación. Los trabajos enviados son los siguientes:
77
cual se han llevado a cabo los experimentos expuestos, ya incorpora soporte
para la simulación de procesadores multi-hilo. En este tipo de arquitectu-
ras, varios hilos de ejecución, con mapas de memoria independientes y sin
operaciones de comunicación entre ellos, transcurren simultáneamente, com-
partiendo las unidades funcionales del procesador (puertos de memoria y
operadores aritmético-lógicos).
Tanto los procesadores multi-hilo como los CMP constituyen una
parte importante de la tecnologı́a moderna, tanto de procesadores de uso
doméstico, como de los procesadores de altas prestaciones. En consecuen-
cia, la investigación actual en el ámbito de la arquitectura de computadores
se centra en ellos, motivando ası́ la orientación de futuros trabajos en esta
dirección.
78
Referencias
79
[6] C. F. Chen, S. H. Yang, B. Falsafi, and A. Moshovos, “Accurate
and Complexity-Effective Spatial Pattern Prediction”, Proceedings of
the 10th International Symposium on High-Performance Computer
Architecture, Febrero 2004.
80
[16] Y. Ye, S. Borkar, and V. De, “A New Technique for Standby Leakage
Reduction in High-Performance Circuits”, Symposium on VLSI Circuits,
Junio 1998
81