Download Paralelismo en computación secuencial
Document related concepts
no text concepts found
Transcript
Computador secuencial Paralelismo en computación secuencial Mario Medina C. mariomedina@udec.cl • Elementos • Memoria • Procesador • Buses de interconexión • Todos estos pueden ser cuellos de botella del desempeño • Solución? Paralelismo! • A nivel de operaciones básicas • A nivel de instrucciones Ejemplo: multiplicación de enteros • Multiplicar 2 números enteros de n bits • Realizar n sumas con desplazamiento sucesivas • Operación requiere Ejemplo: multiplicación de enteros • Diagrama muestra circuito para 4 bits • n sumadores completos (FA) • n compuertas AND • 2 registros para almacenar resultados Ejemplo: multiplicación de enteros • En cada ciclo, se multiplica 1 bit de a por b, y se acumula el resultado Ejemplo: multiplicación de enteros • Multiplicador paralelo de 4 bits • El LSB del resultado se almacena en un registro de desplazamiento • n-1 bits superiores se almacenan en registros acumulador y se vuelven a sumar • Multiplicación de n bits requiere n ciclos de reloj • Solución: Más hardware! © 2014 Mario Medina C. 1 Ejemplo: multiplicación de enteros • Multiplicador paralelo requiere más hardware • n2 compuertas AND y n(n – 1) FA • Tserial = nTsuma = n2TFA • Tparalelo = 2(n – 1)TFA • Retardo del sumador limita velocidad del reloj • Sumador por propagación de acarreo • Sumador por anticipación de acarreo Tendencias en procesadores • Paralelismo implícito y explícito • Paralelismo implícito • Avances en hardware se traduce en ejecución de instrucciones en paralelo • Paralelismo invisible al programador y/o usuario • Paralelismo explícito • Expuesto al programador • Requiere de directivas para manejar concurrencia • Bibliotecas, lenguajes, etc. Velocidad de reloj de CPU Mayor velocidad de reloj de CPU • • • Enfoque principal de los últimos años Desempeño limitado por la memoria Mayor nivel de integración • • Mayor número y densisdad de transistores Qué hacer con ellos? • • • Mayor número de unidades funcionales Múltiples instrucciones en ejecución Paralelismo Tendencias en CPUs Intel Consumo de potencia de CPU • Disipación dinámica de potencia de una CPU es función de las capacitancias parásitas C, la frecuencia de reloj f y el voltaje de la fuente V • Pd = CfV2 • Reducir tamaño del transistor reduce C • Reducir voltaje de 5.0[V] a 2.2[V] a 1.2[V] a 0.9[V] • Aumenta susceptibilidad al ruido © 2014 Mario Medina C. 2 Alternativas para aumentar desempeño • Pipelining • • Paralelismo a nivel de instrucción Ejecución superescalar • • • Paralelismo a nivel de hebra VLIW • • Técnica usada para aumentar el throughput de instrucciones ejecutadas por unidad de tiempo • Dividir procesamiento de instrucción en serie de pasos independientes • Requiere almacenamiento intermedio • Procesamiento de instrucciones avanza a la velocidad de la etapa más lenta Paralelismo a nivel de instrucción Multithreading • Segmentación (Pipelining) Paralelismo a nivel de instrucción Sistema sin pipeline Sistema con pipeline • Dividir operación en 3 etapas A, B y C Hardware sin pipeline 300 ps 20 ps R e Latencia = 320 ps g Throughput = 3.12 GOPS Lógica combinacional • Tres operaciones diferentes comparten el hardware • Agregar registros de pipeline entre etapas • Almacenar resultados intermedios • Operación demora ahora 3 ciclos de reloj Reloj Diagrama de tiempo OP1 OP2 OP3 • Latencia operación: 360 ps • Cada 120 ps termina una operación • Aumento del throughput: 3 ops en 360 ps Tiempo Sistema con pipeline Pipelining no uniforme • Figura muestra pipeline ideal Sistema con pipeline de 3 etapas 20 ps 100 ps 20 ps 100 ps 20 ps Lógica comb. A R e g Lógica comb. B R e g Lógica comb. C R e g • Qué pasa si son de largos distintos? Reloj • Etapas que no pueden subdividirse: Diagrama de tiempo OP1 OP2 OP3 • 3 etapas independientes, del mismo largo 100 ps A B A C B A Tiempo © 2014 Mario Medina C. C B C Latencia = 360 ps Throughput = 8.33 GOPS • Desempeño limitado por etapa más larga • Otras etapas tienen tiempo ocioso • Acceso a memoria • Accesos a tablas de consulta (Lookup Tables) 3 Pipeline no uniforme Profundidad del pipeline • Profundidad del pipeline determina aumento de desempeño Hardware: Pipeline de 3 etapas, retardos no uniformes 50 ps 20 ps 150 ps 20 ps 100 ps 20 ps Lógica Comb. A R e g Lógica Comb. B R e g Lógica Comb. C R e g • Dividir hardware en pipeline de 6 etapas Diagrama de tiempos OP1 OP2 OP3 A • A más niveles, mayor latencia • Retardos de registros limitan aumento B Clock Latencia = 510 ps Throughput = 5.88 GOPS C A B C A B C Tiempo • Latencia es 420 ps • Throughput es 14.29 GOPS • Retardo de registros representa un 29% Pipeline de 6 etapas Ventajas de pipelining Latencia = 420 ps Throughput = 14.29 GOPS 50 ps 20 ps 50 ps 20 ps 50 ps 20 ps 50 ps 20 ps 50 ps 20 ps 50 ps 20 ps Logica Comb. R e g Logica Comb. R e g Logica Comb. R e g Logica Comb. R e g Logica Comb. R e g Logica Comb. Reloj •Throughput y latencia aumentan •Pentium 4 tiene pipeline de 20 etapas! R e g • Aumenta el throughput: más instrucciones terminadas por unidad de tiempo • Aprovecha mejor el hardware • Todos los componentes de la CPU están ocupados en un instante dado • CPU con pipeline puede (en teoría) ejecutar una instrucción cada ciclo • Desempeño del pipeline se mide en CPI: Ciclos por Instrucción • Desempeño ideal: 1 ciclo por instrucción Desventajas de pipelining • Aumenta la latencia de una instrucción • Programa supone que una instrucción se inicia después de terminada la anterior • No es verdad en CPU con pipeline • Desempeño se ve perjudicado por pipelines largos y saltos condicionales • Cada 6 instrucciones hay un salto (típico) • CPU con pipeline es más cara y compleja de diseñar e implementar Ejemplo de pipeline • Pipeline RISC clásico de 5 etapas • • • • • Instruction Fetch (IF) Instruction Decode (ID) Execute (EXE) Memory (MEM) Write Back (WB) 1 2 3 4 5 Instr. 1 Instr. 2 Instr. 3 © 2014 Mario Medina C. IF ID IF 6 7 EXE MEM WB ID IF EXE MEM WB ID EXE MEM WB 4 Ejemplo de pipeline • Instruction Fetch (IF): Se lee la instrucción a ejecutar y se calcula la dirección de la próxima instrucción • Instruction Decode (ID): Decodifica la instrucción y lee datos desde los registros • Execute (EX): Se realiza la operación • Memory (MEM): Se accede a memoria • Writeback (WB): Se escriben los resultados a los registros Ejemplo de pipeline: STORE • Instrucción STORE R2, M[1500] • IF: Lee la instrucción STORE • ID: Decodifica la instrucción STORE y lee registro R2 • EX: No hay operación aritmética • MEM: Escribe R2 en la posición de memoria M[1500] • WB: No hay escritura a registros Peligros en pipelines • Peligros estructurales • Dos instrucciones consecutivas quieren usar el mismo hardware • A veces, se resuelven dividiendo el hardware • En el ejemplo, la memoria es leída dos veces por ciclo • En el ciclo IF se lee la instrucción • En el ciclo MEM se leen los datos • Soluciones • Memoria que soporta 2 accesos por ciclo • Memoria de instrucciones y memoria de datos © 2014 Mario Medina C. Ejemplo de pipeline: LOAD • Instrucción LOAD M[1000], R1 • • • • • IF: Lee la instrucción LOAD ID: Decodifica la instrucción LOAD EX: No hay operación aritmética MEM: Lee la posición de memoria M[1000] WB: Escribe el dato leído en el registro R1 Ejemplo de pipeline: ADD • Instrucción ADD R2, R3 • IF: Lee la instrucción ADD • ID: Decodifica la instrucción ADD y lee registros R2 y R3 • EX: Suma registros R2 y R3 • MEM: No hay acceso a memoria • WB: Escribe resultado de la suma en el registro R3 Peligros en pipelines • Peligros de datos • Producidos por dependencias entre los datos de instrucciones consecutivas • Tres tipos: • Read-After-Write (RAW) • Write-After-Read (WAR) • Write-After-Write (WAW) • Se resuelven con forwarding y stalling • Peligros de control • Producidos por saltos 5 Peligro de datos • Dependencia de datos entre instrucciones • Código a ejecutar SUB R3, R4 AND R4, R6 • Este tipo de peligro se llama Read-AfterWrite (RAW) Peligro de datos • Resultado de resta se almacena en el ciclo WB de instrucción SUB • Valor de R4 se lee en el ciclo ID de AND • Instrucción lee el valor equivocado de R4! • El hardware debe asegurarse que R4 se lee por instrucción AND sólo después de ser escrito por instrucción SUB Forwarding • Forwarding redirige los resultados intermedios de una instrucción a las instrucciones siguientes que los necesitan • En rigor, instrucción AND requiere valor de R4 al comienzo de ciclo EXE Forwarding • Redirección de resultados permite que instrucciones se ejecuten sin demoras • CPI: un instrucción por ciclo • Redirigir resultado R4 de instrucción SUB a la ALU en ciclo EXE de instrucción AND siguiente Stalling • No siempre es posible hacer forwarding de resultados • En ese caso, sólo se puede detener el pipeline por uno o más ciclos • Hay un ciclo ocioso en el pipeline • Se introduce una burbuja en el pipeline • El stalling aumenta el CPI de la CPU • Impacto negativo en el desempeño © 2014 Mario Medina C. Stalling • Ejemplo: usar un dato inmediatamente después de su lectura • LOAD Dato, R4 • AND R4, R6 • Dato se lee desde la memoria y está disponible al final del ciclo MEM de LOAD • Instrucción AND necesita el valor de R4 al comienzo de ciclo EXE 6 Stalling Stalling • Instrucción AND no puede proceder! • No puede hacerse forwarding • Sólo es posible demorar el pipeline Otros peligros de datos • Write-After-Read (WAR) • Solución: detener el pipeline por un ciclo mientras dato llega desde la memoria • Burbuja: ciclo ocioso en el pipeline Otros peligros de datos • Write-After-Write (WAW) • Una instrucción trata de escribir un resultado antes que sea leído por otra ADD R1, R3, R4 SUB R1, R2, R3 • Una instrucción trata de escribir un resultado antes que sea escrito por otra ADD R4, R7, R2 SUB R1, R3, R2 • Instrucción SUB no puede ejecutarse si instrucción ADD no ha leído R3 • Problema si hay ejecución concurrente o cambio de orden de instrucciones • Instrucción SUB no puede ejecutarse si instrucción ADD no ha escrito R2 • Problema si hay ejecución concurrente o cambio de orden de instrucciones • No es el caso en nuestro pipeline simple • No es el caso en nuestro pipeline simple Peligros de control • Se producen por la ejecución de saltos condicionales • En nuestro pipeline, los saltos se deciden al final del ciclo EXE • Pero la instrucción 2 es leída durante la etapa Decode de la instrucción 1, y aún no se sabe si el salto se realiza! 1 Instr. 1 Instr. 2 Instr. 3 IF 2 3 4 5 6 ID EXE MEM WB IF © 2014 Mario Medina C. • Ejemplo de peligro de control SUB R4, R6 JZERO OTROLUGAR ADD R7, R6 • Resultado de SUB disponible al final de su ciclo EXE • Decisión de dónde saltar se toma al final del ciclo 4 • Cuál instrucción debe ser leída en el ciclo 3? 1 7 ID EXE MEM WB IF Peligros de control ID EXE MEM WB SUB JZERO ??? IF 2 3 4 5 6 7 ID EXE MEM WB IF ID EXE MEM WB IF ID EXE MEM WB 7 Peligros de control Desempeño de un pipeline • Para evitar el peligro de control, la lectura de la siguiente instrucción se demora hasta que se decide el salto al final del ciclo 4 SUB JZERO ??? 1 2 IF ID IF 3 4 5 6 7 8 Ts mN Tpipe N m 1 9 EXE MEM WB ID • El desempeño (Throughput) es N 1 Tpipe 1 m 1 N EXE MEM WB IF IF IF EXE MEM WB ID Desempeño pipeline Procesamiento superescalar • Otra alternativa para mejorar el desempeño de procesador secuencial Desempeño del pipeline en función de profundidad M M=5 M=10 M=30 M=100 1 • Paralelismo a nivel de instrucción • Ejecución simultánea de dos o más instrucciones del mismo código en un mismo ciclo (hoy en día 3 a 6) • Requiere duplicación de unidades funcionales en la CPU (hoy en día 2 a 6) • Independiente de la segmentación de la CPU 0.9 0.8 0.7 Razón N/T(pipe) • En pipelines de profundidad m, ejecutar N operaciones independientes requiere de N + m – 1 ciclos • La aceleración obtenida es 0.6 0.5 0.4 0.3 0.2 0.1 0 1 10 100 1000 N Ejecución superescalar • Se quiere sumar 4 enteros a partir de M[1000] LOAD M[0x1000], R1 LOAD M[0x1008], R2 ADD M[0x1004], R1 ADD M[0x100C], R2 ADD R1, R2 STORE R1, M[0x2000] © 2014 Mario Medina C. // // // // // // Lee d0 a R1 Lee d2 a R2 Suma d1 y d0 Suma d2 y d3 Suma todos Escribe suma Ejecución superescalar • Supongamos un procesador super-escalar de 2 vías • Una CPU con • 2 pipelines de acceso a memoria • 2 unidades de instrucción y control • Puede ejecutar 2 instrucciones a la vez • siempre y cuando éstas no tengan dependencias entre ellas • y que ellas no utilicen recursos que están ocupados 8 Ejecución superescalar • Ciclo Fetch transfiere múltiples instrucciones desde RAM a buffers de instrucción de CPU • Despachador de instrucciones de la CPU revisa el flujo de instrucciones y determina si pueden ejecutarse en paralelo • Dependencias de datos entre registros • Disponibilidad de unidades funcionales Ejecución superescalar LOAD Hardware de despacho de instrucciones LOAD ADD ADD ADD STORE Colas de instr. Buffer de instrucciones Unidad superescalar Ejecución superescalar 1 2 LOAD IF ID EX MEM WB LOAD IF ID EX MEM WB ADD IF ID EX MEM WB ADD IF ID EX MEM WB IF ID EX MEM WB IF ID ADD 3 STORE 4 5 6 7 8 EX MEM WB Dependencia de datos • En el programa anterior, existen dependencias de datos en el uso de registro R1 • Esto impide la ejecución paralela de instrucciones • Soluciones • Reescribir código para usar otros registros • Hardware renombra registros automáticamente para evitar conflicto • Intel Pentium fue el primer procesador x86 superescalar © 2014 Mario Medina C. Unidad superescalar Dependencia de datos • Se quiere sumar 4 enteros a partir de M[1000] • Código siguiente es equivalente al anterior, y hasta más corto LOAD M[0x1000], R1 // Lee d0 a R1 ADD M[0x1004], R1 // Suma d1 a R1 ADD M[0x1008], R1 // Suma d2 a R1 ADD M[0x100C], R1 // Suma d3 a R2 STORE R1, M[0x2000] // Escribe suma Otras dependencias • Dependencias de recursos • Instrucciones que acceden a un solo recurso común no pueden ejecutarse en paralelo • Puede resolverse con reordenamiento de instrucciones • Dependencias de saltos • Destino del salto se conoce sólo al ejecutar la instrucción • Predicción de saltos • Ejecución especulativa y rollbacks 9 Reordenamiento de instrucciones • Sumar 4 números a partir de M[1000] LOAD M[0x1000], R1 ADD M[0x1004]. R1 LOAD M[0x1008], R2 ADD M[0x100C], R2 ADD R1, R2 STORE M[0x2000], R1 // // // // // // Lee d0 en R1 Suma d0 y d1 Lee d2 en R2 Lee d3 en R2 Suma datos Escribe suma Despacho dinámico de instrucciones • Procesador puede despachar instrucciones fuera de orden para aumentar paralelismo • Explota al máximo paralelismo del código • Si instrucciones usan diferente número de etapas del pipeline, pueden también finalizar fuera de orden • Estado del procesador consistente con ejecución secuencial • Aparece en procesador Intel Pentium Pro Uso de recursos en CPU superescalar • Supongamos CPU superescalar con 2 ALUs • En el 1er. ejemplo, éstas se usan sólo en 3 ciclos de 8 posibles • Difícil llenar todos los ciclos • Procesador subutilizado • Superescalar ≤ 4 vías 4 5 6 7 © 2014 Mario Medina C. Reordenamiento de instrucciones • Caso similar al primer ejemplo, pero • Hay dependencia de datos entre instrucciones 1 y 2 • Limita paralelismo • Procesador inteligente podría examinar instrucciones y reordenarlas en tiempo de ejecución, o bien • Compilador inteligente podría reordenar instrucciones en tiempo de compilación Despacho dinámico de instrucciones • Consistencia con ejecución secuencial • Ejemplo: ejecución de DIV R1, R2, R3 ADD R4, R5, R6 • Ambas instrucciones son independientes • Orden de ellas podría ser intercambiado • Qué pasa si la primera genera una división por cero? • Estado final de la CPU será distinto Limitaciones de procesador superescalar • Paralelismo es extraído por hardware • Detección de paralelismo está limitada por espacio ocupado en el chip • Puede ser entre el 5 y 10% del chip! • Limitado por cuántas instrucciones futuras son revisadas por el hardware • Complejidad aumenta cuadráticamente con número de instrucciones • Es necesario revisar n2 posibles conflictos entre n instrucciones 10 Simultaneous Multi-Threading (SMT) • CPU ejecuta simultáneamente instrucciones de diferentes hebras • Extensión de procesador superescalar • Evita conflictos por dependencia de datos • Requiere lectura paralela de instrucciones de 2 ó mas hebras • Requiere más bancos de registros • Requiere más unidades de control de acceso a memoria Simultaneous Multi-Threading (SMT) • CPU mantiene múltiples copias de • Registros de control, datos y estado • Punteros a la pila y de instrucción • CPU puede ejecutar múltiples hebras de código, que comparten recursos • Pipelines • Colas y caches • SMT aprovecha mejor el hardware • HW de control es más complejo Simultaneous Multi-Threading (SMT) Simultaneous Multi-Threading (SMT) • Diagrama muestra operación de CPU con múltiples pipelines • Diagrama muestra operación de CPU con múltiples pipelines y SMT de dos vías • Burbujas debido a dependencias, latencias de memoria, lazos muy cortos, errores en la predicción de saltos, etc • Flujos de instrucciones comparten caches y pipelines, teniendo sus propios registros y unidades de control Intel Hyper-Threading Problemas con SMT • Intel implementa SMT de dos vías (HyperThreading) a partir del Pentium 4 • No mejora el desempeño de un hebra • Aumenta consumo de potencia por CPU • Puede demorar ejecución de códigos si un recurso compartido es cuello de botella • Puede degradar desempeño de cache • Han habido instancias en que una hebra lee datos criptográficos de la otra hebra, desde la cache compartida • Aumenta el costo de sincronización • Intel dice que obtiene en promedio 30% de aumento de desempeño a un costo de 5% más de área en el chip • CPU con HT es vista como 2 CPUs por el sistema operativo y hace balance de carga • Para Multi-Core con Hyper-Threading, sistema operativo debe ser “HT-Aware” © 2014 Mario Medina C. 11 Very Long Instruction Word (VLIW) • Alternativa para explotar el paralelismo al nivel de instrucción • Programador debe indicar explícitamente las instrucciones que se pueden ejecutar en paralelo • Hardware es más simple que superescalar, pero el compilador es mucho más complejo Very Long Instruction Word (VLIW) • Múltiples unidades funcionales • Instrucciones deben tener al menos una operación para cada unidad funcional • Instrucciones se despachan juntas en VLIW y se ejecutan en paralelo • Análisis de compilación identifica y agrupa instrucciones independientes • Resuelve dependencias al compilar Very Long Instruction Word (VLIW) Ejecución superescalar Compilador para VLIW LOAD LOAD ADD • Transformaciones de código mucho más complejas ADD ADD STORE VLIW Buffer de instrucciones • Hardware de despacho es más simple • Compilador puede revisar más código para aumentar concurrencia Instrucción Instrucción Instrucción Unidad Funcional HW Unidad Funcional HW Unidad Funcional HW • Instrucciones para ejecución especulativa de código • VLIW actual: procesadores embebidos y procesadores digitales de señales • 4 a 8 instrucciones concurrentes Críticas a VLIW • Compilador no tiene información sobre estado dinámico del programa • En memoria jerárquica, tiempo de acceso a memoria no es constante • Tiempo de acceso a memoria no uniforme interfiere con planificación hecha por el compilador • Código puede crecer mucho • Muchas unidades funcionales desocupadas © 2014 Mario Medina C. 12