Imprimir Arqui 1
Imprimir Arqui 1
computadoras
Final
2021
Índice
Ejercicio integrador: 3
Final 1 PL 10
Pipeline y speedup 11
A) Pipeline de 5 etapas ⇒ F D E M WB 11
Memoria virtual 14
Memoria virtual 18
Ejercicio memoria virtual 18
Matrices 21
Ejercicio de matriz 21
For 24
Reloj / CPI / Frecuencia 28
Coloquio Ejercicio 1 38
Ejercicio 2 42
Ejercicio 3 43
2
Ejercicio integrador:
Suponiendo el siguiente escenario:
• Direccionamiento al byte.
• Dirección física de 16 bits y dirección lógica de 24 bits
• Memoria virtual implementada con paginación. Los últimos 8 bits de la
dirección representan el desplazamiento dentro de la página → tamaño
del offset.
• Memoria caché física, 2-way set associative, con 8 líneas de 32 bytes
de datos, implementada con políticas de escritura writeback y
write-allocate y reemplazo LRU.
- writeback es política de escritura cuando esta en caché
- write-allocate es política de escritura cuando NO está en cache
Si se cuenta con el fragmento de memoria principal del cuadro 1, que
comienzan en la dirección lógica 010800H y es un texto de 640
caracteres ASCII, un TLB de solo 4 entradas inicializado como indica el
cuadro 2 y una caché física inicializada como indica el cuadro 3.
1. ¿Cuál es el tamaño en bytes de cada página? ¿En cuántos frames se
puede dividir como máximo el espacio de direccionamiento físico?
¿Cuántas páginas tiene el espacio de direccionamiento lógico?
3
Cuadro 3, bit D. Es el dirty bit. Esto indica que modificaste esa línea de cache, lo que implica es que no es
igual a lo que tenes en memoria principal.
1. ¿Cuál es el tamaño en bytes de cada página? ¿En cuántos frames se puede dividir como
máximo el espacio de direccionamiento físico? ¿Cuántas páginas tiene el espacio de
direccionamiento lógico?
Paginación:
- Tamaño de página en bytes: 2^(offset)
- Los últimos 8 bits de la dirección representan el desplazamiento dentro de la página (offset)
- → tamaño de página en bytes: 2^(8) = 256 Bytes
2. ¿En cuántas páginas se dividiría el fragmento de texto? Indique y calcule qué cambiaría si el texto
estuviera codificado en UTF-32, donde cada carácter ocupa 32 bits.
Datos:
- 640 caracteres ASCII → cada carácter ASCII ocupa 1 byte
- 640 caracteres x 1 byte = 640 bytes ocupa todo el texto
640 bytes de texto / 256 bytes tamaño de página = 2.5 páginas → redondeo a 3 páginas
Datos:
- 640 caracteres UTF-32 → cada caracter UTF-32 ocupa 32 bits
- 640 caracteres x 4 bytes (32 bits) = 2560 bytes ocupa todo el texto
Datos de la caché:
- S (tamaño de caché) = L x C = 256 Bytes
- L (tamaño de línea) = 32 Bytes
- m (grado de asociatividad) = 2
- C (cantidad de líneas de caché) = 8 bytes
Luego,
- Offset: log2 (32 bytes) = 5 bits
- Index: log2 (8 lineas / 2) = 2 bits
- Tag: 16 - 5 - 2 = 9 bits
- Tamaño de dirección (física): 16 bits
A memoria cache física siempre se accede con la dirección física, para esto, dada una determinada
instrucción generada por el CPU (dirección lógica) tendríamos que pasar por el TLB para realizar el mapeo de
la dirección, esto es, cambiar el numero de pagina por el numero de frame y mantener el offset, de esta
manera obtenemos la dirección física para acceder a cache.
Tomamos los primeros cuatro valores de la dirección lógica y chequeamos si se corresponde con alguna
entrada del TLB. Comprobamos que sí, y traducimos 0108H a 14H. Formamos la dirección final (dirección física
= 1402H) y la convertimos a binario (010100000000102).
Con la dirección en binario, obtenemos el tag, el index y el offset, con la cantidad de bits calculados
previamente.
Luego, con el index chequeamos a que set pertenece de la caché y pasamos el tag a octal (508). Con el valor
del tag en octal, miramos si ese valor está almacenado en caché y si su información es válida (el bit V este en
1). Si todo esto se verifica, nos desplazamos la cantidad de bits que indique el offset, 3 bits en este caso en
particular.
Como último, comprobamos a qué bit de la línea de caché queda apuntando el offset (en la instrucción 1,
apunta al bit ‘u’).
5
● Para la instrucción 2: R2 ← Mem[010822H] R2 = ‘ e ‘
Dirección física
| Nro. de frame | offset |
11 bits 5 bits
00010100001 00010
Nosotros tenemos una memoria principal y queremos acceder a ella. Además, cada línea ocupa 32 bytes (2
oraciones). 32 en decimal, equivale a 20 en hexadecimal. Por este motivo, las líneas van pasando de 20 en
20.
Cuando queremos acceder a memoria tomamos la dirección en hexa y le sumamos y el desplazamiento.
Ejemplo → 010822 buscamos el 10820 (el inicio de la línea) y sumamos 2 de desplazamiento para llegar al bit
solicitado.
14 45 H → 000101000 10 00101B
tag index offset
50 en octal es 28 hexadecimal.
0108H → 28H 28 45H = 001010000 10 00101B
6
TLB
0108H 28H 1
0109H B1H 0b
010AH A1H 0
0109H 5EH 1
Para obtener la clave-valor para la nueva entrada del TLB, tomamos el tag de la caché que está en octal y lo
convertimos a hexadecimal. Es decir, el paso inverso. Luego a eso, le concatenamos el resto de la dirección
de memoria (quedaría 28 45H).
Para la instrucción 3: formamos la dirección en hexa con la entrada del TLB (14 45H), la pasamos a binario
(0101000 10 00101B). Obtenemos el tag, index y offset. El tag lo pasamos a octal (0508). Luego, para
reemplazar en el TLB, transformamos el tag a hexadecimal nuevamente (508 → 28H) y armamos la nueva
entrada del TLB.
0108H 28H 1b
Entonces buscamos en MP, accedemos a la dirección 010913H , esto es, acceder al “bloque” 010900 y
desplazarte 13H posiciones, en decimal serían 19 posiciones y por lo tanto caemos en el carácter “a”
Ahora reemplazamos ese carácter por “$”.
Finalmente nos quedaría actualizar la memoria caché y luego el TLB.
Luego, antes de traer la dirección de MP y reemplazarla por lo que hay en la línea way 1 del set 0 de caché.
Como esa línea fue modificada anteriormente (D = 1) entonces hay que llevarla a MP. Para esto, pasamos el
tag = 3278 a hexadecimal, quedaría D7H y ahora armamos la dirección lógica: 0109D7H
Cómo 0109D7H está dentro del rango de 0109C0H y 0109E0H reemplazamos esa linea en memoria principal.
7
Cache Way 0 Way 1
Set Tag 0 V Data 0 D Tag 1 V Data 1 D U
En la dirección original de la línea que trajimos, la modificamos por la que estaba en caché
→ a_vista;_pido_a_mi_Dios_que_me
TLB
0108H 28H 1
0109H B1H 0b
010AH A1H 0
0109H BCH 1
BC 83 H → 101111001 00 00011
tag = 5718 index=0
8
● Para la instrucción 6: R3 ← Mem[0108D2]
Tenemos un hit en el TLB, pero tenemos un miss en la caché cuando indexamos y buscamos el tag. Por lo
cual, hay que ir a memoria.
R4 = ‘_’
Tenemos un hit en el TLB, pero tenemos un miss en la caché cuando indexamos y buscamos el tag. Por lo
cual, hay que ir a memoria.
;;;;;;
Con la información original y/o modificada, se produce un miss en el TLB. Ya que su bit de validez está en
cero.
En estos casos, hay que ir con la dirección a la tabla de páginas y dejar que se encargue el sistema operativo
(ya que nosotros la tabla de páginas no la conocemos)
6. Si los accesos a memoria caché exitosos (o determinar que hay un fallo) demoran 1 ciclo y los
accesos a memoria principal para leer o escribir un bloque demandan 100 ciclos, ¿cuánto demora la
etapa Memory en cada una de las instrucciones anteriores?
Instruccion 1: 1 ciclo (hit)
Instrucción 2: 1 ciclo (miss) + 100 ciclos para leer el dato = 101 ciclos
Instrucción 3: 1 ciclo (miss) + 100 ciclos para leer el dato = 101 ciclos
Instrucción 4: 1 ciclo (miss) + 100 ciclos para leer el dato + 100 ciclos para escribir en MP = 201 ciclos
Instrucción 5: 1 ciclo (miss) + 100 ciclos para leer el dato = 101 ciclos
Instrucción 6: 1 ciclo (miss) + 100 ciclos para leer el dato = 101 ciclos
Instrucción 7: 1 ciclo (miss) + 100 ciclos para leer el dato = 101 ciclos
Instrucción 8: 1 ciclo (miss) + 100 ciclos para leer el dato = 101 ciclos
En total: 1 + 101 + 101 + 201 + 101 + 101 + 101 + 101 = 808 ciclos
9
Final 1 PL
Cache 4-way set associative:
- Cada conjunto tiene 4 líneas.
- Cada conjunto tiene 3 bits, B0,B1 Y B2.
¿Las 4 líneas del conjunto son válidas?
- Si
- ¿B0 = 0?
- Si. Entonces L0 o L1 son las menos usadas recientemente. ¿B1 = 0?
- Si. Reemplazo L0.
- No. Reemplazo L1.8
- No. Entonces L2 o L3 son las menos usadas recientemente. ¿B2 = 0?
- Si. Reemplazo L2.
- No. Reemplazo L3.
- No. Reemplazó la línea inválida.
1. Los bits B0, B1 y B2 sirven para saber qué línea es la menos utilizada recientemente. En particular el
bit B0 indica en qué par de líneas se encuentra la línea menos utilizada recientemente, ya sea el par
L0,L1 o el par L2,L3. Una vez que obtenemos el par, los bits B1 y B2 nos indican que línea exacta es
la menos utilizada recientemente para poder reemplazarla.
1) A) Pipeline de 5 etapas ⇒ F D E M WB
● BRANCH, el porcentaje de branches se multiplica por 20%, porque el 20% de las predicciones fallan,
y se multiplica por 3, porque el PC se actualiza en memory (se pierden 3 ciclos, FETCH, DECODE Y
EXECUTE).
F D E M WB
F D E -
F D - (se pierden 3 ciclos)
F -
F
● JUMPS, el porcentaje de jumps se multiplica por 3 porque el PC se actualiza en la etapa memory (se
pierden 3 ciclos, FETCH, DECODE Y EXECUTE) (no vamos a tener fallos de predicción porque los
jump son saltos incondicionales, entonces salta siempre, se multiplica por 100%).
F D E M WB
F D E -
F D - (se pierden 3 ciclos)
F -
F
La suma de todo esto, nos va a permitir saber el porcentaje de ciclos que se pierden (ciclos stall)
11
Ciclos de Stall:
- 30% load * X% * 2 = 0.6 * X%
- 10% branches * 20 % * 3 = 0.06
- 2% jumpss * 100% * 3 = 0.06
----------------------------------------
0,6 * X% + 0.06 + 0.06 = 0.6 * X% + 0,12
b)
Al agregar forwarding en las instrucciones que utilicen load, vamos a obtener el dato en la etapa de Memory
access (Mem) en vez de en la etapa Writeback (WB), por lo tanto se necesita un ciclo menos de Stall en
comparación al inciso a)
Como se adelanta a la etapa de Decode la resolución de los jumps, se pierde solo 1 ciclo (fetch)
En los análisis anteriores se calculó el speedup de los sistemas A y B en comparación a un sistema sin
pipeline, pero el speedup es una medida de ganancia obtenida por mejorar un sistema. Si el sistema B es una
mejora del sistema A el speedup de esta mejora es:
Versión 2022
12
2)
cambia el inciso b:
En este caso, además, se adelanta a la etapa de Execute la resolución de los branch, por ende se descartan
2 instrucciones (o ciclos) en vez de 3 como en el punto anterior.
Ciclos de stall:
- 30% load * 21,6% * 1 = 0.068
- 10% branches * 20 % * 2 = 0.04
- 2% jumpss * 100% * 1 = 0.02
---------------------------------------------------------------
0,0648 + 0,04 + 0,02 = 0,1248
Luego:
1*5
𝑆𝑝𝑒𝑒𝑑𝑢𝑝 = 1 + 0,1248
= 4, 445
13
Memoria virtual
DATOS:
- tamaño de páginas = 2048 B → bloques de memoria de MS (memoria secundaria)
- tamaño de frames = 2048 B → bloques de memoria de MP
- tamaño frame = tamaño página
Cantidad de páginas que ocupa = (1376 caracteres * 2 B + 344 caracteres * 4 B) / 2048 ( ← tam. pag)
= 2.01 ⇒ 3 páginas
14
d) número de frame = dirección física - offset
número de frame = 18 bits - 11 bits
número de frame = 7 bits
Tamaño de la tabla de páginas = (número de frame + BITS EXTRA) x cantidad pág
= (7 + 5) x 8192 páginas
= 98304 bits → 12288 Bytes
Uno de los inconvenientes es que la tabla de páginas se sitúa en memoria ram y ocupa espacio, y
todas las dirección lógicas deberían acceder al menos una vez para poder recuperar la dirección física
del frame. Entonces al implementarla dentro de la ram, tenemos esos costes de accesos a memoria
principal afectando gravemente a la performance del sistema, entonces la solución sería tener una
caché, separada de la memoria ram, llamada TLB que ayuda a tener las últimas direcciones utilizadas
siguiendo el funcionamiento de una caché típica. (Temas de políticas y demás).
El TLB básicamente es una memoria caché específica para almacenar una parte de la tabla de
páginas.
15
4)
Datos:
- Branch se resuelve en Execute cuenta con predicción de branchs en etapa Decode
- NT/PNT: 0 ciclos
- T/PT: 1 ciclo
- NT/PT, T/PNT: 2 ciclos
16
ciclos stall = % de instrucciones qué son branch * (%de branch qué resultan en NT/PT, T/PNT * 2 + %
de branch qué resultan en T/PT * 1) * 1 + Ciclos stall de las demás instrucciones
Datos que necesito:
% de branches totales, % branches que se predicen erróneamente (NT/PT y T/PNT) y % branches
que se predicen correctamente (T/PT)
b. Datos:
CPIBASE = 1.2
20% de las instrucciones son branchs 65 % son tomados, 35% no tomados
predice erróneamente 12% de las veces, el 88 % predice correctamente
NT/PNT: 0
T/PT: 0.88 * 1 * 0.65 = 0.572
NT/PT: 0.12 * 2 * 0.35 = 0.084
T/PNT: 0.12 * 2 * 0.65= 0.156
NT/PNT: 0
T/PT: 0.88 * 2 * 0.65 = 1.144
NT/PT: 0.12 * 3 * 0.35 = 0.126
T/PNT: 0.12 * 3 * 0.65= 0.234
Speedup = 2.374/2.501
= 0.949 → La razón de mejora es de 0.949
17
Memoria virtual
Datos:
- Direcciones virtuales: 25 bits
- Direcciones físicas: 22 bits
- Tamaño de página: 216 bytes ⇒ 65536 bytes ⇒ 64KB
- Cada entrada de la tabla de páginas contiene el número de frame + bit de valido + bit de dirty
Luego
Tamaño de la tabla de páginas = (6 bits + 2 bits(válido y dirty)) x 512 páginas
= 4096 bits
b.
antes: 65536 bytes
ahora: tamaño de página = 16KB ⇒ 16384 Bytes
Como se reduce el tamaño de página debe aumentar la cantidad de páginas, esto implica tener que
aumentar la cantidad de entradas en la tabla de página, para lo cual se requiere mayor cantidad de
hardware y aumenta el costo.
Respuesta 2022
Lo que variaría es como lo dividis. Tenes un offset más chiquito. Vas a tener más páginas. Usa una tabla de
páginas con un único nivel, (tabla de páginas enorme) implementada en hardware dedicado. Necesitas una
memoria SRAM más grande, ya que vas a tener una tabla de página con muchas entradas, entonces tenes
una tabla de página más grande.
La tabla de pagina seria 4 veces más grande, porque aumentó en 4 la cantidad de entradas, esto ocurre si
reduzco en 4 el tamaño de la página.
Para la tabla de páginas es “caro” tener muchas entradas, por lo cual, aumentar en cuatro la cantidad de
entradas incrementa el tamaño total de la tabla de páginas. Como tenemos hardware dedicado, necesitamos
más recursos para manejar el incremento de tamaño de la tabla de páginas (es decir, más RAM).
18
c y d)
Respuesta 2022
Concurrentemente no es posible ya que la memoria caché en esta caso es física, por lo tanto se necesita
obtener la dirección física para poder acceder. Por otro lado, a la tabla de páginas se puede acceder con la
dirección lógica, y en esta se genera la traducción a dirección física. Entonces, se necesita primero acceder a
la tabla de páginas para luego acceder a caché.
Para que sea posible lo enunciado deberíamos tener una cache lógica, a la cual se puede acceder con la
dirección lógica como en el caso de la tabla de páginas. Entonces, si se quiere buscar su frame se divide a la
dirección lógica en num de pagina y offset, mientras que para acceder a caché se divide la dirección virtual en
tag, index y offset. De esta manera, concurrentemente se está accediendo al set correcto (o comparando el
tag) y se está accediendo a la tabla de páginas, ya que ambas acciones se realizan con la misma dirección
virtual.
FINAL PL
2) Se tiene un sistema con paginado donde la dirección lógica es de 24 bits, y se direcciona al byte.
Las páginas tienen 1024 bytes. En total hay 64 frames.
Datos:
- Direccion logica = 24 bits
- Se direcciona al byte
- Tamaño de página = 1024 bytes → 2^10
- Cantidad de frames = 64
Podemos asumir un offset de 10 bits, ya que tenemos una página de 1024 bytes → 2^10
Direccion logica: nro de pagina | offset Necesito 14 bits para direccionar en la página
14 10
Dirección física: nro de frame | offset nro de frame: log2(cant frames) = log2(64) = 6
6 10
19
c) ¿Cuántas páginas tiene el espacio lógico?
d) Se tiene un fragmento de texto 720 caracteres en UTF 32, cada carácter ocupa 32 bits. ¿Cuantas
paginas ocupará el texto si empieza en la dirección 010800H cuantas ocupa si empieza en la
dirección 010980h ?
frame offset
010800H → 100001 000000000002
Ya que nos desplazamos 96 bytes dentro de la página, empezamos a contar desde aca cuantas
páginas vamos a tener que utilizar para poder almacenar el texto.
20
Matrices
Ejercicio de matriz
Datos:
- N = 16 bits
Dirección base: 0280H
Enteros: 4 bytes
Dirección física = 16 bits
Cache física = 512 bytes
m=1
Líneas = 32 bytes
a) Indique cómo se divide la dirección física para acceder a caché y que cantidad de bits tiene
cada parte.
21
b) Indique en cuántos bloques se divide la matriz, cual es la dirección base de cada bloque (al
menos para las primeras cuatro filas) y cual es el index de caché asociado a cada uno.
Sabemos que el tamaño del bloque es equivalente al tamaño de la línea, por lo tanto:
Cant de bloques = 1024 bytes (tamaño de la matriz) / 32 bytes (el tamaño de la línea) = 32 bloques
Como cada fila es de 16 enteros y cada entero es de 4 bytes entonces tenemos 64 Bytes por fila de matriz,
siendo así, tenemos 2 bloques de 32 bytes por fila de matriz.
Como cada fila de matriz es de 16 enteros, tenes 8 enteros en cada línea de cache.
Cada bloque es 32 bytes y cada elemento es de 4 bytes, entonces entran 8 elementos por bloque o línea.
Fila 1:
- Bloque 1: 64010 + [(1 x 16 + 0) x 4 Bytes] = 70410 → 0000001 0110 00000 index = 6
- Bloque 2: 64010 + [(1 x 16 + 8) x 4 Bytes] = 73610 → 0000001 0111 00000 index = 7
Fila 2:
- Bloque 1: 64010 + [(2 x 16 + 0) x 4 Bytes] = 76810→ 0000001 1000 00000 index = 8
- Bloque 2: 64010 + [(2 x 16 + 8) x 4 Bytes] = 80010→ 0000001 1001 00000 index = 9
Fila 3:
- Bloque 1: 64010 + [(3 x 16 + 0) x 4 Bytes] = 83210→ 00000001 1010 00000 index = 10
- Bloque 2: 64010 + [(3 x 16 + 8) x 4 Bytes] = 86410→ 00000001 1011 00000 index = 11
c) Para cada recorrido cuantos fallos ocurrieron por accesos a datos? ¿Cuál fue la tasa de fallos?
Del total de fallos, ¿cual es el total de fallos compulsivos?
Nosotros tenemos una matriz de 1024 bytes, pero nuestra memoria caché es de
512 bytes. Esto quiere decir, que tendremos que dividir en dos nuestra matriz
para poder recorrerla íntegramente en caché.
22
Columna 0: 16 misses, 0 hits
Columna 15: 16 misses, 0 hits En conclusión: vamos a tener un miss por cada elemento recorrido.
Columna 1: 16 misses, 0 hits Esto es así porque la matriz se sobreescribe en cada iteración,perdiendo
Columna 14: 16 misses, 0 hits todos los bloques que había traído previamente a cache.
Tasa de fallos: 256 / 256 = 100% Fallos compulsivos: 16 / 256 = 0,062% de los misses son
compulsivos
El recorrido más eficiente en base a cómo están almacenados los bloques en la matriz es el segundo, ya que
tiene una menor tasa de fallos.
Para el primer recorrido no estaríamos aprovechando la ventaja de almacenar los bloques en row-mayor.
Al momento de leer la segunda mitad de la matriz, sobreescribimos toda la información de la primera mitad,
esto implica que por cada acceso tengamos un miss asociado, es decir, sumamente ineficiente el primer
recorrido. A pesar de que el segundo recorrido no es el ideal, tiene un porcentaje de falla menor.
Para el primer recorrido, se estaría aprovechando el orden en el cual se recorre y se almacenan las líneas en
la matriz. Como ambas respetan un orden de column-major se aprovecha mejor su organización interna. Esto
implica que la tasa de fallos sea considerablemente menor.
En cuanto al segundo recorrido, la tasa de fallos sería similar, ya que la matriz es cuadrada. Al recorrerla en
espiral no variaría demasiado el recorrido. Podemos concluir, que su tasa de fallos no se alteraría en exceso.
23
For
cada entero
ocupa 4 bytes
32 x 32 caracteres ⇒ 64 x 64 bytes
24
c) tamaño del arreglo = 1024 * 4 bytes = 4096 bytes
tamaño de los bloques es 16 bytes
cada arreglo se divide en 4096/16 = 256 bloques
Para el arreglo A 0000 4040 h → 0000 0000 0000 0000 0100 0000 0100 0000
0000 4056 h → 0000 0000 0000 0000 0100 0000 0101 0110
tag | index | offset
tag = 0000 0000 0000 0000 0100
index = 0000 0101
bloque 0 → index 4
bloque 1 → index 5
bloque 2 → index 6
…
bloque 251 → index 255
bloque 252 → index 0
bloque 253 → index 1
bloque 254 → index 2
bloque 255 → index 3
Para el arreglo B 0000 0800 h → 0000 0000 0000 0001 0000 1000 0000 0000
tag | index | offset
index = 128
bloque 0 → index 128
bloque 1 → index 129
....
bloque 127 → index 255
bloque 128 → index 0
bloque 129 → index 1
….
bloque 254 → index 127
d.
Se asume un almacenamiento para las matrices: row major
Como la caché 4096 Bytes y cada matriz también es de 4096 Bytes, solo se podrá almacenar la mitad de
cada matriz en caché. Luego, los datos se irán reemplazando hasta terminar los recorridos.
Cada vez que se busca un dato en caché, como todas las entradas en caché son inválidas se trae un bloque
entero (de 4 enteros) desde MP.
25
DATOS:
- Direccionamiento al byte (?)
- tamaño dir lógica = 32 bits
- tamaño dir fisica = 24 bits
a.
Dirección Física o Dirección Lógica = log2 (espacio direccionable)
Por ejemplo, si me dice que la memoria RAM es de 4096 bytes, entonces Dirección Física = log2(4096).
b.
Cantidad de páginas = 10242
⇒ Espacio virtual
log2 (Espacio virtual) = 32 bits ( ← dirección lógica)
Espacio virtual= 232 bytes ⇒ 4294967296 bytes ⇒ 4194304 KB
tamaño de página: espacio virtual / cantidad de páginas
: 4294967296 bytes / 10242 páginas
:4294967296 bytes / 1048576 páginas
: 4096 bytes
c. como el tamaño de la página = al tamaño del frame
tamaño de frame = 4096 bytes
como el tamaño de memoria principal (tamaño de RAM) = 16777216 bytes
26
d. Número de Frame = log2(cantidad de frames)
= log2(4096)
= 12
e. Los argumentos que usaría para convencer de que es una mala idea serían:
- Al perder bits en el número de página no puedo direccionar la misma cantidad que si no los
perdiera, teniendo que agrandar la cantidad de bits para suplementar estos bits perdidos.
f.
DATOS:
- 10 entradas
- 6 bits extra
- 1 bit de paridad por cada entrada
- número de frame = 12
Luego, si se desea que cada entrada tenga una cantidad entera de bytes, cada entrada debe
tener 5 bytes. (por lo tanto el tamaño del TLB quedaría en 50 bytes ⇒ 400 bits)
27
Reloj / CPI / Frecuencia
Solución 2022
¿Cómo se calcula el tiempo de ejecución?
Datos:
M1
- frecuencia del reloj = 2GHz
- 40% de las instrucciones: 2 ciclos
- 50% de las instrucciones: 1 ciclo
- 10% de las instrucciones: 3 ciclos
M2
- frecuencia del reloj = X?
- 50% de las instrucciones: 2 ciclos
- 20% de las instrucciones: 2 ciclos
- 30% de las instrucciones: 2 ciclos
Luego, la frecuencia de reloj del procesador M2 tiene que ser igual a 2.5 GHz para que tengan el mismo
tiempo de ejecución en ejecutar el programa A.
28
Procesador M1, con el programa B:
EXcpu M2 = (50% x 2 + 20% x 2 + 30% x 2) x (1 / 2 GHz) = 1 segundo
El programa A corre más rápido que el programa B, es decir, necesita menos tiempo de
ejecución para realizar el trabajo.
El procesador M2 con el programa A, necesita más frecuencia de reloj que el procesador M1
para que su tiempo de ejecución sea el mismo..
El procesador M2 con el programa B, necesita la misma frecuencia del reloj que el procesador
M1 para que sus tiempos de ejecución coincidan.
Los GHz en sí, no
b) Supongamos que la frecuencia del reloj de M1 y M2 es la misma. Ambos programas tienen la misma
cantidad de instrucciones y para realizar la misma tarea encontramos un algoritmo que requiere
ejecutar A y B la misma cantidad de veces. ¿Qué microarquitectura va a ser más rápida?
La microarquitectura que va a ser más rápida va a depender del CPI (Ciclos por instrucción) de sus
instrucciones. Esto es, depende de la distribución de sus instrucciones, cuanto menor sea el CPI por
instrucción, menor va a ser el tiempo de ejecución.
La cantidad de instrucciones también afecta, tener más cantidad de instrucciones con menor CPI va a ser
más rápido que tener muchas instrucciones y que esas instrucciones tengan un CPI grande.
Conclusión: podemos decir que a pesar de que ambos programas y procesadores tengan las mismas
características, la decisión sobre cuál es el procesador más veloz no es única. Depende de la distribución de
las instrucciones y sus CPIs correspondientes.
Datos:
- La frecuencia de reloj de M1 y M2 es la misma = 2 Ghz
- A y B tienen la misma cantidad de instrucciones
- A y B se ejecutan la misma cantidad de veces
29
#Instrucc. Programa A #Instrucc. Programa B CPI Procesador M1 CPI Procesador M2
40% 50% 2 2
50% 20% 1 2
10% 30% 3 2
Conclusión final: Debido a la distribución de las instrucciones la microarquitectura 1 va a ser más rápida.
c) Cuál debería haber sido la relación entre la cantidad de ejecuciones de A y la cantidad de B para
para que en el inciso anterior el resultado fuera que son igual de rápidas?
Conclusión final: la relacion que tendria que haber entre instrucciones de ambos programas seria, 20% de A
y 80% de B
30
SOLUCIÓN 2022
Datos:
- Periodo del reloj = 1 / 4Mhz = 1 / 0.004GHz = 250 GHz
- CPI = 1.6
a)
1 segundo = X * 1.6 * 250 GHz
1000000000 ns / 250 ns = X * 1.6
4.000.000 / 1.6 = X
2.500.000 = Instrucciones
b) Datos:
P = Ejecuta 30 veces por segundo controla el estado del mouse
CPI = 2.5
Por lo tanto podemos concluir que no es significativa la fracción de tiempo usada para
controlar el estado del mouse.
Multiple Choice
31
Ejercicio de final: Sumador
Sumador 1
COUT = w + xyz
S3 = (w + xyz)’
CIN = 0
C1 = xy
C3 = w + c2
C2 = z * c1
C2 = z * c1
C2 = z * xy
C3 = w + c2
C3 = w + zxy
COUT = C3
COUT = w + xyz
S3 = C3’
C3 = 1, Cout = 1, S3 = 0 Por lo tanto, Cout es el complemento de S3
32
C3 = 0, COUT, = 0, S3 = 1
Entonces,
S3 = C3’ → S3 = (w + zxy)’
b) inciso i)
Inciso ii)
33
Inciso ii)
direcciones de memoria:
--> 0x0000 → miss compulsivo (0000 a 0007) 8 Bytes
--> 0x0008 → miss compulsivo(0008 a 0015) 8 Bytes
--> 0x0010 → hit
--> 0x0015 → hit Traemos 32 Bytes en total
--> 0x0020 → miss compulsivo (0016 a 0023) 8 Bytes
--> 0x0028 → miss compulsivo(0024 a 0031) 8 Bytes
RTA:
Cache
- Tamaño de bloque o tamaño de línea: 8 Bytes → L
- Tamaño total de memoria: 1 KB → S
- Mapeo directo → m = 1
- Cantidad de líneas → S / L = 128 líneas
Geometría de la cache (S, m, L) = (1 KB, 1, 8 Bytes)
35
La longitud de la dirección de memoria física, afecta de cierta forma el tamaño de la caché. Esto es porque: el
tamaño de la línea de la caché es equivalente al tamaño de un bloque de memoria física. Al mismo tiempo,
para obtener el tamaño de la caché, hacemos la longitud (tamaño) de la línea x la cantidad de líneas. A mayor
cantidad de bits, más grande el tamaño total de la caché.
Pero, por otro lado no hay relación entre la MP y la MV, la MP tiene un tamaño de 2^n y la MV tiene un
tamaño de 2^p donde no existe relación entre n y p.
RTA:
En el esquema se puede observar que se hace el fetch de la instrucción y se actualiza el PC, en la siguiente
etapa (Decode) se leen los registros y se hace extensión de signo. Además, se decodifica la instrucción y se
determina si es un branch o no (en este caso es un branch). Luego, en la etapa Execute se evalúa la
condición del branch y se calcula la dirección de salto. Posteriormente, en la etapa Memory en la línea de
36
selección del MUX se decide si toma el branch o resuelve otra instrucción, la salida de este MUX será el PC
del cual se hará fetch el ciclo siguiente. Finalmente, en la etapa Writeback se almacenan los datos en el
banco de registros.
Para determinar de forma temprana el branch en la etapa Decode, hay que hacer un par de modificaciones en
el hardware.
En vez de usar la ALU para realizar una resta, se puede usar un comparador (muchos XOR en paralelo) ya
que un comparador de igualdad es mucho más rápido que restar y detectar resultado 0. Esto conlleva a tener
solo 1 ciclo de penalización. A raíz de esto surge un conflicto Read after Write (RaW) lo que conlleva a
necesitar la lógica de forwarding para adelantar los datos a la etapa de decode. Esto se soluciona agregando
2 MUX y 2 líneas nuevas de selección como salida de la unidad de detección de conflictos.
1 1
1 0 1
0 1 1 1 x
1 0 1 0 y
0 1 1 1 z
-----------------------------------------------------------
1 1 0 0 0
1
37
1 0 1 0 1
1 1 1 1 x
1 1 1 1 y
1 1 1 1 z
-----------------------------------------------------------
1 0 1 1 0 1
Coloquio Ejercicio 1
Datos:
- Jerarquía de memoria de dos niveles (MP y cache)
- Bus de 32 bits
- Tamaño de cache = 512 MB
- Un acceso exitoso en caché (Hit time L1): 1 ciclo del reloj
- Transferencia del bus: 1 ciclo del reloj
- Demora para enviar un bloque a MP: 4 ciclos del reloj → miss penaltyL1
- Dirección física: 32 bits
- Tamaño de línea o bloque = ¿?
b) Además del tiempo de transferencia , hay que tener en cuenta el tiempo de arbitraje del bus, es
decir, el tiempo que demanda pasar el control del bus de un dispositivo a otro. Si el arbitraje del
bus demanda 2 ciclos de reloj ¿que tamaño de bloque es mejor?
39
TAP = TaccesoCache + miss ratioCache x TaccesoMP
Ejercicio 3
Datos:
- Memoria virtual con paginado y direccionamiento al byte
- Cant de páginas = 8192 páginas
- Offset = 11 bits
- Dirección física = 18 bits
40
c) ¿Cuál es el tamaño de las direcciones lógicas?
Dirección lógica = num de pagina + offset
Dirección lógica = num de página + 11 bits
Dirección lógica = 13 + 11 = 24 bits
d) ¿Cuántas páginas son necesarias, como mínimo, para almacenar un fragmento de texto de
1722 caracteres UTF-16 si el 60% de los caracteres del texto ocupan 2 bytes y los restantes 4
bytes?
e) Si el mapeo entre páginas y frames se almacena en una tabla de páginas convencional con 5
bits adicionales por cada entrada, incluyendo un bit de valido y un dirty bit, ¿cuál es el tamaño
de la tabla de páginas si cada entrada debe tener una cantidad entera de bytes?. Esta tabla,
presenta algún inconveniente al momento de implementarla? En caso afirmativo, cómo podría
solucionarse?
Uno de los inconvenientes es que la tabla de páginas se sitúa en MP y para poder hacer la traducción
de dirección lógica a física, primero tenemos que pasar por memoria principal para buscar la tabla de
páginas y así poder hacer la traducción, y luego pasar de nuevo a la memoria principal para poder leer
el dato que estamos buscando. Esto demanda 2 accesos a memoria principal. Acá surge la técnica
con TLB para poder minimizar el esfuerzo adicional que lleva a leer la tabla de páginas.
Conclusión: La solución sería tener una caché, separada de la memoria principal, llamada TLB.
f) En este escenario, ¿cuántos bytes ocupará cada entrada del TLB? ¿Cuál sería el tamaño de la
entrada del TLB de 12 entradas?
TLB = cantidad de
41
Tamaño de la entrada TLB = numero de pagina + frame + bits extra
TLB = cantidad de entradas x tamaño de la entrada
TLB = cantidad de entradas x (TAG + VALOR(numero de frame, bit de valido, etc))
En paginación:
TLB = cantidad de entradas x (número páginas + número frame + bits extra).
Tamaño entrada del TLB: (13 bits + 7 bits + 1 bit de valido) = 21 bits → 3 bytes
Tamaño total del TLB: 12 entradas x (21 bits tamaño de la entrada) = 252 bits → 32 bytes
Ejercicio 2
Datos:
- Frecuencia de M1 = 4GHz
- Cant de instrucciones M1 = Cant instrucciones M2
- Periodo de reloj de M2 = 0.4 ns → 0.4 GHz
EXF con M1 = (0.60 x 2.1 + 0.10 x 1.8 + 0.30 x 1.95) x 1 / 4 GHZ = 0.50 segundos
EXF con M2 = (0.60 x 1.3 + 0.10 x 1.6 + 0.30 x 1.45) x 0.4GHZ = 0.55 segundos
La microarquitectura que recomendaría al equipo es la M1, ya que es 0.05 segundos más rápida en la
ejecución del programa F.
Ejercicio 3
Datos:
- Espacio virtual de 2^32 bytes
- Memoria RAM de 16 MiB → 16 x 2^20 bytes
b) Si quiero que mi tabla de páginas entre en una página, mi página tiene que ser más grande o igual que
mi tabla de páginas.
43
((24 bits - offset) + 2 bits extra) x 2^(32-offset) ESTE ES EL TAMAÑO DE MI TABLA DE PÁGINAS
para respetar el enunciado, necesito que mi pagina sea mas grande.
c) Páginas de un tamaño de 4 KiB, la tabla de paginas entra en una pagina? en caso de que no
Tamaño de página: 4 KiB → 4096 bytes = 2^(offset) = 4096 bytes → OFFSET = 12 bits
Tamaño tabla de páginas: (número de frame + bits extra) x cantidad de páginas
4096 bytes (tamaño de página) <<< 1835008 bytes (tamaño tabla de página)
→ claramente no entra
Una de las estrategias es la paginación multinivel, donde cada subnivel de la tabla de página sea de
un tamaño menor o igual al tamaño de las páginas.
Otra estrategia también puede ser usar una tabla de páginas invertida pero no te asegura que entre.
Otra puede ser agrandando el offset así se puede direccionar más dentro de la misma página.
Agrandar el offset implica agrandar la página. Al hacer esto también se achica la tabla de páginas.
44
45