Sie sind auf Seite 1von 19

Capítulo 4: Conexión procesador-memoria

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 = 216 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

6 4 ( K b y te s / c a c h e ) 2 16 (b y te s / c a c h e )
 7  2 9 ( lin e a s / c a c h e )
1 2 8 (b y te s / lin e a ) 2 (b y te s / lin e a )

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
25

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

16
asociativa donde se introducen los campos de marca.

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 2 9 = 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 2 13 = 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-a 2), 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 (2 6=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  a cachet cache  (1  a cache )(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: t memoria=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  a cache t cache  (1  a cache )(t cache  t memoria  p reemplazo .t linea )

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 (t linea=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 )(t acceso _ cache  tacceso _ memoria  preemplazo .t acceso _ 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,..,2 20-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 2 11 líneas, la
probabilidad de reemplazo es:

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

Esto significa que el tiempo de acceso a memoria es:

t a c c e s o  t c a c h e  a  ( t c a c h e  t m e m o r ia  p r e e m p la z o  t r e e m p la z o )  ( 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 2 20 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 instrucciones 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.002097 s  2.097 ms
3  2  10 9

Sin embargo, como cada uno de los vectores ocupa un total de 4 × 2 20 = 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/vector
FDatos  5
 3  217
2 bytes/línea

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:

a Datos  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  a Datos  t cache  1  a Datos    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.021 s  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,5 ns

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=2 19. 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 2 21 bytes de datos,
que no caben en una cache de datos de 64 KB = 2 16 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,00131s  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
 7  2      
1  1 
TCPU  NI  CPI  TReloj 19
9 
  6,117  10 -4 s  611,7 μs
 3   2  10  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:

Tinstrucciones  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:

a datos  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:

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

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  10 9

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.

Das könnte Ihnen auch gefallen