Sei sulla pagina 1di 17

1 (Ejercicios de clase)

En un computador el bus de memoria principal es de 100 Mhz y 64 bits de datos. Si el ciclo de lectura del bus
necesita dos ciclos de reloj, (a) ¿cuál es el tiempo de acceso que debe tener la memoria para que no se necesiten
introducir estados de espera? (b) Suponga que quiere cargar desde la memoria una línea de cache consituida por
64 bytes ¿Cuál es la ganancia en ancho de banda que se obtiene si se utiliza acceso en modo ‘burst’ con relación
a acceso palabra a palabra si el tiempo de acceso de la memoria es de 45 ns??

Solución.
Puesto que la frecuencia del bus es de 100 MHz, el tiempo de ciclo es de

1/100*106 sg = 10 / 109 sg = 10 nsg

(a) Dado que el tiempo de ciclo de lectura del bus necesita dos ciclos de reloj, el tiempo de acceso de la
memoria, para no tener que introducir estados de espera en una lectura, es igual a

2 * Tciclo_de_bus = 2 * 10 nsg = 20 nsg

(b) Puesto que el bus tiene 64 bits de datos, es decir 8 bytes, para acceder a 64 bytes se necesitarían 8 accesos a
memoria.

Si el tiempo de acceso a la memoria es de 45 nsg, se necesitarían 5 ciclos de reloj (45/10 = 4.5, siendo 5 el menor
número entero mayor o igual a 4.5). Por lo tanto, habría que introducir 3 ciclos de espera (de 10 nsg cada uno)
puesto que los 20 nsg que constituyen el tiempo de ciclo de bus mínimo no son suficientes para que la memoria
proporcione el dato.

Si se puede utilizar un modo burst que permita leer una línea completa para introducirla en la cache se tendría
que el número de ciclos necesario es 5-1-1-1-1-1-1-1 (cinco ciclos para acceder a la primera palabra, y luego un
ciclo para acceder a cada una de las restantes), se necesitarían por tanto

12 ciclos = 12 * 10 nsg = 120 nsg → Ancho de Banda (Burst) = (64*8) bits / 120 nsg
Si no se utiliza el modo burst se necesitan 5 ciclos por cada uno de los 8 accesos, es decir
5*8 ciclos = 40 * 10 nsg = 400 nsg → Ancho de Banda (No Burst) = (64*8) bits / 400 nsg
Por lo tanto, la ganancia en ancho de banda es
S (Ancho de Banda)= Ancho de Banda(Burst) / Ancho de Banda (No Burst) = 400/120 = 3.33

2 (Ejercicios de clase)
Un computador dispone de un procesador de 64 bits y utiliza una memoria cache de correspondencia directa de
64 Kbytes y una memoria principal de 32 Mbytes. (a) Indique la posición de cache que ocupa la instrucción que
se encuentra en la dirección 110AB48h teniendo en cuenta que cada línea es de 128 bytes.(b) ¿Y si, con los
mismos datos, la memoria cache fuese asociativa por conjuntos de 4 vías?

Solución.
Como la memoria principal es de 32 Mbytes, una dirección de memoria es de 25 bytes (32 Mbytes = 225 bytes), y
como la memoria cache es de 64 Kbytes, las direcciones de cache tienen 16 bytes (64 Kbytes = 2 16 bytes).
Teniendo en cuenta que las líneas son de 128 bytes, los 7 bytes menos significativos son los que permiten
direccionar los bytes dentro de una línea (128 bytes = 27 bytes).

Según esto, el número de líneas de la cache es

64( Kbytes / cache) 216 (bytes / cache)


 7  2 9 (lineas / cache)
128(bytes / linea ) 2 (bytes / linea )

por lo que se necesitan 9 bits para designar una línea.


(a) Si la memoria cache es de correspondencia directa, los 7 bits menos significativos de la dirección indican la
posición del byte dentro de la línea (esto es así en cualquier organización de cache, puesto que, al transferirse
líneas completas entre cache y memoria, la correspondencia se establece entre líneas), los siguientes 9 bits
indican la línea de cache en donde se almacena la línea de memoria principal, y los restantes 9 bits van al campo
de marca para poder identificar la línea concreta de memoria principal que se ha introducido en la línea de cache
en cuestión. En la figura se esquematiza la situación de los bits:

25

Memoria
9 9 7 Principal
Marca Línea Byte
Memoria
9 7
Cache

16

Así pues, la dirección es

110AB48h = 1 0001 0000 1010 1011 0100 1000

donde los 16 bits recuadrados constituyen la dirección de cache: los 7 menos significativos (señalados en gris)
corresponden a la dirección de byte dentro de la línea los 9 siguientes indican la línea de cache donde está la
información. Los 9 bytes más significativos (no recuadrados) son los que se introducen en el campo de marca.
Por tanto:

Posición en la cache: AB48h


Campo de marca: 110h (con 9 bits)

(b) Si la memoria cache fuese asociativa de 4 vias, las líneas estarían agrupadas en conjuntos de cuatro, por lo
que el número de conjuntos sería 29 / 22 = 27 conjuntos.

Así, al establecerse la correspondencia entre líneas de memoria y conjuntos de cache, se necesitarían 7 bits de
memoria principal para indicar el conjunto, y se introducirían 11 bits (los 11 bits más significativos) en el campo
de marca. Para completar la dirección de cache faltarían 2 bits (4 vías = 22) que se determinan según la política
de asignación que se implemente en la memoria asociativa donde se introducen los campos de marca.

25

Memoria
11 7 7 Principal
Marca Byte
Conjunto
2 Memoria
7 7
Cache

16

Así pues, la dirección se obtendría a partir de la dirección de memoria principal

110AB48h = 1 0001 0000 1010 1011 0 100 1000


donde se han señalado en gris los 7 bits que indican el conjunto. Los 7 bits memos significativos (recuadrados en
blanco) indican la posición dentro de la línea, y los 11 bits más significativos se introducen en el campo de
marca. Según esto, la dirección en cache sería:

1010 110X X100 1000

donde los bits marcados con XX tienen el valor que se les asigne al copiar la línea en caché según la política de
asignación y la ocupación de líneas en el conjunto (puede asignársele la línea 0, 1, 2, o 3 del conjunto). Si, por
ejemplo se le asigna la línea 1 del conjunto, el valor de esos bits sería 01 y tendríamos que

Posición en la cache: 1010 1100 1100 1000 = ACC8h


Conjunto: 101 0110 = 56h (con 7 bits)
Campo de marca: 100 0100 0010 = 442h (con 11 bits)

3 (Ejercicios de clase)
En un computador basado en el Pentium II (caches internas asociativas por conjuntos de 2 vías, de 16 Kbytes
para datos, y de 16 Kbytes para instrucciones) que dispone de una memoria cache de segundo nivel de 256
Kbytes asociativa por conjuntos de 4 vias, y una memoria principal de 64 Mbytes. Indique las posiciones que
ocupa en las memorias caches una instrucción de programa que se encuentra en la posición de memoria
12AAC4h. (Nota: cada línea tiene 32 bytes)

Solución.
Los bits que constituyen las direcciones en cada una de las memorias son:

Memoria principal: 64 Mbytes = 226 bytes (26 bits de los 32 que genera el procesador)

Memoria Cache L1(2 vías): 16 Kbytes = 214 bytes (14 bytes de dirección)

Memoria Cache L2 (4 vías): 256 Kbytes = 218 bytes (18 bytes de dirección)

Como cada línea tiene 32 bytes, para direccionar un byte se necesitan 5 bits (32 = 25)

Cache L1) De los 14 bits de dirección, los 5 menos significativos corresponden a la posición dentro de la línea de
cache, y quedan 9 bits que indican la dirección de línea (hay 29 = 512 líneas). Como es una cache asociativa de 2
vías, existirán 29 /2 = 28 conjuntos (256 conjuntos).

De esta forma, en la dirección de memoria principal, los bits más significativos se introducen en el campo de
marca, los 8 bits siguientes indican el conjunto en el que se introduce la línea, y los 5 bits menos significativos
corresponden a la posición de byte dentro de la línea.

Memoria
8 5 Principal
Marca Byte
Conjunto
1 Memoria
8 5
Cache

14
Así, en la posición de memoria:

12AAC4h = 1 0010 1010 1010 1100 0100

los 8 bits remarcados en gris indican el conjunto en el que se introduce la línea, y los 5 menos significativos
indican la posición de byte dentro de la línea.
Eso significa que la dirección en cache será 01010110X00100 donde el valor de X se fijará en el momento en
que se introduce la línea en cache, según el estado de ocupación de las dos líneas del conjunto y de la política de
asignación. Si suponemos que se le asigna el conjunto 0 se tiene que:

Dirección en cache: 01 0101 1000 0100 = 1584h (con 14 bits)


Conjunto: 0101 0110 = 56h (con 8 bits)

Marca: 10010101

Cache L2) De los 18 bits de dirección, los 5 menos significativos corresponden a la posición dentro de la línea de
cache, y quedan 13 bits que indican la dirección de línea (hay 213 = 8K líneas). Como es una cache asociativa de
4 vías, existirán 213 /22 = 211 conjuntos (2K conjuntos).

De esta forma, en la dirección de memoria principal, los bits más significativos se introducen en el campo de
marca, los 11 bits siguientes indican el conjunto en el que se introduce la línea, y los 5 bits menos significativos
corresponden a la posición de byte dentro de la línea.

Memoria
11 5 Principal
Marca Byte
Conjunto
2 Memoria
11 5
Cache

18

Así, en la posición de memoria:

12AAC4h = 1 0010 1010 1010 1100 0100

los 11 bits remarcados en gris indican el conjunto en el que se introduce la línea, y los 5 menos significativos
indican la posición de byte dentro de la línea.

Eso significa que la dirección en cache será 10101010110XX00100 donde el valor de XX se fijará en el
momento en que se introduce la línea en cache, según el estado de ocupación de las dos líneas del conjunto y de
la política de asignación. Si suponemos que se le asigna el conjunto 00 se tiene que:

Dirección en cache: 10 1010 1011 0000 0100 = 2AB04h (con 18 bits)


Conjunto: 101 0101 0110 = 556h (con 11 bits)
Marca: 10010

4 (Ejercicios de clase)
En un computador, la cache interna del procesador tiene un tiempo de acceso de 2.5 ns. y una tasa de aciertos del
80%, y la memoria principal tiene un tiempo de acceso de 10 ns. Suponga que dispone de una memoria cache
SRAM con un tiempo de acceso de 5 ns. ¿Qué tasa de fallos ha de tener para que el tiempo de acceso medio a
memoria se reduzca con respecto a la situación anterior?¿Es posible obtener un tiempo de acceso medio de 3.7
ns.?¿Cuál es el mínimo tiempo de acceso medio que se puede conseguir?. (Nota: Considere que las memorias
cache son 'Look-though').

Solución.
El tiempo medio de acceso al sistema de memoria constituido por la memoria cache interna (L1) y la memoria
principal DRAM es igual a:

T(L1-DRAM) = a1 * t1 + (1-a1)*(t1+tDRAM)= 0.8 * 2.5 + (1-0.8) (2.5 + 10) nsg = 4.5 nsg
donde a1 es la tasa de aciertos de la memoria L1, t1 es el tiempo de acceso de la memoria cache L1, y tDRAM el de
la memoria principal. Se ha supuesto que el dato buscado siempre está en la memoria principal y que la memoria
cache es del tipo look-trough.

En el caso de un sistema de memoria con dos niveles de memoria cache, en el que existe una memoria
implementada con celdas SRAM que constituye el nivel de cache externa L2, se tiene que, si a2 es la tasa de
aciertos de la memoria cache L2 (que se supone también de tipo look-through), el tiempo medio de acceso es
igual a:

T(L1-L2-DRAM) = a1 * t1 + (1-a1)* a2 * (t1+t2) + (1-a1)*(1-a2)*(t1+t2+tDRAM)=


= 0.8 * 2.5 + (1-0.8) * a2 * (2.5 + 5) + (1-0.8) *(1-a2)*(2.5 + 5 + 10) =
= 3.5 + 2 * (1-a2)

De esta forma, para que T(L1-L2-DRAM) < T(L1-DRAM) es preciso que

3.5 + 2 * (1-a2) < 4.5 → (1-a2) < 0.5 → 0.5 < a2

Es decir, que la memoria cache L2 tiene que tener una tasa de aciertos mayor del 50%.

Teniendo en cuenta que T(L1-L2_DRAM) = 3.5 + 2 * (1-a2), si se quiere que T(L1-L2_DRAM) se igual a 3.7
se debe cumplir que

3.7 = 3.5 + 2 * (1-a2) → (1-a2) = 0.2/2 → a2 = 0.9

El tiempo de acceso mínimo correspondería a la situación en la que a2 = 1 (siempre que se busca un dato en L2
se encuentra allí):

T(L1-L2-DRAM) = 3.5 nsg.

Es el mismo valor que se obtendría si en la expresión del tiempo, T(L1-DRAM), para el sistema de memoria de
dos niveles se hiciera el tiempo de acceso a la DRAM igual al tiempo de acceso a la memoria cache L2.

5 (Ejercicios de clase)
Un microprocesador incluye una CPU de 32 bits y caches separadas para datos e instrucciones, de 4 Kbytes cada
una, con líneas de 32 bytes, y organizadas como caches asociativas por conjuntos de dos vías. El tiempo de
acceso a la memoria cache es de 5 ns, la política de reemplazo es LRU (se reemplaza la línea que lleve más
tiempo sin utilizarse), y la de actualización es de post-escritura (write-back). El microprocesador está conectado a
las memorias externas separadas para datos e instrucciones mediante dos buses independientes de 100 MHz y 64
líneas de datos cada uno, con un tiempo de acceso de 50 ns y ciclos burst 5-1-1-1.

Se está ejecutando un programa en el que la secuencia de instrucciones que se encuentran en los bytes 0 a 1FFFh
constituyen un bucle que se repite 30 veces, y tras ellas existe una secuencia de instrucciones que ocupa desde el
byte 2000h hasta el 2FF8h, y que se ejecuta una vez. En el 60% de las instrucciones del programa, se hace
referencia a un dato, ocasionándose un total de 500 fallos en el acceso a estos datos.
(a) Suponiendo que las caches están inicialmente vacías ¿Cuál es la tasa de aciertos para el acceso a los datos y a
las instrucciones en el programa?.
(b) ¿Cuál es el tiempo medio de acceso a la memoria de instrucciones?
(c) ¿Cuál es el tiempo medio de acceso a la memoria de datos si el 20% de los fallos por acceso a datos dan lugar
a reemplazo de la línea con actualización de la línea reemplazada en memoria?

Solución.
(a)Empezaremos situando las líneas del programa en las líneas de la cache interna para instrucciones para
determinar los fallos de cache que se producen al acceder a las instrucciones.
Como la cache de instrucciones tiene 4 Kbytes (212 bytes), con líneas de 32 bytes (25 bytes), habrá 212/25=128
líneas, y como las líneas se agrupan en conjuntos de dos líneas, 128/2=64 (26=64) conjuntos. Por lo tanto, los bits
0-4 indican el byte dentro de la línea, y los bits 5-10 el conjunto al que van las líneas de memoria principal.

Para determinar el número de fallos en la cache de instrucciones hay que tener en cuenta que el bucle tiene
8Kbytes, y que al empezar en la posición 0h , las líneas se empiezan a cargar en cache desde el conjunto 0 (los
bits 5 a 10 son 0). Así, los primeros 4 Kbytes (128 líneas) se pueden situar en los 64 conjuntos de dos vías de la
cache ocasionando 128 faltas. Las líneas de los restantes 4 Kbytes del bucle tendrán que ir reemplazando las
líneas ya cargadas, ocasionando otros 128 fallos. En total, la iteración del bucle ocasionará 256 fallos.

Estos 256 fallos se generarán en cada una de las 30 iteraciones puesto que los primeros 4 Kbytes de cada
iteración tienen que situarse en las líneas de cache ocupadas por los últimos 4 Kbytes de la iteración anterior, etc.
Por lo tanto, el número de fallos en el bucle es 256*30= 7680.

Las secuencia de instrucciones que vienen a continuación ocupen menos de 4 Kbytes, y se podrán introducir en
la caché. Como los bits 5 a 10 de la posición 2000h son cero, las líneas de la secuencia se empiezan a cargar
desde el conjunto 0. Se producirán tantos fallos como líneas haya en la secuencia.

El número de líneas de la secuencia se obtiene desplazando las direcciones de comienzo y final cinco bits a la
derecha (las líneas son de 32 bytes) y restando los datos resultantes. El resultado que queda es 1111111=7Fh, por
lo tanto desde la línea 0 a la 7Fh hay 128 líneas. Es decir, se producen 128 fallos en la secuencia final del
programa.

El número de fallos totales ocasionados por el programa es 7680+128= 7808

Como el número de instrucciones del programa es (30*(8*210)+4088)/4 = 62462 (una instrucción de 32 bits son
4 bytes).

Por lo tanto, la tasa de fallos es de 7808/62462 = 0.125, y la tasa de aciertos a la cache de instrucciones es 0.875.

En cuanto a la tasa de fallos de la memoria cache de datos, se tiene que como el número de instrucciones es
62462, y como se generan accesos a datos en un 60%, el número de accesos a la memoria cache de datos es
0.6*62462= 37477. Como se producen 500 fallos, la tasa de fallos es 500/37477= 0.013, y la tasa de aciertos es
de 0.987

(b) El tiempo medio de acceso a la memoria cache de instrucciones es

Tacceso  acachet cache  (1  acache )(t cache  t memoria )

donde:

- acache es la tasa de aciertos de la cache (acache= 0.875)


- tacceso_cache es el tiempo de acceso a una palabra de la cache interna (tcache=5 ns).
- tacceso_memoria es el tiempo de acceso a una palabra en memoria: tmemoria=50 ns. Cada ciclo de bus es de 10
ns (el bus es de100 MHz), y para acceder a una palabra se necesitan 5 ciclos.

Sustituyendo, se tiene que Tacceso = 0.875*5 + 0.125*(5+50) = 11.25 ns

(c) Para calcular el tiempo medio de acceso a la memoria de datos hay que tener en cuenta el tiempo de acceso a
cache, y a la memoria principal en el caso de fallo de cache. La expresión es:

Tacceso  acachet cache  (1  acache )(t cache  t memoria  preemplazo .tlinea )

donde:
- acache es la tasa de aciertos de la cache (acache= 0.987)
- tcache es el tiempo de acceso a una palabra de la cache interna (tcache=5 ns).
- tmemoria es el tiempo de acceso a una palabra en memoria (tmemoria=50 ns)
- tlinea es el tiempo de actualización de una línea en memoria principal cuando debe reemplazarse dicha
línea en memoria cache. Este tiempo de actualización corresponde al de un acceso burst a la memoria
principal, es decir 5 + 1 + 1 + 1 = 8 ciclos de bus (tlinea=8*10 ns =80 ns).
- preemplazo es la frecuencia con la que se producen reemplazos de línea. Como en el 20% de los fallos hay
necesidad de reemplazo, se tiene que preemplazo=0.2.

Sustituyendo los correspondientes valores, se tiene que

Tacceso = 0.987*5.0 ns + (1-0.987) * (5.0 ns + 50.0 ns +0.2 * 80.0 ns) = 5.793 ns

6 (Ejercicios de clase)
En un computador el bus tiene una frecuencia de 200 MHz, y la memoria principal un tiempo de acceso de 30 ns,
que, tras el primer acceso, puede proporcionar (o recibir) una palabra por ciclo en los ciclos burst. El procesador
superescalar de 1GHz dispone de una cache interna con líneas de 4 palabras.

En los programas, por término medio, un 30% de las instrucciones necesitan leer o escribir un dato (una palabra)
en memoria., la tasa de aciertos de la cache interna es del 90%, y, en un 20% de los accesos a datos se necesita
reemplazar el bloque, en caso de que se haya producido un fallo.
(a) ¿Cuál es el tiempo medio de acceso a la memoria?
(b) ¿Cuántas instrucciones por ciclo se pueden ejecutar, por término medio, en el procesador? ¿y si la tasa de
fallos pasa a ser de un 95%?

Solución.
(a) Para calcular el tiempo medio de acceso a memoria hay que tener en cuenta el tiempo de acceso a cache, y a
la memoria principal en el caso de fallo de cache. La expresión es:

Tacceso  acachetacceso _ cache  (1  acache )(tacceso _ cache  tacceso _ memoria  preemplazo .tacceso _ linea )

Donde:
- acache es la tasa de aciertos de la cache (acache= 0.9)
- tacceso_cache es el tiempo de acceso a una palabra de la cache interna (tacceso_cache=tciclo=1/109=1ns).
- tacceso_memoria es el tiempo de acceso a una palabra en memoria (tacceso_memoria=30 ns)
- tacceso_linea es el tiempo de actualización de una línea en memoria principal cuando debe reemplazarse
dicha línea en memoria cache. Como una línea está constituida por cuatro palabras, el tiempo de
actualización corresponde al del tiempo de un acceso burst a la memoria principal, es decir 6 + 1 + 1 + 1
= 9 ciclos de bus (tacceso_linea=9*5 ns =45 ns).
- preemplazo. Dado que habrá un reemplazo de línea en un 20% de los accesos a datos y que el 30% de las
instrucciones acceden a datos, para un programa de N instrucciones tenemos:

0.3 * N 0.3
preemplazo  0.2   0.2   0.046
N  0.3 * N 1.3

Sustituyendo los correspondientes valores, se tiene que

Tacceso = 0.9*1.0 ns + (1-0.9) * (1.0 ns + 30.0 ns +0.046 * 45.0 ns) = 4.207 ns

(b) Se puede estimar el ancho de banda del procesador teniendo en cuenta que, si se ejecutan N instrucciones en
el procesador, se realizarán (además de los N accesos para las instrucciones) 0.3N accesos para (leer/escribir)
palabras de datos. Por lo tanto,

Número de Palabras que se captan = N + 0.3N = 1.3N


El tiempo para ejecutar esas instrucciones en el procesador superescalar es, por término medio,

Tiempo de Ejecución en el Superescalar = (tciclo_procesador N)/b = 1.0N/b ns

donde b es el número de instrucciones por ciclo que ejecuta el procesador. El ancho de banda que requiere el
procesador es

1.3N
B procesador  b  1.3b( palabras / ns )
1.0 N

Para determinar el valor de b se iguala el ancho de banda del procesador y el ancho de banda que proporciona la
memoria, Bmemoria, que se obtiene a partir del tiempo de acceso medio a la memoria, calculado en el anterior
apartado Bmemoria = 1/4.207 (palabras/ns):

b = 1/(4.207*1.3) = 1/5.469 = 0.18

Como puede verse, b es menor que 1. Por lo tanto, el ancho de banda que proporciona la memoria no sería
suficiente ni siquiera para que el procesador pueda funcionar como procesador segmentado (ejecutando una
instrucción por ciclo).

En el caso de que la tasa de fallos de cache fuese del 95%, el tiempo de acceso medio a la memoria sería
(utilizando la misma expresión que en el apartado anterior):

Tacceso = 0.95*1.0+0.05*33.07 = 2.603

En este caso, el ancho de banda de la memoria es Bmemoria =1/2.603 = 0.38 (palabras/ns). Como se puede
observar, se ha producido una mejora de un factor de 1.61: un aumento de un 5% en la tasa de fallos ha
ocasionado una mejora de aproximadamente un 60% en el ancho de banda.

El valor de b aumenta, pero, en cualquier caso sigue siendo menor que la unidad:

b = 1/(2.603*1.3) = 0.295

Si queremos aprovechar las capacidades superescalares del procesador no habría más remedio que incrementar el
ancho de banda de la memoria. Una estrategia para conseguir ese incremento en el ancho de banda de la memoria
es incrementar el número de palabras que se traen desde la memoria cache interna en cada acceso a la misma (de
hecho, esta es la alternativa usual en los procesadores superescalares). Al estar la memoria cache integrada en el
mismo chip que el procesador, no hay problema por las posibles limitaciones en el número de terminales.

Si el procesador es capaz de ejecutar tres instrucciones por ciclo (b=3), el ancho de banda del procesador es
Bprocesador=1.3*3 palabras/ns = 3.9 palabras/ns. Para que el ancho de banda de la memoria sea igual, se
leerán/escribirán W palabras en cada acceso, donde:

3.9 (palabras/ns) = W/2.603 (palabras/ns)  W = 3.9 * 2.603 = 10.1 palabras  11 palabras

Si este número es demasiado elevado para la tecnología disponible, no habría más remedio que mejorar el tiempo
medio de acceso a la memoria (mayor tasa de aciertos, memorias más rápidas, etc.), o el rendimiento del
procesador se verá limitado por la memoria.

7 (Ejercicios de clase)
Tiene una aplicación de procesamiento de señal que debe repetir 3000 veces el cálculo a(i)= f(a(i),a(i+1),
a(i+2),a(i+3)) para cada muestra de la señal a(i) (i=1,..,220-3) que ocupa 4 bytes, y f() es una función
determinada. El código que permite implementar el cálculo está constituido por 12 instrucciones de 32 bits que
se repiten para cada muestra. De las instrucciones, 4 son de acceso a memoria para leer/escribir datos, 4 son
instrucciones de operaciones aritméticas, y 4 son de control del bucle, actualización de punteros, etc.
Suponga un computador que dispone de un procesador superescalar que funciona a 1 GHz. y que puede terminar
hasta 3 instrucciones por ciclo, con una memoria cache interna para datos y otra para instrucciones de 64 KBytes
cada una, mapeo directo, líneas de 32 bytes, y tiempo de acceso de un ciclo de reloj. La memoria cache de datos
utiliza política de actualización de post-escritura (write-back). La memoria principal de 256 MBytes tiene un
tiempo de acceso de 50 ns. y se conecta a través de un bus de 64 bits a 100 MHz. que utiliza ciclos burst 5-1-1-1
para transferir las líneas de cache.

Si la señal está almacenada en memoria a partir de la posición 0h, y el código está alineado con una línea de
cache:
(a) Realice una estimación del tiempo mínimo que tardaría en ejecutarse la aplicación.
(b) Si se utiliza un compilador que es capaz de reducir el número de instrucciones de acceso a memoria, (pasando
de 4 a 1 instrucciones de acceso a memoria por muestra) ¿Cuál sería ahora el tiempo mínimo estimado?.

Solución:
En primer lugar evaluaremos el tiempo que consumiría el procesador si funcionase a pleno rendimiento:

Número de Instrucciones  3000*220*12

Considerando 3 instrucciones/ciclo y una frecuencia de reloj de 109 ciclos/sg, se tiene que:

Tprocesador = (Número de Instrucciones)/((Instrucciones/ciclo)*(ciclos/sg))=


(3000*220*12)/(3*109) = 12.58 sg.

A continuación vamos a estimar el tiempo que requeriría el acceso a memoria, para ver si es menor que el del
procesador o no, ya que el mayor de los tiempos es el que nos permitirá estimar el tiempo mínimo de
procesamiento.

Faltas de cache:

- En el acceso al código se produce una primera falta, que se puede despreciar en el cómputo final de
tiempo (las debidas a los accesos a los datos son muchas más, como veremos).
- En el caso del acceso a los datos tenemos que el volumen de datos es aproximadamente de 4 Mbytes (220-
3 datos de 4 bytes cada uno), es decir 222/25 =217 líneas. La cache de datos tiene 64 Kbytes y las líneas
son de 32 bytes, el númer tiene 216/25=211 líneas.

Por lo tanto, como no cabe la señal entera en la cache, y dado que se va leyendo ordenadamente, se producirán
tantas faltas como líneas ocupa la señal, para cada acceso a la misma (cada una de las 3000 iteraciones).

El número de accesos a datos a los que da lugar el programa, por cada una de las 3000 iteraciones es:

Accesos a datos = 4*(220-3) 4*220

Por lo tanto la probabilidad de fallo es:

(1-a) = 217 /4*220 = 0.0313

y por lo tanto a = 1-0.0313 = 0.96875

Dado que hay reemplazo en todas los casos de falta excepto para las primeras 211 líneas, la probabilidad de
reemplazo es:

preemplazo= 1- (211/3000*217) = 0.99

Esto significa que el tiempo de acceso a memoria es:

tacceso  tcache  a  (tcache  tmemoria  preemplazo  treemplazo )  (1  a)


Por lo tanto:

tacceso= 1*0.96875 + (1+50+0.99*8*10)*0.0313= 5.04 nsg.

y el tiempo para acceder a todos los datos será:

Tmemoria= 4*3000*(220-3)*5.04  60.48 sg

b) Si el número de accesos pasa a ser 1, los tiempos pasarán a ser:

Tmemoria= 3000*(220-3)*5.04  60.48/4= 15.12 sg

Tprocesador = (9*220)/(109) = 9.4 sg.

Como vemos, sigue siendo la memoria la que más tarda, y la que mejor aproximaría el tiempo mínimo. No
obstante, como se puede comprobar, las diferencias entre los tiempos se han reducido bastante.

8 (Benchmark diciembre 2007)


Suponga que siguiente programa

for (i=0 ; i<n ; i++)


D(i)=A[i]+B[i]+C[i];

se ejecuta en un procesador superescalar de 32 bits a 2 GHz que puede terminar un máximo de 3 instrucciones
por ciclo, con una memoria caché interna para datos y otra para instrucciones, de 64 KBytes cada una, líneas de
32 bytes, mapeo asociativo por conjuntos de 4 vías, política de actualización de post-escritura (write-back), sin
asignación de caché en escritura (no write-allocate) y tiempo de acceso de un ciclo de reloj de CPU. La memoria
principal, de 512 MBytes, tiene un tiempo de acceso de 50 ns y se conecta a través de un bus de 64 bits a 200
MHz que utiliza ciclos burst 10-2-2-2 para transferir las líneas de caché. Las matrices que se suman tienen 220
elementos y el primer elemento de A está en la dirección 0x0800000, el primero de B en la dirección 0x1000000,
el primero de C en la dirección 0x1800000, y el primero de D en la dirección 0x2000000.

Realice una estimación lo más aproximada posible del tiempo mínimo que puede tardar en ejecutarse el
programa en este procesador.

Notas:
 Puede considerar que, como no hay asignación en escritura en la caché, las escrituras se harán directamente
en memoria principal y que dicha escritura puede hacerse concurrentemente a la ejecución del resto de
instrucciones, incluyendo las de carga de memoria dado que no hay instrucciones posteriores que utilicen los
componentes almacenados en memoria, también puede despreciar las faltas en la caché de instrucciones.
 También puede asumir que la política de asignación de línea dentro de un conjunto es la que proporciona
mejores resultados respecto a las colisiones).

Solución.
Para el caso en que el procesador no anule nunca la instrucción situada a continuación del salto, el código del
programa sería el siguiente:

(1) inicio: lw r11, 0(r1) ; r11 = a[i]


(2) lw r12, 0(r2) ; r12 = b[i]
(3) lw r13, 0(r3) ; r13 = c[i]
(4) add r14, r11, r12 ; r14 = a[i] + b[i]
(5) add r14, r13, r14 ; r14 = r14 + c[i]
(6) sw 0(r4), r14 ; d[i] = r14
(7) subi r5, r5, #1 ; n = n - 1
(8) addi r1, r1, #4 ; r1 apunta a a[i+1]
(9) addi r2, r2, #4 ; r2 apunta a b[i+1]
(10) addi r3, r3, #4 ; r3 apunta a c[i+1]
(11) bnez r5, inicio ; saltamos si n != 0
(12) addi r4, r4, #4 ; r4 apunta a d[i+1]

El número de instrucciones que se ejecutan es:

NI  12  N  12  2 20

Asumiendo que se van retirar tres instrucciones cada ciclo (sin atascos en el cauce), el valor de CPI sería:

1 ciclo 1
CPI  
3 instruccio nes 3

Por último, el tiempo de ciclo del reloj del procesador es:

1 1
TReloj  
2 GHz 2  10 9

Por tanto, suponiendo que se pueden retirar tres instrucciones por ciclo y que todos los datos e instrucciones se
pueden captar de las caches sin provocar faltas, el tiempo de ejecución sería el siguiente:

12  2 20
TCPU  NI  CPI  TReloj   0.002097s  2.097 ms
3  2  109

Sin embargo, como cada uno de los vectores ocupa un total de 4 × 220 = 222 bytes, y la cache sólo tiene 64 KB =
216 bytes, se producirán bastantes fallos en el acceso a la cache de datos que no se pueden despreciar. Todos estos
fallos serán de tipo compulsivo (la cache está inicialmente vacía) o por problemas de la capacidad de la cache,
pero no se van a llegar a producir fallos por conflicto entre diferentes accesos, ya que en el peor caso, en el que al
leer los tres vectores se produzcan tres faltas sobre líneas asociadas al mismo conjunto, no habrá conflicto, ya
que cada conjunto tiene cuatro líneas. Por tanto, teniendo en cuenta que cada línea de cache tiene un tamaño 32
bytes, y que el primer elemento de cada vector está alineado al comienzo de una línea de cache, el total de fallos
en el acceso a la cache de datos será de:
3 vectores  2 22 bytes/vect or
FDatos  5
 3  217
2 bytes/líne a

Por tanto, la tasa de fallos de la cache de datos es de:

3  217
f Datos   2 3  0.125
3 vectores  2 lecturas/vector
20

Por lo que la tasa de aciertos es de:

aDatos  1  f Datos  1  0.125  0.875

Como todas las escrituras se realizan directamente en memoria y concurrentemente con las lecturas, no habrá que
hacer reemplazos, por tanto, el tiempo medio de lectura de los datos será de:

t lectura  aDatos  t cache  1  aDatos   t cache  t memoria   0.875  0.5  0.125  0.5  50  6.75 ns

Por tanto, el tiempo total necesario para leer todos los datos será:

     
Tlectura  t lectura  3  2 20  6.75  109  3  2 20  0.021s  21 ms
9 (Examen febrero 2007)
Considere que el siguiente bucle:

for i=1 to N do X[i] = a*Y[i]; X[i], Y[i] y a son números en coma flotante

se ejecuta en un procesador superescalar de 32 bits a 1 GHz que puede terminar un promedio de instrucciones por ciclo tal
que el tiempo de ejecución está limitado por el tiempo de acceso a los datos. El computador tiene una memoria caché
interna para datos y otra para instrucciones de 64 KBytes cada una, líneas de 32 Bytes, mapeo directo, política de
actualización de post-escritura (write-back), con asignación de caché en escritura (write-allocate), y tiempo de acceso de un
ciclo de reloj de CPU. La memoria principal de 512 MBytes tiene un tiempo de acceso de 50 ns y se conecta a través de un
bus de 64 bits a 100 MHz que utiliza ciclos burst 5-1-1-1 para transferir las líneas de caché.

(a) ¿Cuál sería el código escalar para una arquitectura LOAD/STORE que implemente la secuencia de instrucciones
vectoriales anterior?
(b) Si el array que se multiplica por el escalar tiene N=1024 elementos, ¿cuánto tarda en ejecutarse el programa?

NOTA: Considere la situación más favorable respecto a la ubicación de los arrays en memoria principal y su
correspondencia en caché.

Solución.
Si se desea implementar el fragmento de código del enunciado en un procesador escalar, el código podría ser así:

lf f0, a ; Cargamos la constante a


add r1, r0, r0 ; Inicializamos el índice i=0
lw r2, N ; Tamaño del vector en elementos
slli r2, r2, #2 ; Multiplicamos por 4 para obtener el tamaño del vector en
; bytes. Cada elemento ocupa 32 bits (4 bytes)
bucle: lf f2, Y(r1) ; Cargamos X(i)
multf f4, f0, f2 ; Multiplicamos Y(i) por a
sf X(r1), f4 ; Guardamos el resultado
addi r1, r1, #4 ; Pasamos al siguiente elemento
sub r3, r1, r2 ; Comprobamos si hemos acabado
bnez r3, bucle ; Saltamos si quedan elementos

En el enunciado se afirma que el tiempo de ejecución de este fragmento de código está limitado por el tiempo
que se tarda en acceder a los datos. Este tiempo dependerá de la ubicación de los datos en la memoria principal.
Como se nos indica que consideremos la ubicación más favorable, asumiremos que el primer dato de cada vector
está alineado a una frontera de 32 Bytes, de forma que se ocupen el menor número de líneas, y que los vectores
X e Y están almacenados en posiciones de memoria tales que la correspondencia directa de la memoria cache los
llevará a líneas diferentes. De esta forma sólo se producirán fallos de cache cada vez que se acceda a una línea
diferente de la cache de datos.

Como el procesador es de 32 bits, asumimos que cada elemento del vector ocupa 4 Bytes, por tanto, si cada
vector tiene N = 1024 elementos, ocupará 4 KB de memoria. La ubicación que hemos supuesto más arriba
implica que sólo se cometerá un fallo de cache cuando se intente leer o escribir un dato de una línea que no haya
sido llevada a cache, con lo que el número de fallos a la cache de datos en el acceso a un vector se puede calcular
como:

Tamaño del vector 4 KB


f vector    128
Tamaño de línea 32 B

Además de para leer los elementos del vector Y, como la cache realiza asignación en escritura (write-allocate),
cada vez que se intente escribir un elemento de X y no esté en cache se traerá una línea de elementos de X. Por
último, también hay que cargar las variables a y N, que supondremos que están las dos en otro línea de cache, lo
que añadirá un fallo más a los fallos que se produzcan en la manipulación de los vectores. Por tanto, el total de
fallos de la cache de datos es de:

f totales  2  f vector  1  257


Se accede a los 1024 elementos de cada vector más a las variables a y N, por lo que el número total de accesos a
datos es:

atotales  2 1024  2  2050

Por tanto, las tasas de fallos y aciertos se pueden calcular como:

f totales 257
tfallos    0,125 taciertos  1  tfallos  0,875
atotales 2050

Suponiendo que se tarda 1 ciclo de CPU en acceder a la cache, el tiempo medio de acceso a un dato es:

Tacceso  taciertos  Tcache  1  taciertos  Tcache  Tmemoria   0,8751  1  0,875 1  50  7,25 ns

Por lo que el tiempo total de acceso a datos sería, o lo que es lo mismo, el tiempo de ejecución del programa en
el procesador superescalar es de:

Tmemoria  Tacceso  atotales  7,25 2050  14862,5ns

10 (Examen febrero 2006)


Tiene una aplicación de procesamiento de señal que debe realizar el cálculo del valor medio de las muestras de
una señal a(i) (i=1,…,N):

for i=1 to N do s = (s*(i-1)+a(i))/i;

donde s se inicializa a 0; cada una de las muestras ocupa 4 bytes y N=219. El código que permite implementar el
cálculo está constituido fundamentalmente por un bucle con 7 instrucciones de 32 bits: una de ellas es de acceso
a memoria para leer datos, 3 son instrucciones de operaciones aritméticas, y 3 son de control del bucle,
actualización de punteros, etc.
Suponga un computador que dispone de un procesador superescalar que funciona a 1 GHz. y que puede terminar
hasta 2 instrucciones por ciclo, con una memoria caché interna para datos y otra para instrucciones de 64 KBytes
cada una, líneas de 128 bytes, mapeo directo, política de actualización de post-escritura (write-back), y tiempo de
acceso de un ciclo de reloj de CPU. La memoria principal de 512 MBytes tiene un tiempo de acceso de 50 ns y
se conecta a través de un bus de 64 bits a 100 MHz. que utiliza ciclos burst 5-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1 para
transferir las líneas de caché.
(a) Realice una estimación del tiempo mínimo que tardaría en ejecutarse la aplicación.
(b) Realice la misma estimación si modifica el código para aplicar un desenrollado de orden 2 sobre el bucle
anterior (ahora, en cada iteración tiene que calcular (s*(i-1)+a(i)+a(i+1))/(i+1), el número de instrucciones de
acceso a memoria es 2, el de operaciones aritméticas 4, y el de actualizaciones de punteros y control del bucle 4).
(c) Repita el apartado (a) suponiendo que el procesador es capaz de terminar 3 instrucciones por ciclo. Compare
las estimaciones de los tres apartados (a), (b), y (c) y extraiga conclusiones.
(NOTA: Suponga que la señal está almacenada en memoria en posiciones consecutivas comenzando en una
posición alineada con una línea de caché)

Solución.
Teniendo en cuenta la descripción del procesador y del programa, en condiciones ideales, suponiendo una
arquitectura de memoria que pudiera suministrarnos tantos datos e instrucciones como el procesador necesite, y
que no se va a producir ningún tipo de riesgo que pueda atascar el cauce del procesador, el tiempo mínimo de
ejecución del programa sería:

219 iteraciones  7 instrucciones / iteración


T proc   0,001835 s  1,835 ms
2 instrucciones / ciclo  10 9 ciclos / segundo
Ahora habrá que ver si la arquitectura de memoria es capaz de suministrarnos todos los datos e instrucciones que
necesitamos en ese tiempo. Para empezar, el programa consiste en 7 instrucciones, es decir, 28 bytes de código
que se pueden alojar en una línea de la cache de instrucciones al principio de la ejecución. Una vez allí, cada
instrucción se podrá captar en un ciclo de reloj, con lo que no producirá ningún retardo. Por tanto, la penalización
en la lectura de las instrucciones consistirá en una falta en la cache de instrucciones, que se puede despreciar, ya
que en los accesos a datos se producen muchas más, como veremos más adelante.

El programa tiene que leer 219 datos de 4 bytes cada uno. Esto hace un total de 221 bytes de datos, que no caben
en una cache de datos de 64 KB = 216 bytes. Así que si suponemos que el primer dato está alineado con una línea
de cache y la cache de datos está inicialmente vacía, se producirán tantos fallos como líneas de datos:

2 21 bytes de datos
Fallos de datos   214 líneas de datos
2 7 bytes / línea
Por tanto, la tasa de fallos de cache será:

214 fallos de datos


f   0,03125
219 accesos de datos

Y la tasa de aciertos:

a  1  f  0,96875

Como no hay escrituras en memoria, no se producen reemplazos de líneas de cache, por tanto, el tiempo medio
para acceder a un dato en memoria sería:

Tacc  a  Tcache  1  a   Tcache  Tmem   0,96875 1  0,03125 1  50  2,5625 ns

Como hay que leer 219 datos, el tiempo total será:

Tdatos  2,5625 ns/dato 219 datos  1,343488 ms

Como el tiempo de acceso a datos es menor que el tiempo mínimo de procesamiento, el programa tardaría en
ejecutarse más de 1,835 ms, es decir, que el tiempo de ejecución estaría limitado por el procesador.

Si se desenrollara el bucle, iteraría la mitad de veces, por tanto, el tiempo mínimo que tardaría en ejecutarse en el
procesador sería:

218 iteraciones  10 instrucciones / iteración


T proc   0,00131 s  1,31 ms
2 instrucciones / ciclo  10 9 ciclos / segundo

Esta mejora software ha conseguido que ahora el tiempo de ejecución del programa esté limitado por el acceso a
datos, es decir que la cota mínima para su tiempo de ejecución sea de 1,34 ns en vez de 1,835 ns.

Otra posibilidad para mejorar el tiempo de mínimo de procesamiento es cambiar el procesador por otro más
rápido. Si se introdujera el código sin desenrollar en un procesador capaz de procesar una instrucción más por
ciclo, el tiempo mínimo de procesamiento sería:

219 iteraciones  7 instrucciones / iteración


T proc   0,001223 s  1,223 ms
3 instrucciones / ciclo  10 9 ciclos / segundo

De nuevo el tiempo de ejecución vuelve a estar limitado por el acceso a datos. Para concluir, podemos destacar
que si el tiempo de ejecución está limitado por el tiempo de procesamiento, siempre se puede mejorar
optimizando el código o cambiando el procesador por uno más rápido. Si por el contrario el tiempo de ejecución
está limitado por el acceso a datos, la mejora del tiempo de ejecución es más complicada, porque habría que
aumentar el ancho de banda con la memoria, y como cambiar el ancho de los buses o su tiempo de ciclo está
fuera de nuestro alcance, la única solución sería intentar que la tasa de aciertos en cache sea mayor. Para
ejemplos que procesen datos temporales, se puede reescribir el código usando algunas técnicas de optimización
como blocking, arrays de estructuras o estructuras de arrays, pero para un programa como el que nos ocupa, con
datos no temporales pero con un patrón de accesos conocido y sencillo, la única solución sería usar instrucciones
de precaptación con una anticipación suficiente para que los datos estuvieran en cache cuando haya que
accederlos, siempre que el procesador las implemente este tipo de instrucciones.

11 (Examen febrero 2008)


Se dispone de un procesador superescalar que funciona a 2 GHz. y que puede terminar hasta 3 instrucciones por
ciclo, con una memoria cache interna para datos y otra para instrucciones de 64 KBytes cada una, líneas de 32
bytes, mapeo directo, política de actualización de post-escritura (write-back), y tiempo de acceso de un ciclo de
reloj de CPU. Dicho procesador está conectado mediante un bus de 64 bits a una memoria principal de 512
MBytes que tiene un tiempo de acceso de 40 ns. La frecuencia del bus es de 200 MHz y las transferencias de las
líneas de cache se realizan mediante ciclos burst 8-1-1-1.

En el computador descrito se pretende ejecutar una aplicación de procesamiento de señal que debe realizar el
cálculo del valor medio de las muestras de una señal A = {a[i], i=0,…, N – 1} mediante el siguiente algoritmo:

for (i=0,s=0 ; i<N ; i++) s=(s*(i–1)+a[i])/i;

en el que cada una de las muestras ocupa 4 bytes y N=219. El código que implementa el cálculo está constituido
fundamentalmente por un bucle con 7 instrucciones de 32 bits: una es de acceso a memoria para leer datos, 3 son
operaciones aritméticas, y 3 son de control del bucle, actualización de punteros, etc.

a) Realice una estimación del tiempo mínimo que tardaría en ejecutarse la aplicación.
b) Realice la misma estimación si modifica el código para aplicar un desenrollado de orden 2 sobre el bucle
anterior (ahora, en cada iteración tiene que calcular (s*(i-1)+a[i]+a[i+1])/(i+1), el número
de instrucciones de acceso a memoria es 2, el de operaciones aritméticas 4, y el de actualizaciones de
punteros y control del bucle 4).
c) Repita el apartado (a) suponiendo que el procesador es capaz de terminar 4 instrucciones por ciclo.
d) Compare las estimaciones de los tres apartados (a), (b), y (c) y extraiga conclusiones.

NOTA: Puede suponer que la señal está almacenada en memoria en posiciones consecutivas comenzando en una
posición alineada con una línea de cache.

Solución.
Teniendo en cuenta que el programa está compuesto por 7 instrucciones y que debe ejecutar 2 19 iteraciones, que
el procesador puede ejecutar tres instrucciones por ciclo, y que la frecuencia de reloj es de 2 GHz, si no ocurriera
ninguna falta en la cache de datos durante la ejecución del programa, se obtendría con la siguiente expresión:

7  219
 
1  1 
TCPU  NI  CPI  TReloj  7  219         6,117  10 -4 s  611,7 μs
  
3 2  10 9
 3  2  10 9

Como cada instrucción ocupa 32 bits, el programa completo ocupa un total de 28 bytes, es decir, menos de una
línea de cache. Por tanto, teniendo en cuenta que hay caches separadas para datos e instrucciones, en toda la
ejecución del programa se produciría una única falta en la cache de instrucciones para traer la línea que contiene
el programa, por lo que a la expresión anterior hay que sumarle el tiempo que se tarada en traer esa línea a la
cache de instrucciones:

ciclos de bus 8 111


Tlínea    55 ns
frecuencia del bus 200  10 6

Por tanto, el tiempo total dedicada al procesamiento de instrucciones sería de:

Tinstruccio nes  TCPU  Tlínea  611,755 μs

Sin embargo, como inicialmente el vector está en memoria principal, se cometerán bastantes fallos en el acceso a
la cache de datos que se deben tener en cuenta. Como el tamaño de las líneas de cache es de 32 Bytes, se
producirán un total de fallos de:
Tamaño datos N elementos  4 Bytes 219  4
Fdatos     216
Tamaño línea de cache 32 Bytes 32

Por tanto, la tasa de fallos de la cache de datos será:

Fdatos F N 4
f datos   datos   0,125
Total de accesos N N  32

y la tasa de aciertos:

adatos  1  f datos  0,875

Una vez calculadas estas tasas, se puede obtener el tiempo medio de acceso a un dato como:

t dato  adatos  t cache  1  adatos   t cache  t memoria   0,875 0,5 ns  0,125 0,5  40 ns  5,5 ns

Y el tiempo total de acceso a todos los datos será de:

Tdatos  N  t dato  219  5,5 ns  2,883 ms

Una vez calculados los tiempos de ejecución de instrucciones y de acceso a datos, el tiempo de ejecución del
programa complete se obtiene como:

Tejecución = máx (Tdatos, Tinstrucciones) = Tdatos = 2,883 ms

En el caso de que se desenrolle el bucle, el programa estará compuesto por 10 instrucciones (40 Bytes, 2 líneas
de cache) que iterarán N / 2 iteraciones. Por tanto, el tiempo de ejecución de las instrucciones sería:

Tinstruccio nes 

10  219 2  2  Tlínea  437,01μs
3  2  109

El tiempo de acceso a datos es el mismo, por lo tanto, el tiempo de ejecución del programa no varía.

Por último, si el procesador fuera capaz de terminar cuatro instrucciones por ciclo, las instrucciones del programa
original (sin desenrollar) tardarían:

7  219
Tinstruccio nes   Tlínea  458,807μs
4  2  109

Pero el tiempo de acceso a datos sigue manteniéndose igual, por lo que el tiempo de ejecución del programa no
varía.

Como conclusión de estos tres apartados podemos decir que da igual que se desenrolle el bucle o que se cambie
la frecuencia del procesador, ya que el tiempo de ejecución del programa está limitado por el acceso a datos del
sistema.
10.- Se dispone de una aplicación de procesamiento de señal que debe repetir 3000
veces el cálculo a(i )  f (a(i ), a(i  1), a(i  2), a(i  3)) para cada muestra de señal
a(i)(i  1,....,220  3) que ocupa 4 bytes, y f () es una función determinada. El
código que permite implementar el cálculo está constituido por 12 instrucciones
de 32 bits que se repiten para cada muestra. De las instrucciones, 4 son de acceso a
memoria para leer/escribir datos, 4 son instrucciones de operaciones aritméticas, y
4 son de control del bucle, actualización de punteros, etc.
Estimar el tiempo mínimo que tardaría en ejecutarse esta aplicación (suponemos
que no hay fallos de caché para instrucciones o datos) en los siguientes
microprocesadores.
MIPS r10000
UltraSPARC III 600 MHz
Alpha 21264 450 MHz
Ultra Sparc

1ciclo
Ciclos de Acceso a Memoria: 4instrucciones  2ciclos
2instrucciones

1ciclo
Ciclos de Instrucciones Aritméticas: 4instrucciones  1  2ciclos
3instrucciones

1ciclo
Ciclos de Control y Actualización: 4instrucciones  4ciclos
1instrucción

1
tmin  8ciclos * 3000  40 s
6 *108
Alpha

1ciclo
Ciclos de Acceso a Memoria: 4instrucciones  1ciclo
4instrucciones

1ciclo
Ciclos de Instrucciones Aritméticas: 4instrucciones  2ciclos
2instrucciones

1ciclo
Ciclos de Control y Actualización: 4instrucciones  4ciclos
1instrucción

1
tmin  7ciclos * 3000  28s
7.5 *108

Potrebbero piacerti anche