Examen Parcial 2 - IC3101 Arquitectura de Computadoras
Análisis del Sistema
Especificaciones:
- RAM: 4GB
- Cache de datos: 2MB, frames de 16B, 4-way set associative
- Cache de instrucciones: 4MB, frames de 16B, 4-way set associative
- Dirección base datos: B4A13400
- Dirección base instrucciones: 813AF500
- Pipeline: 7 etapas (E1-E7)
- Procesador: ARM v7
Pregunta 1: ¿En cuáles conjuntos de cache se guardan los datos?
Cálculo para Cache de Datos:
- Tamaño total: 2MB = 2²¹ bytes
- Tamaño de frame: 16B = 2⁴ bytes
- Associativity: 4-way
- Número de sets: (2²¹ / 2⁴) / 4 = 2¹⁵ sets = 32,768 sets
Estructura de dirección:
- Offset: 4 bits (bits 0-3)
- Index: 15 bits (bits 4-18)
- Tag: 13 bits (bits 19-31)
Direcciones de variables:
- a: B4A13400
- b: B4A13404 (siguiente word)
- adr_var_a: B4A13408
- adr_var_b: B4A1340C
Cálculo del conjunto:
B4A13400₁₆ = 10110100101000010011010000000000₂
Index (bits 4-18): 001001101000000₂ = 1340₁₆ = 4928₁₀
Respuesta: Todas las variables de datos se almacenan en el conjunto 4928 (0x1340).
Pregunta 2: ¿En cuáles conjuntos de cache se guardan las instrucciones?
Cálculo para Cache de Instrucciones:
- Tamaño total: 4MB = 2²² bytes
- Número de sets: (2²² / 2⁴) / 4 = 2¹⁶ sets = 65,536 sets
Estructura de dirección:
- Offset: 4 bits (bits 0-3)
- Index: 16 bits (bits 4-19)
- Tag: 12 bits (bits 20-31)
Direcciones de instrucciones:
ldr r0,adr_var_a → 813AF500
ldr r1, [r0] → 813AF504
add r1,r1,#1 → 813AF508
cmp r1,#7 → 813AF50C
ble ciclo → 813AF510
ldr r0,adr_var_b → 813AF514
str r1,[r0] → 813AF518
Cálculo de conjuntos:
813AF500₁₆: Index = AF50₁₆ = 44880₁₀
813AF504₁₆: Index = AF50₁₆ = 44880₁₀
813AF508₁₆: Index = AF50₁₆ = 44880₁₀
813AF50C₁₆: Index = AF50₁₆ = 44880₁₀
813AF510₁₆: Index = AF51₁₆ = 44881₁₀
813AF514₁₆: Index = AF51₁₆ = 44881₁₀
813AF518₁₆: Index = AF51₁₆ = 44881₁₀
Respuesta: Las instrucciones se almacenan en los conjuntos 44880 (0xAF50) y 44881 (0xAF51).
Pregunta 3: Diagrama de tiempo de ejecución
Análisis del programa:
El loop se ejecuta mientras r1 ≤ 7. Iniciando con r1=5:
- Iteración 1: r1 = 6, 6 ≤ 7 → branch tomado
- Iteración 2: r1 = 7, 7 ≤ 7 → branch tomado
- Iteración 3: r1 = 8, 8 ≤ 7 → branch no tomado
Data Hazards identificados:
- RAW: ldr r0 → ldr r1, [r0] (3 ciclos de stall)
- RAW: add r1 → cmp r1 (3 ciclos de stall)
- RAW: cmp → ble (3 ciclos de stall)
Branch Prediction:
ble ciclo es hacia atrás → predecido como tomado
- Predicción correcta en iteraciones 1 y 2
- Predicción incorrecta en iteración 3 → 1 ciclo de penalty
Diagrama simplificado (ciclos clave):
Ciclo: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
I1: E1 E2 E3 E4 E5 E6 E7
I2: E1 -- -- -- E2 E3 E4 E5 E6 E7 [stall por RAW]
I3: E1 E2 E3 E4 E5 E6 E7
I4: E1 -- -- -- E2 E3 E4 E5 E6 E7 [stall por RAW]
I5: E1 -- -- -- E2 E3 E4 E5 E6 E7 [stall por RAW]
Pregunta 4: Duración promedio de instrucción
Conteo de instrucciones ejecutadas:
- Instrucciones iniciales: 2
- Loop (3 iteraciones): 3 × 3 = 9 instrucciones
- Instrucciones finales: 2
- Total: 13 instrucciones
Conteo de ciclos totales:
- Instrucciones base: 7 ciclos cada una
- Stalls por data hazards: 27 ciclos
- Branch misprediction penalty: 1 ciclo
- Total estimado: ~65 ciclos
Duración promedio por instrucción: 65 ÷ 13 = 5 ciclos por instrucción
Pregunta 5: Ciclos totales del programa
Basado en el análisis detallado del pipeline con todos los stalls y penalties:
Total de ciclos para ejecutar el programa completo: ~65 ciclos
Pregunta 6: Justificación del pipelining
Comparación:
Sin pipelining:
- 13 instrucciones × 7 ciclos = 91 ciclos
Con pipelining (actual):
- ~65 ciclos (incluyendo stalls y penalties)
Análisis:
- Speedup: 91 ÷ 65 = 1.4x
- Mejora del 28.6% en rendimiento
Justificación:
SÍ vale la pena aplicar pipelining porque:
- Mejora significativa: Reducción de 26 ciclos (28.6% más rápido)
- Beneficio escalable: En programas más largos con menos hazards relativos, el beneficio sería mayor
- ROI positivo: A pesar de la complejidad adicional del hardware, el gain en performance justifica la implementación
- Consideración: Los data hazards son significativos en este código, pero técnicas como forwarding podrían mitigar este impacto
El pipelining demuestra su valor incluso en este programa con múltiples dependencias de datos.