310 likes | 560 Views
ISI374 – Arquitectura de Computadores Clase 14: Repaso (Diseño del microprocesador, segmentación). Departamento de Ingeniería de Sistemas Universidad de Antioquia 2010-1. La CPU en el modelo de von Neumann. Procesador (CPU) Ruta de datos ( datapath )
E N D
ISI374 – Arquitectura de ComputadoresClase 14: Repaso (Diseño del microprocesador, segmentación) Departamento de Ingeniería de Sistemas Universidad de Antioquia 2010-1
La CPU en el modelo de von Neumann • Procesador (CPU) • Ruta de datos (datapath) • Porción del procesador que corresponde al HW necesario para ejecutar las operaciones que él demanda • Unidad de control • Porción del procesador (también en HW) que le indica al datapath lo que debe hacer
Implementación básica MIPS Subconjunto de la arquitectura MIPS (suficiente para ilustrar los principios que orientan el diseño de un datapath y una unidad de control para cualquiera otra ISA) • Instrucciones de acceso a memoria • Load word, lw • Storeword, sw • Instrucciones aritmético-lógicas • Suma, add • Resta, sub • AND lógica, and • OR lógica, or • Set onlessthan, slt • Instrucciones de salto • Branchifequal, beq • Jump, j
Diseño del procesador monociclo Cinco pasos para diseñar un procesador: • Analizar la arquitectura del conjunto de instrucciones (ISA) • Para conocer los requerimientos del datapath • Establecer los componentes del datapath y elegir el esquema de reloj • Ensamblar el datapath satisfaciendo los requerimientos • Analizar la implementación de las instrucciones para determinar las señales de control que tendrán efecto sobre el flujo de datos • Construir la lógica de control
Control de la ALU • Las líneas de control de la ALU se pueden generar usando una pequeña unidad de control (ALU control) que tiene como entradas el campo funct de 6 bits de la instrucción y un campo de control de 2 bits al que llamaremos ALUop • Los valores de ALUop se generan en la unidad de control principal • El uso de varios niveles de control permite reducir el tamaño de la unidad de control principal (potencialmente incrementando su velocidad)
Control de la ALU • Tabla de verdad para las líneas de control de la ALU (Operation), cuyas entradas son ALUop y el campo funct • Una posible implementación:
Función de control para el procesador MIPS monociclo • La función de control se puede definir mediante una tabla de verdad • Las salidas son las líneas de control y las entradas son el campo opcode de la instrucción
Desventajas del procesador monociclo • El ciclo de reloj debe contener la instrucción más lenta • Muy problemático si las instrucciones fueran más complejas (Ej: punto flotante) • Muchos tipos de instrucciones soportarían un ciclo de reloj inferior • Viola el principio de diseño “Hacer el caso común más rápido” • El costo de la implementación hardware puede ser alto porque muchas unidades funcionales tienen que replicarse (debido a que la misma unidad no puede usarse más de una vez en el mismo ciclo de reloj) • Sin embargo, es un diseño simple y fácil de comprender • Soluciones alternativas: • Reducir el ciclo de reloj y hacer que cada instrucción se ejecute en varios ciclos • Procesador multi-ciclo • Solapar la ejecución de varias instrucciones elevando la utilización del hardware y el rendimiento • Segmentación (pipelining) • Buscar y ejecutar varias instrucciones a la vez • Procesadores superescalares
Segmentación: analogía con una lavandería 6 PM 8 7 10 9 T a s k O r d e r Time 30 30 30 30 30 30 30 A B C D • La segmentación no reduce la latencia de una tarea, sino que eleva el throughput de un proceso completo • Varias tareas operan simultáneamente usando recursos diferentes • La rata del pipeline está limitada por la etapa más lenta • Etapas desequilibradas del pipeline reducen el speedup • Speedup potencial: número de etapas del pipe • El speedup se reduce porque hay que llenar (fill) y vaciar (flush) el pipeline
Pasos en la ejecución de una instrucción MIPS • IF: (InstructionFetch) Búsqueda de la instrucción, actualización del PC • ID: (InstructionDecode) Decodificación de la instrucción, lectura del banco de registros • EX: (Execution) • Instrucción de acceso a memoria: Cálculo de la dirección • Instrucción aritmético-lógica: Cálculo de la operación • MEM: (Memory) • Load: Lectura de la memoria de datos • Store: Escritura de la memoria de datos • WB: (Write Back) Escritura del resultado en el banco de registros
Procesador MIPS segmentado cc 1 cc 2 cc 3 cc 4 cc 5 cc 6 cc 7 cc 8 cc 9 Time IF ID EX MEM WB Instr. i IF ID EX MEM WB Instr. i+1 IF ID EX MEM WB Instr. i+2 IF ID EX MEM WB Instr. i+3 IF ID EX MEM WB Instr. i+4 • Tendremos cinco etapas, una por cada paso de ejecución de una instrucción • Cada etapa del pipeline se completa en un ciclo de reloj • Cada instrucción toma el mismo número de etapas (5) para ejecutarse, aunque algunas de ellas estén inactivas algunas veces • Mejora el throughput aunque la latencia de cada instrucción no se reduce Una vez el pipeline está lleno, se finaliza una instrucción cada ciclo (CPI = 1)
Representación gráfica del pipeline • Útil para: • Saber cuántos ciclos de reloj toma la ejecución de un código • Saber qué hace una unidad funcional en un ciclo determinado • Si ocurre un riesgo (hazard), saber porqué y saber cómo resolverlo
Riesgos (Hazards) • El principio de la segmentación es simple pero su implementación introduce una serie de problemas Riesgos (Hazards) • Situaciones en las cuales la próxima instrucción no puede ejecutarse en el siguiente ciclo de reloj • Pueden obligar a detener (stall) el pipeline, evitando que se logre el speedup ideal • Los riesgos se pueden resolver esperando, pero será el controlador del pipeline quien los detecte y resuelva • Tipos: • Riesgos estructurales (Structuralhazards) • Riesgos de datos (Data hazards) • Riesgos de control (Control hazards)
Riesgos estructurales • ¿Qué sucede con los accesos al banco de registros? • Para resolver el riesgo estructural al momento de acceder al banco de registros, las escrituras se realizan en la primera mitad del ciclo, y las lecturas en la segunda add$t0, $t1, $t2 Instr. 1 Instr. 2 add $s2, $t0, $s3 Clock Flanco de reloj que controla la escritura de resultados en el banco de registros Flanco de reloj que controla la lectura de operandos del banco de registros
Riesgos de datos • Considere la ejecución segmentada de la siguiente secuencia de instrucciones: add$t0, $t1, $t2 sub $t3, $t0, $t4 and $t5, $t0, $t6 or $t7, $t0, $t8 nor $t9, $t0, $t9 • Las dependencias de datos hacia atrás en el tiempo ocasionan riesgos de datos
Adelantamiento (Forwarding, bypassing, short-circuiting) • Técnica hardware para solucionar algunos riesgos de datos • No es necesario esperar a que una instrucción se ejecute por completo para resolver el riesgo de datos • Es posible usar un resultado tan pronto como se calcula, sin tener que esperar a que sea escrito en el banco de registros • Requiere conexiones extras en el datapath • Los caminos de adelantamiento son válidos si la etapa de destino es posterior en el tiempo a la etapa de origen
Adelantamiento (Forwarding, bypassing, short-circuiting) Ejemplo 1: add$t0, $t1, $t2 sub $t3, $t0, $t4 and $t5, $t0, $t6 or $t7, $t0, $t8 nor $t9, $t0, $t9
Adelantamiento (Forwarding, bypassing, short-circuiting) Ejemplo 2: add $t0, $t1, $t2 lw $t3, 0($t0) sw $t3, 12($t0)
Adelantamiento (Forwarding, bypassing, short-circuiting) • No todos los riesgos de datos pueden resolverse mediante adelantamiento • Riesgo de datos asociado con el uso de LOAD Pipeline sin detección de riesgo ld$t1, 0(t0) sub $t3, $t1, $t2 and $t4, $t1, $t5 or $t6, $t1, $t7 Pipeline con detección de riesgo ld $t1, 0(t0) sub $t3, $t1, $t2 and $t4, $t1, $t5 or $t6, $t1,$t7 No es posible el adelantamiento
Reordenamiento de código para evitar paradas del pipe • Ejemplo: Considere un segmento de código MIPS. Determine los riesgos y reordene el código para evitar paradas del pipeline lw $t1, 0($t0) lw $t2, 4($t0) add $t3, $t1, $t2 sw $t3, 12($t0) lw $t4, 8($t0) add $t5, $t1, $t4 sw $t5, 16($t0) lw $t1, 0($t0) lw$t2, 4($t0) add $t3, $t1, $t2 sw $t3, 12($t0) lw$t4, 8($t0) add $t5, $t1, $t4 sw $t5, 16($t0) lw $t1, 0($t0) lw $t2, 4($t0) lw $t4, 8($t0) add $t3, $t1, $t2 sw $t3, 12($t0) add $t5, $t1, $t4 sw $t5, 16($t0) stall stall 13 ciclos 11 ciclos
Riesgos de control • 17% de las instrucciones MIPS ejecutadas son saltos (bne, beq) (SPECint2006) • Los saltos determinan el flujo de programa • La siguiente instrucción a ejecutar depende del resultado del salto beq instr. 1 instr. 2 instr. 3 instr. 4
Riesgos de control Solución inicial: Stallonbranch • Detenerse hasta que la decisión de salto sea tomada para buscar la siguiente instrucción • Insertar burbujas (instrucciones nop, No Operation, aquellas que no hacen nada y sólo ocupan tiempo) para retrasar la búsqueda de la siguiente instrucción durante 2 ciclos • En nuestro caso, los saltos toman 3 ciclos de reloj cada uno (el comparador está en la etapa EX)
Riesgos de control Optimización #1 • Insertar un comparador para saltos en la segunda etapa (ID) • Tan pronto como se decodifica la instrucción de salto, tomar una decisión y ajustar el nuevo valor del PC • Como el salto se completa en la segunda etapa, sólo se introduce una burbuja • Los saltos toman 2 ciclos de reloj cada uno (el comparador está en la etapa ID) • Esto significa que los saltos están inactivos en las etapas 3, 4 y 5 (EX, MEM y WB, respectivamente)
Riesgos de control Optimización #2. Redefinición de los saltos Antes: • Si el salto se toma, ninguna de las instrucciones que siguen al salto se ejecutan por accidente Ahora: • Se tome o no el salto, la instrucción inmediatamente posterior al salto se ejecuta (y se denomina branchdelay slot, hueco de salto diferido o retardado) • El término delayedbranch(salto diferido o retardado) significa que la instrucción que sigue al salto siempre se ejecuta • Esta optimización es la que emplea MIPS
Riesgos de control Comportamiento del salto diferido (delayedbranch) Es trabajo del compilador lograr que la instrucción que ocupa el hueco diferido sea válida y útil
Riesgos de control Branchdelay slot(Comentarios) Como la instrucción que sigue al salto siempre se ejecuta: • Escenario del peor caso: insertar una burbuja en el hueco de salto retardado porque no hay otra alternativa • Escenario del caso más favorable: es posible encontrar una instrucción anterior al salto que pueda insertarse en el hueco de salto diferido sin que el flujo de programa se vea afectado • El reordenamiento de instrucciones es una práctica común para acelerar programas • El compilador debe ser muy hábil para encontrar las instrucciones adecuadas • Normalmente el 50% de las veces se hallan estas instrucciones
Riesgos de control • Gestión del hueco de salto diferido por parte del compilador • En las dos últimas opciones, la ejecución de la instrucción que se mueve no debe producir problemas si el salto va en la dirección contraria a la esperada add $s1, $s2, $s3 beq $s2, $zero, LBL . . . LBL: add $s1, $s2, $s3 beq $s1, $zero, LBL or $t1, $t2, $t3 . . . LBL: sub $t4, $t5, $t6 LBL: sub $t4, $t5, $t6 . . . add $s1, $s2, $s3 beq $s1, $zero, LBL hueco de salto hueco de salto hueco de salto se transforma en se transforma en se transforma en add $s1, $s2, $s3 beq $s1, $zero, LBL . . . LBL: sub $t4, $t5, $t6 beq $s2, $zero, LBL . . . LBL: LBL: sub $t4, $t5, $t6 LBLx: . . . add $s1, $s2, $s3 beq $s1, $zero, LBLx add $s1, $s2, $s3 or $t1, $t2, $t3 sub $t4, $t5, $t6
Lecturas recomendadas • Computer organization and design. The hardware/software Interface, 3rd ed., Chapter 5. D. Patterson & J. Hennessy. Morgan Kaufmann Publishers