Você está na página 1de 99

Arquitectura de Computadoras

Fac. de Ingeniería de Sistemas e Informática


U.N.M.S.M.
Introducción: ¿por qué?
 Cambios vertiginosos:
• Tubo de vacío -> transistor -> IC -> VLSI
• Se duplica cada 18 meses:
• Capacidad de la memoria
• Velocidad del procesador (x avances en tecnología y organización)

 De que trata este curso:


• ¿Cómo funcionan los computadores? Ejemplos
• ¿Cómo analizar la performance?
• Temas importantes para procesadores modernos
Introducción: ¿para qué?
 Entender la performance para construir programas y sistemas
 Conocer alternativas de compra; asesoramiento “experto”
 Entender las técnicas de diseño, estructuras de máquinas, factores
tecnológicos, métodos de evaluación que determinan el desarrollo actual
de los computadores

Paralelismo Lenguajes de
Tecnología
Programación
Aplicaciones
Arquitectura del Computador: Diseño de las Interfaces
• Diseño del Set de Instrucciones (ISA)
• Organización
• Hardware

Sistemas Medidas& Historia


Operativos Evaluación
¿Qué es un computador? (ii)
Application
Operating
System
Compiler Firmware
Instruction Set
Architecture
Instr. Set Proc. I/O system
Datapath & Control
Digital Design
Circuit Design
Layout
 Arquitectura, ¿qué es?
• Coordinación de niveles de abstracción
• Sometida a un conjunto de estímulos cambiantes
• Diseño, Medida, Evaluación
Abstracción
Programa en C
swap(int v[], int k) Compilador de C (MIPS)

{int temp;
temp=v[k]; Programa en Assembler
swap: Ensamblador (MIPS)
v[k]=v[k+1];
v[k+1]=temp; muli $t1, $a1,4

} add $t1, $a0,$t1


lw $t0, 0($t1) Programa en Lenguaje de máquina

lw $t2, 4($t1) 00000000101000010000000000011000

sw $t2, 0($t1) 00000000100011100001100000100001

 Si se omiten sw $t0, 4($t1) 10001100011000100000000000000000

detalles jr $ra 10001100111100100000000000000100


10101100111100100000000000000000
innecesarios
10101100011000100000000000000100
podemos manejar 00000011111000000000000000001000
la complejidad
Set de Instrucciones
(Instruction Set Architecture –ISA)
 Una abstracción importante
 interfaz entre el hardware y el software de bajo nivel
 Estandariza instrucciones, lenguaje de máquina
 ventaja: es posible tener diferentes implementaciones
de la misma arquitectura
 desventaja: puede impedir innovaciones

 ISAs de hoy en día:


 80x86/Pentium/AMD(K6, K7…), PowerPC, DEC Alpha,
MIPS, SPARC, HP
Arquitectura & Organización (i)
 Arquitectura: atributos visibles al programador
 Set de instrucciones, tamaño de palabra, mecanismos
de E/S, técnicas de direccionamiento.
• Por ejemplo: ¿existe la multiplicación?
 Organización: cómo se implementan las
características de la arquitectura
 Señales de control, interfaces, tecnología de memoria.
• Por ejemplo: ¿la multiplicación se hace en hardware o
mediante microprogramación (usando la suma)?
Visión funcional
 Estructura: ¿de qué manera
los componentes se
relacionan entre si?
 Funcionalidad: operación
individual de c/componente
como parte de una estructura
 Funciones de un computador:
 Procesamiento de datos
 Almacenamiento de datos
 Transferencia de datos
 Control
Estructura: alto nivel

Peripherals Computer

Central Main
Processing Memory
Unit
Computer
Systems
Interconnection

Input
Output
Communication
lines
Estructura: la CPU
CPU

Computer Arithmetic
Registers and
I/O
Login Unit
System CPU
Bus
Internal CPU
Memory Interconnection

Control
Unit
Estructura: Unidad de Control
Control Unit

CPU
Sequencing
ALU Login
Control
Internal
Unit
Bus
Control Unit
Registers Registers and
Decoders

Control
Memory
Generaciones de Computadores
 Tubos de vacío - 1946-1957
 Transistores - 1958-1964
 Small scale integration - 1965 en adelante
 Hasta 100 transistores en un chip
 Medium scale integration - hacia 1971
 100-3,000 transistores en un chip
 Large scale integration - 1971-1977
 3,000 - 100,000 transistores en un chip
 Very large scale integration - 1978 a la fecha
 100,000 - 100,000,000 transistores en un chip
 Ultra large scale integration
 Over 100,000,000 transistores en un chip
Aumentando la velocidad…
 Algunas técnicas para mantener la CPU
trabajando siempre:

 Pipelining
 On board cache
 On board L1 & L2 cache
 Branch prediction
 Data flow analysis
 Ejecución especulativa
Problemas de Performance…

 Incremento en
velocidad del
Procesador
 Incremento en
capacidad de memoria
 Velocidad de acceso a
la memoria crece
mucho menos!
Soluciones
 Incrementar la cantidad de bits accedidos cada
vez
 DRAM “más ancha”
 Cambio de la interfaz de memoria
 Caché
 Reducir la frecuencia de acceso a memoria
 Cachés más complejas, caché en el chip
 Incrementar el ancho de banda de la
interconexión
 Buses de alta velocidad
 Jerarquía de buses
Estructura de la máquina de
von Neumann
Componentes
 La Unidad de Control y la
Unidad Aritmético-Lógica
constituyen la Unidad
Central de Proceso (CPU)
 Datos e instrucciones deben
ingresar al sistema, y los
resultados deben salir
 Entrada/Salida
 Almacenamiento temporal
de código y resultados
 Memoria principal
Jerarquía de buses
Ciclo de Instrucción
 Dos pasos:
 Fetch
 Execute
Ciclo de Instrucción con
Interrupciones
Microprocesador
CPU
 Es el corazón del microprocesador.
 Operación
 Obtiene una instrucción de memoria
 Decodifica la instrucción
 Ejecuta la instrucción
 Incluye:
 Registros
 ALU
 Unidad de control
 Interconexión
CISC vs RISC
 CISC Complex Instruct Set Computers
 RISC Reduced Instruct Set Computers
 Características de CISC
 Gran número de instrucciones.
 Instrucciones útiles para el programador.
Hardvard vs Princeton
 Princeton (Von
Neumann)
 Memoria común para
almacenar el programa y
las variables.
 Permite la ejecución de
código automodificable.
 Un único bus entre la CPU
y la memoria.
Harvard vs Princeton
 Harvard
 Ejecuta las
instrucciones en
menor cantidad de
ciclos por instrucción,
pues logra un
paralelismo a nivel de
instrucción mayor
 Cada palabra (datos e
instrucción) tiene un
tamaño adecuado.
El diseño del procesador
 La CPU ejecuta o supervisa la ejecución de las
instrucciones que componen un programa, y por
lo tanto tiene un impacto fundamental en la
performance del sistema
 Está constituido por unidades funcionales que
incluyen:
 El datapath (camino de datos)
• Set de registros
• ALU
 La Unidad de Control
Algunas decisiones
importantes
 Cantidad, ancho y reglas de uso del set de
registros
 Direccionamiento
 Tecnología del dispositivo
 Set de Instrucciones
 Diseño de la Unidad de Control: cableada o
microprogramada?
Ejemplos de organización de
los registros
Modos de direccionamiento (i)
 Tipos
 Inmediato
 Directo
 Indirecto
 Registro
 Indirecto con registro
 Con desplazamiento
 Pila
Algunas ideas para mejorar la
Performance…
 Obvio: incrementar la frecuencia del reloj
 Mayor frecuencia –> mayor velocidad de procesamiento
 Estado del Arte: >2GHz
 Pero…los tiempos de acceso a memoria y E/S pueden ser un cuello de
botella…
 Ancho de los registros
 Mayor procesamiento por ciclo
 Ancho del bus de datos
 Mayor tasa de transferencia
 Ancho del bus de direcciones
 NO mejora la velocidad de acceso
 Pero se puede direccionar más memoria directamente…
• Programas mas grandes
• Menos uso de la memoria virtual. OK!
Más ideas para mejorar la
performance

 Pipelining
 On board cache
 On board L1 & L2 cache
 Branch prediction
 Data flow analysis
 Ejecución especulativa
 …..
Pipelining: es Natural!

 Ejemplo Lavandería A B C D
 Ana, Beto, Carina, David tienen cada
uno una carga de ropa para lavar,
secar y ordenar
 Lavadora lleva 30 minutos
 Secadora lleva 40 minutes
 “Ordenar” lleva 20 minutos
Lavandería Secuencial
6 PM 7 8 9 10 11 Medianoche
Tiempo

O 30 40 20 30 40 20 30 40 20 30 40 20
r
d A • Lavandería secuencial
e lleva 6 horas para 4
n cargas
B • Cuánto les llevaría si
T aprendieran
a pipelining?
r C
e
a
s
D
Lavandería en Pipeline

6 PM 7 8 9 10 11 Medianoche
Tiempo
O
r 30 40 40 40 40 20
d
e A • Lavandería en Pipeline
n lleva 3.5 horas para 4
cargas!
T B
a
r
e C
a
s D
Pipelining no mejora la
Lecciones del Pipeline latencia de cada tarea, sino
el throughput de toda la
carga de trabajo
Velocidad del Pipeline
6 PM 7 8 9 limitada por el paso más
Tiempo lento
O Tareas múltiples operando
r 30 40 40 40 40 20 simultaneamente
d
Aceleración potential =
e A Cantidad de pasos del
n
pipeline
T B Largo desbalanceado de los
a pasos del pipeline reduce la
r aceleración
e C
a Tiempo para “llenar” y
s “vaciar” el pipeline reduce la
D aceleración
Pipeline primitivo:
Prefetch (o pipeline de dos etapas) (i)
Pipeline primitivo:
Prefetch (o pipeline de dos etapas) (ii)
 Fetch accede a memoria principal
 Ejecución no accede a memoria
 Se puede buscar la próxima instrucción durante la
ejecución de la instrucción actual:
 Prefetch de instrucciones
 Mejora la performance
 Pero no la duplica:
 Fetch usualmente más corto que la ejecución
• Prefetch de más de una instrucción?
 Pero: saltos pueden provocar descarte de las instrucciones
cargadas mediante prefetch
 Más etapas de pipeline para mejorar performance?
Pipelining:
etapas a considerar
 Fetch de instrucción (FI)
 Decodificar instrucción (DI)
 Calcular operandos (CO)
 Fetch de operandos (FO)
 Ejecutar instrucción (EI)
 Escribir resultados (write – WO)

 La idea es superponer estas operaciones en el


tiempo
Tiempos del Pipeline

 Etapas de
igual duración
 Sin saltos
 Sin conflictos
de acceso a
memoria y
registros
Pipeline de
seis etapas
 Lógica del pipeline
considerando
saltos e
interrupciones
Problemas del pipeline
 Límites del pipeline: los hazards (obstáculos)
pueden impedir que la próxima instrucción se
ejecute en el ciclo correspondiente
 Hazards estructurales: conflicto de HW que impide
determinada combinación de instrucciones
 Hazards de datos: instrucción actual depende del
resultado de una instrucción previa que aún está en
el pipeline
 Hazards de control: causados por retardos entre el
fetch de instrucciones y la decisión de cambios en el
flujo de instrucciones (bifurcaciones, saltos)
Como resolver un hazard
estructural?
 Definición: intento de usar el mismo hardware para dos
propósitos diferentes a la vez

 Solución 1: Esperar…
 Se debe detectar el problema
 Y tener mecanismos para “no hacer nada”

 Solución 2: agregar más hardware…


 Por ejemplo, agregar otro puerto de acceso a memoria

 Cuando se diseña el set de instrucciones


 Mirando los códigos de operación sabemos los recursos que
usa cada instrucción
 Buscar uniformidad en el uso de estos recursos
Tipos de Hazards de Datos (i)
 Read After Write (RAW)
InstrJ intenta leer operando antes que InstrI lo escriba
I: add r1,r2,r3
J: sub r4,r1,r3
 “Data Dependence” en nomenclatura del compilador
 Write After Read (WAR)
InstrJ escribe operando antes que la InstrI lo lea
I: sub r4,r1,r3
J: add r1,r2,r3
K: mul r6,r1,r7
 “Anti-dependence” en nomenclatura del compilador
 Debido al reuso del nombre “r1”
Tipos de Hazards de Datos (ii)
 Write After Write (WAW)
InstrJ escribe operando antes que lo escriba InstrI
I: sub r1,r4,r3
J: add r1,r2,r3
K: mul r6,r1,r7
 “Output dependence” en nomenclatura del compilador
 También causado por reuso del nombre “r1”.
 Imposible en el pipeline de ejemplo presentado
• Escrituras en paso 5
 Casos WAR y WAW se dan en pipelines más complicados

 Los hazards de datos se pueden resolver por el compilador


 Los RISC proveen la instrucción NOP para esperar
explícitamente
 Obviamente, se retarda la ejecución!
Que hacemos con las
bifurcaciones y saltos?
 Multiple Streams
 Dos pipelines
 Prefetch cada rama en pipeline separados
• Problemas de “contención” del bus y registros
 Más saltos -> más pipelines
 Prefetch destino de la bifurcación
 Además de las instrucciones que siguen el salto
 Se guarda hasta que se ejecuta el salto
 Usado en IBM 360/91
 Loop buffer
 Branch prediction
 Delayed branching
Branch Prediction (i)
 Predecir: nunca se toma el salto
 Asume que el salto no se ejecuta
 Siempre se carga la próxima instrucción
 68020 & VAX 11/780
 VAX no hace el prefetch si se da un fallo de página
(diseño del SO y CPU)
 Predecir: siempre se toma el salto
 Asume que el salto se ejecuta
 Siempre se carga el destino del salto
Branch Prediction (ii)
 Predecir: por Opcode
 Algunas instrucciones (de bifurcación) tienen más
probabilidad de tomar el salto que otras
 Hasta un 75% de éxito
 Conmutar Taken/Not taken
 Basado en historia reciente
 Bueno para loops
 Delayed Branch
 No tomar el salto hasta que “es inevitable”
 Reordenamiento de instrucciones
• Programador, compilador
• Usado en RISC
Recapitulando:
donde estamos?

 Componentes Clásicos de un Computador


Procesador
Entrada
Control
Memoria

Datapath Salida

 Veremos otras ideas para mejorar la performance


 Localidad y Jerarquía de Memoria
 Memorias SRAM, DRAM
 Organización de la Memoria
 Caches, Memoria Virtual
Jerarquía de memoria
 Objetivo: mucha memoria, rápida y barata
 Jerarquía
 Paralelismo
Processor

Control Tertiary
Secondary Storage
Storage (Disk/Tape)
Second Main
(Disk)
On-Chip
Registers

Level Memory
Cache

Datapath Cache (DRAM)


(SRAM)

Speed (ns): 1s 10s 100s 10,000,000s 10,000,000,000s


Size (bytes): 100s (10s ms) (10s sec)
Ks Ms Gs Ts
Por qué funciona la jerarquía ?

 Principio de Localidad:
 Los programas acceden una porción relativamente
pequeña del espacio de direcciones en un determinado
instante de tiempo.
 Se aplica también al acceso a datos (en menor %)

 Localidad temporal
• Si un ítem es referenciado, tenderá a ser referenciado
nuevamente a la brevedad
 Localidad Espacial
• si un ítem es referenciado, los items con direcciones
“cercanas” tenderán a ser referenciados a la brevedad
Como se maneja la jerarquía?

 Registros <-> Memoria


 por el compilador (programador?)
 cache <-> memoria
 por el hardware
 memoria <-> discos
 por el hardware y el sistema operativo (memoria virtual)
 por el programador (archivos)
Jerarquía de Memoria:
Cómo Funciona?

 Localidad Temporal
 Mantener los datos más recientemente accedidos
“cercanos” al procesador
 Localidad Espacial
 Mover bloques de palabras contiguas al nivel superior

Memoria
Al Procesador Memoria Nivel Inferior
Nivel Superior
Blk X
Del Procesador Blk Y
Memoria Principal:
La organización mejora la performance

 Simple:
 CPU, Cache, Bus, Memoria mismo ancho(32 bits)
 Ancho (Wide):
 CPU/Mux 1 palabra; Mux/Cache, Bus, Memory N palabras
 Entrelazado (Interleaved):
 CPU, Cache, Bus 1 palabra: Memoria N Módulos; el ejemplo
de 4 módulos, word interleaved ( estrelazado de palabra)
Interleaving
Patrón de Acceso sin Interleaving: CPU Memoria

D1 disponible
InicioAcceso de D1 InicioAcceso de D2
Memoria
Patrón de Acceso con Interleaving de 4 vías: Banco 0
Memoria
Banco 1
CPU
Memoria
Banco 2
Acceso Banco 0

Memoria
Banco 3
Acceso Banco 1
Acceso Banco 2
Acceso Banco 3
Podemos Acceder Banco 0 nuevamente
Resumen hasta el momento
 Dos Tipos de Localidad:
 Temporal
 Espacial
 Tomando ventaja del principio de localidad:
 Construir un sistema con mucha memoria de tecnología baratas
 Proveer acceso a la velocidad ofrecida por las tecnologías más
rápidas
 La DRAM es lenta, pero de alta densidad y barata:
 Presenta al usuario un sistema de memoria GRANDE.
 La SRAM es rápida, pero de baja densidad y cara:
 Presentar al usuario un sistema de memoria RÁPIDO.
 El Arte del diseño de un Sistema de Memoria consiste en
Optimizar la organización para minimizar el tiempo de acceso
promedio para las cargas de trabajo típicas
Cache
 Memoria rápida, escasa
 Se instala entre la memoria principal y la CPU
 Puede estar en el chip de la CPU (L1) o en módulo
externo (L2)
Ahora veremos
 Memoria virtual
 Resumen de ideas para mejorar performance
 CISC vs. RISC


 RISC
 La reunión de todas las “buenas ideas”!
 Como es?
 La importancia del compilador
Recordemos:
Jerarquía de Memoria
Nivel Superior
Registros Más rápido
Instr. Operandos

Cache

Bloques

Memoria

Páginas

Disco

Archivos

Cinta Más grande


Nivel Inferior
Paginación
 Memoria dividida en frames de igual tamaño
 Procesos divididos en bloques de igual tamaño: páginas
 Asignar la cantidad de páginas requeridas por cada
proceso

 El Sistema Operativo mantienen una lista de las frames


libres
 Un proceso no necesita un espacio contiguo de frames
 Se utiliza una tabla para “llevar la cuenta” de las páginas
usadas
Memoria Virtual
 Paginación a demanda
 No se requiere que todas las páginas de un proceso
estén en memoria principal
 Se cargan bajo demanda
 Fallo de Página
 Página requerida no está en memoria
 Sistema Operativo debe traer la página nueva (swap
in)
 Puede ser necesario descartar una página para hacer
lugar (swap out)
 Seleccionar página a descartar basándose en la historia
reciente
Memoria virtual:
beneficios
 No se necesita tener memoria suficiente para
todos los procesos en ejecución
 Se puede hacer swap de páginas a demanda
 Entonces…
 Se pueden ejecutar procesos más grandes que la
memoria física disponible!

 Usuario/programador ve una memoria mucho


más grande
 Memoria virtual
Diseño de un
Sistema de Memoria Virtual
 Tamaño de los bloques de información que son
transferidos desde almacenamiento secundario hacia
principal (M)
 Si M está lleno, si se trae un nuevo bloque se debe liberar
un espacio
 política de reemplazo
 Que región de M debe alojar el nuevo bloque
 política de alojamiento
 Los ítems que faltan deben ser traídos de memoria
secundaria solo si ocurre un fallo
 política de carga en demanda
 Organización de Paginado
 espacio de direcciones físico (frames) y virtual (páginas)
particionado en bloques de igual tamaño
Ejemplo:
Direcciones lógicas y físicas
 Frames o marcos:
bloques de memoria
física
 Páginas: bloques de
memoria virtual,
usualmente
almacenados en disco.
Se cargan a frames
libres de memoria física
 Traducción de memoria
virtual a física
 Tabla de páginas
Thrashing
 Demasiados procesos en poca memoria
 Sistema Operativo ocupado todo el tiempo en
swap
 Poco “trabajo real” del sistema
 El disco trabaja mucho!

 Soluciones
 Buenos algoritmos de reemplazo
 Reducir cantidad de procesos en ejecución
 Más memoria!
Estructura de la Tabla de
Páginas (i)
 Tabla de páginas
 Traducción de dirección virtual a dirección física
 Tamaño variable, potencialmente muy grande (ej. 4GB en
sistemas con 32 bits de direcciones)
 No se puede alojar en la CPU -> en memoria!
 Pero se debe limitar el uso de memoria principal para
almacenar Tablas de Páginas….
 …se almacenan en memoria virtual
 Entonces...se necesitan esquemas de paginación en
niveles
 Directorio y tablas de páginas
 Tabla invertida
Estructura de la Tabla de
Páginas (ii)
 Invertida: se
utiliza un hash
para indexar en
la tabla
 Usado en
PowerPC
 Tabla de hash
usa
encadenamiento
(chaining)
 Ventaja: porción
fija de memoria
real para tablas
Translation Lookaside Buffer
Virtual Address Physical Address Dirty Ref Valid Access

 Cada referencia a memoria virtual causa dos accesos a memoria


física
 Fetch entrada a tabla de páginas
 Fetch datos (o programa)
 Se utiliza un cache especial para la tabla de páginas
 TLB
 Menor tiempo de acceso, menor tiempo de traslación
 El uso de TLBs permite reducir el #ciclos/accesos al cache
mediante la superposición del acceso al cache con el acceso al
TLB
Operación del TLB y el Cache
 Dirección virtual
 Bits más significativos
usados para buscar en
el TLB
 Bits menos
significativos índice
del cache
 Acceso superpuesto al
TLB y el cache funciona
solamente si los bits de
direcciones usados
como índice del cache
no cambian como
resultado de la
traslación de DV
 Caches pequeñas,
tamaño de página
grande, o caches
altamente asociativos
Fallo de
Página
 Página no está residente en
memoria
 El Hardware debe detectar la
situación y enviar un trap al
Sistema Operativo para intentar
resolver la situación
 elegir una página a descartar
(posiblemente salvándola en
disco)
 traer la página del disco
 actualizar la tabla de páginas
 retornar el control al programa
para que el HW pueda
reintentar con éxito!
Tamaño de Página Optimo
 Mimimizar pérdida de almacenamiento
 páginas pequeñas minimizan fragmentación interna
 páginas pequeñas aumentan el tamaño de la Tabla de
Páginas
 Minimizar tiempo de transferencia
 páginas grandes (múltiples sectores del disco) amortizan
costo del acceso
 Riesgo
• se puede transferir información innecesaria
 La tendencia generalizada es tener páginas grandes
porque:
 se tiene mucha RAM barata
 crece la diferencia de performance memoria / disco
 espacios de direccionamiento más grandes
Por qué memoria virtual? (i)
 Generalidad
 posibilidad de correr programas más grandes que el
tamaño de la memoria física
 Manejo del Almacenamiento
 allocation/deallocation de bloques de tamaño variable
es costoso y lleva a fragmentación
 Protección
 aplicar permisos diferenciados a regiones del espacio
de direcciones (R/O, Ex, . . .)
 Flexibilidad
 porciones del programa pueden ubicarse en cualquier
lado, sin relocalización
Por qué memoria virtual? (ii)
 Eficiencia del almacenamiento
 retener solo las porciones más importantes del
programa en memoria
 E/S Concurrente
 ejecución de otros procesos mientras se carga/descarta
una página
 Performance
 Impacto en multiprogramación, impacto en lenguajes
de alto nivel
Jerarquía de memoria:
Resumen (i)
 Principio de Localidad:
 Los programas acceden una porción relativamente pequeña del
espacio de direcciones en un instante dado.
• Temporal
• Espacial
 Categorías fundamentales de Cache Misses:
 Compulsivos
 por Conflicto: incrementar tamaño o asociatividad del cache
 por Capacidad: incrementar tamaño del cache
 de Coherencia: procesadores externos o dispositivos de E/S
 Diseño del Cache
 tamaño total, tamaño del bloque, asociatividad
 política de reemplazo
 política de escritura en hits (write-through, write-back)
Jerarquía de memoria:
Resumen (ii)
 Caches, TLBs, Memoria Virtual se pueden estudiar examinando
las respuestas a:
 Donde se puede guardar el bloque?
 Cómo encontrar un bloque?
 Qué bloque se reemplaza en un miss?
 Cómo se manejan las escrituras?
 Tablas de páginas mapean direcciones virtuales a físicas
 TLBs son importantes para acelerar la traslación
 Misses del TLB son significativos en la performance del procesador!
 La MV permite que muchos procesos puedan compartir la
memoria sin tener que hacer “swap” al disco
 Protección de MV es tan importante como la jerarquía de memoria!
 El tiempo de CPU es una función de (ops, cache misses) vs.
solamente f(ops)
 Cómo se debe reflejar en los Compiladores, Estructura de Datos,
Algoritmos?
Una idea fija:
mejorar la performance (i)
 Algunas ideas que ya revisamos
 Incrementar la frecuencia del reloj
• Pero…los tiempos de acceso a memoria y E/S pueden ser un cuello de
botella…
 Ancho de los registros
 Ancho del bus de datos
• Mayor tasa de transferencia
 Ancho del bus de direcciones
• NO mejora la velocidad de acceso pero se puede direccionar más memoria
directamente…
• Programas mas grandes
• Menos uso de la memoria virtual. OK!
 Pipelining
• Branch prediction
• Delayed branch
 Jerarquía de Memoria
• L1 & L2 cache
• Memoria virtual
Una idea fija:
mejorar la performance (ii)
 Ideas de mejora
 Hardware
• Más, mejor, más rápido…
• Compatibilidad…
 Organización
• Mejores ideas
• Sencillez
• No compatibilidad…
 CISC vs. RISC
 Muy diferentes filosofías
 Pero…
 La mayoría de los procesadores de hoy en día tienen
características de ambos
 Ej. PowerPC y Pentium IV
Las ideas del RISC (i)
 Reduced Instruction Set Computer
 “Less is more”
 Set de instrucciones reducido para simplificar la decodificación
 Set de Instrucciones pequeño -> Lógica sencilla -> Más pequeña -
> Ejecución más rápida
 Elimina microcódigo
 Control cableado de la ejecución
 Decodificación y ejecución en pipeline
 Más operaciones en paralelo
 Regla 20/80
 20% de las instrucciones llevan el 80% del tiempo
 La ejecución de una secuencia de instrucciones sencillas puede
ser más rápida que una instrucción de máquina compleja que
tiene el mismo efecto!
Las ideas del RISC (ii)
 Arquitectura Load/Store – los accesos a memoria deben ser
explícitos usando instrucciones load y store
 El resto de las instrucciones usan los registros internos del
procesador
 Requisito indispensable para “ejecución en un solo ciclo”
• La Unidad de Ejecución no puede esperar por lectura/escritura de
datos
 Incrementa gran cantidad de registros internos dada la
arquitectura Load/Store
 Registros de propósito general, no asociados a funciones
específicas
 Diseño coordinado del procesador y el compilador RISC. Esto
permite producir código eficiente
Pero …
 La optimización del compilador exige saber
como funciona el pipeline
 (Ej. insertar NOPs si es necesario)
 Se necesita mayor tiempo y esfuerzo para producir
un compilador!

 Menor densidad del código en RISC


 Ej. Código PowerPC puede llevar hasta 30% más
código para hacer la misma tarea que en una CPU
x86
 Más accesos a memoria, potencial impacto en
performance...
Por qué CISC?
 Costos de software mayores que los del hardware
 Simplificar escritura de compiladores
 Mejorar la eficiencia de la ejecución
 Operaciones complejas en microcódigo
 Soportar lenguajes de alto nivel cada vez más complejos
 “Semantic gap”
 Solución:
 Sets de instrucciones grandes
 Más modos de direccionamiento
 Implementación en hardware de facilidades de lenguajes
• Ej. CASE (switch) en VAX
Pero …
 Simplificación del compilador?
 Discutido…
 Instrucciones de máquina complejas difícil de ser explotadas
 Optimización más difícil
 Código más pequeño?
 Los programas ocupan menos memoria…
• Pero la memoria es barata!
 Engañoso: puede parecer conciso en forma simbólica
• Pero los códigos de operación son mayores
 Ejecución más rápida?
 Unidad de control compleja
 Memoria de microprograma grande
 Instrucciones simples (y más frecuentes) pueden llevar
mucho tiempo en ejecutar
Características de la Ejecución:
Un enfoque cuantitativo
 Idea de los propulsores del RISC (Patterson et al.):
 Analizar la ejecución de programas para determinar las
mejoras necesarias a la arquitectura

 Operaciones realizadas (recordar regla 20/80)


 Operandos utilizados
 Tipos de ops. y frecuencia determina organización de
memoria y modos de direccionamiento
 Secuenciamiento
 Control
 Estudios basados en programas escritos en lenguajes de
alto nivel
 Dinámico: medidas tomadas durante la ejecución
Operaciones
 Asignaciones predominan
 Movimiento de datos son importantes
 Sentencias condicionales también son
predominantes (IF, LOOP)
 Control de secuenciamiento son importantes
 Llamadas y retornos de procedimientos
consumen mucho tiempo
 Qué instrucciones de alto nivel provocan la
ejecución de la mayoría de las instrucciones de
lenguaje de máquina?
Operandos
 La mayoría de las referencias a variables escalares
simples, locales
 Acceso a estructuras requieren una referencia previa a
índice/puntero (escalar)
 Optimización debe concentrarse en el acceso a variables
locales

Pascal C Average
Integer constant 16 23 20
Scalar variable 58 53 55
Array/structure 26 24 25
Llamadas a Procedimientos
 Consumen mucho tiempo
 Dependen de
 Cantidad de parámetros pasados
 Nivel de anidamiento
 La mayoría de los programas usan pocos
argumentos
 La mayoría de las variables son locales
 La “profundidad” de anidamiento es baja
 O sea, no es frecuente tener muchas llamadas seguidas
de muchos retornos
Que se concluye?
 Se deben optimizar las características más
usadas y que consumen más tiempo
 Mejor soporte a lenguajes de alto nivel
 Gran cantidad de registros
 Referencias a variables locales optimizada
 Se debe diseñar el pipeline con cuidado
 Tener en cuenta efectos de bifurcaciones

 Set de instrucciones reducido


Registros para Variables
Locales
 Almacenar variables escalares locales en registros
 Rápido acceso (on-chip)
 Reduce accesos a memoria

 Cada procedimiento cambia la localidad


 Se deben pasar parámetros
 Deben retornarse resultados
 Variables de procedimientos llamantes deben restaurarse

 Entonces…
 Se necesita asegurar (por hard o soft) el uso intensivo de
registros
 Solución hardware: muchos registros!
Ventanas de Registros
 Se usan pocos parámetros
 Poca profundidad de llamadas

 Se aprovechan estas características


 Usando conjuntos pequeños de registros
 Que se conmutan en las llamadas
 Retorno conmuta hacia el conjunto anterior de registros

 Tres áreas en un conjunto de registros


 Parámetros
 Locales
 Temporarios
• Se pueden solapar con los temporarios del conjunto siguiente
 Esto permite el pasaje de parámetros sin transferencias!
Ventanas de Registros
superpuestas

 Para soportar cualquier patrón de llamadas los conjuntos de


registros deberían ser infinitos…
 En realidad se implementa como un buffer circular de ventanas
Buffer Circular de ventanas
 Cuando se hace un
call, el puntero de
ventana se hace
apuntar al conjunto
de registros activo

 Si todas las ventanas


están en uso, se
genera una
interrupción y la
ventana “más vieja”
se salva a memoria
Variables Globales
 Alternativas
 Almacenadas en memoria por el compilador
• Ineficiente para variables accedidas frecuentemente

 Disponer de un conjunto de registros globales


Y si usamos un cache en lugar
de registros?
 Muchos Registros Cache

 Todos los escalares locales Escalares locales


recientemente accedidos
 Variables individuales Bloques de memoria
 Variables globales asignadas Variables globales
por el compilador recientemente accedidas
 Save/restore basado en Save/restore basado
anidamiento en algoritmo de reemplazo
 Direccionamiento de registros Direccionamiento de
memoria
Referencia a escalar
Registros vs. Cache

 Acceso a registro usa un


decodificador sencillo

 El cache se puede usar para


instrucciones
Optimización del uso de
registros por el compilador
 Se asume una cantidad limitada de registros
(16-32)
 Se asigna un registro simbólico o virtual a cada
variable “candidato”
 Se corresponden los registros simbólicos a
registros reales
 Los registros simbólicos que no se superponen
pueden compartir registros reales
 Si se acaban los registros reales…se almacenan
variables en memoria
Una técnica: Graph Coloring
 Dado un grafo de nodos y arcos
 Asignar un color a cada nodo
 Nodos adyacentes deben tener colores diferentes
 Minimizar la cantidad de colores usados
 Los nodos representan registros simbólicos
 Dos registros que “están vivos” en el mismo fragmento de
programa se unen por un arco
 Se intenta colorear el grafo con n colores, donde n es la
cantidad de registros reales
 Los nodos que no se pueden colorear deben almacenarse
en memoria
RISC: Efectos de Pipelining
 Instrucciones registro a
registro
 Dos fases de ejecución
 I: Instruction fetch
 E: Execute
• Operación de la ALU
con registro de
entrada y salida
 Load and store
 I: Instruction fetch
 E: Execute
• Calcular dirección
 D: Memory
• Operación de registro
a memoria o
memoria a registro
 E1: lectura registro
 E2: Op. ALU y escritura
a registro
Salto
retardado:
Tiempos
No se efectiviza hasta que se ejecuta la
instrucción siguiente (delay slot)
RISC vs. CISC: resumen
 Aprox. cuantitativa
 Comparar tamaños de programa y tiempos de ejecución
 Aprox. cualitativa
 Examinar soporte a lenguajes de alto nivel, uso de recursos
VLSI
 Problemas para comparar
 No hay parejas de RISC y CISC directamente comparables
 No hay un conjunto “definitivo” de programas de evaluación
 Difícil separar efectos del hardware, el compilador, el sistema
operativo
 Comparaciones se hacen en sistemas “de juguete” y no en
máquinas en producción
 La mayoría de productos comerciales son una mezcla

 Analizar rendimiento
Finalmente
 Las innovaciones y mejoras continuan ... cambios notables:
 Memoria magneto-óptica
 Diseños de CPUs superscalares
 Instrucciones multimedia
 Ejecución anticipada y carga especulativa
 Multiprocesadores simétricos, clusters, sistemas de acceso a
memoria no uniforme
 Nuevos sistemas operativos, compiladores y middlewares

 Arquitecturas reconfigurables

Você também pode gostar