Arquitecturas Paralelas Carlos Figueira Última actualización: Diciembre 1996 Contents 1 Generalidades sobre Paralelismo 1.1 Aplicaciones del paralelismo . . . . . . . . . . . . . . . . 1.2 Supercomputación en Venezuela . . . . . . . . . . . . . . 1.3 Mecanismos paa lograr mayor desempeño a nivel de HW 1.4 Taxonomı́a sencilla de computadoras . . . . . . . . . . . 1.5 Observaciones sobre diseños de nuevas máquinas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 4 5 5 5 2 Introducción 2.1 Desempeño: latencia y ancho de banda . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Ley de Amdahl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 ¿Cómo medimos el desempeño de un computador para poder compararlo con otro? 2.4 Programas para medir desempeño . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5 Otros errores y/o suposiciones incorrectas comunes en la medida de desempeño . . 2.6 Bibliografı́a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 7 8 9 10 11 3 Pipelining y máquinas vectoriales 3.1 Factores que limitan speedup ideal de un pipeline 3.2 Complicaciones adicionales en manejo de pipeline 3.3 Más velocidad aún . . . . . . . . . . . . . . . . . 3.4 Falacias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 12 15 15 16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Máquinas vectoriales 4.1 Arquitecturas vectoriales . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 ¿ Cómo guardar matrices en un banco de mem. intercaladas de forma y por columna sea lo más rápido posible? . . . . . . . . . . . . . . . . 4.3 ¿Qué otros tipos de accesos se utilizan? . . . . . . . . . . . . . . . . . 4.4 Arquitecturas basadas en reg. vect . . . . . . . . . . . . . . . . . . . . 4.5 Mejoras a máquinas vect. . . . . . . . . . . . . . . . . . . . . . . . . . 4.6 Métricas adicionales para medir desempeño de maqs vect. . . . . . . . 4.7 Trampas y falacias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . que el . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . acceso por fila . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Sub-sistema de memoria 5.1 Cache . . . . . . . . . . . . . . . . . . . 5.2 Organización de un cache . . . . . . . . 5.3 Polı́ticas a definir para manejo de cache 5.4 Problemas abiertos . . . . . . . . . . . . 5.5 Efecto de las fallas . . . . . . . . . . . . 5.6 Cache en arq. vectoriales . . . . . . . . 5.7 Polı́ticas de actualización de mem. ppal 5.8 Cache y E/S . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 17 18 18 19 19 20 21 22 22 22 23 23 23 23 24 24 6 CASO MAQUINA VECTORIAL: CRAY 6.1 CRAY Y-MP C90 . . . . . . . . . . . . . . . . . . . . . . 6.1.1 Generalidades . . . . . . . . . . . . . . . . . . . . . 6.1.2 Pipelining and segmentation . . . . . . . . . . . . 6.1.3 Sección de comunicación inter-procesadores (ICS) . 6.1.4 Sección de cómputo del CPU . . . . . . . . . . . . 6.2 Sección de control del CPU . . . . . . . . . . . . . . . . . 6.3 Procesamiento paralelo . . . . . . . . . . . . . . . . . . . . 6.3.1 Memoria . . . . . . . . . . . . . . . . . . . . . . . . 6.3.2 I/O . . . . . . . . . . . . . . . . . . . . . . . . . . 6.4 Programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 26 26 26 26 26 27 27 27 27 28 7 Cray Y-MP E 28 7.1 Generalidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 7.1.1 Diferencias con C90 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 8 CRAY-1 28 8.1 CRAY-2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 8.2 CRAY-3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 8.3 CRAY X-MP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 9 Introducción a MIMD 9.1 Definición y objetivos . . . . . . 9.2 Modelos de desempeño . . . . . . 9.3 Granularidad . . . . . . . . . . . 9.4 Conclusiones sobre el desempeño 9.5 Taxonomı́a de MIMD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 30 30 31 31 32 10 Redes de Interconexión 10.0.1 Introducción . . . . . . . . . . . . 10.1 Buses . . . . . . . . . . . . . . . . . . . . 10.2 Conmutadores de barras cruzadas o x-bar 10.3 Redes Multi-etapas . . . . . . . . . . . . . 10.3.1 Red de Clos . . . . . . . . . . . . . 10.3.2 Red de Benes̆ . . . . . . . . . . . . 10.3.3 Redes Banyan . . . . . . . . . . . . 10.3.4 Desempeño y ancho de banda . . . 10.3.5 Conclusión redes multi-etapas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 34 34 35 36 37 37 37 37 37 11 MIMD Memoria Compartida 11.1 Técnicas de sincronización . 11.1.1 Test and Set . . . . 11.1.2 Incr y decr. . . . . . 11.1.3 Compare and Swap . 11.1.4 Fetch and Add . . . 11.2 Barreras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 38 38 39 39 39 40 12 MIMD Memoria Distribuida 12.1 La comunicación . . . . . . 12.2 Enrutamiento . . . . . . . . 12.3 Topologı́as fijas . . . . . . . 12.3.1 Topologı́as comunes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 41 42 44 44 . . . . . . . . . . . . . . . . . . . . 13 MIMD: Esquemas Hı́bridos 13.1 Motivación . . . . . . . . . . . . . . . . . . . . 13.2 Implementación de coherencia dinámica . . . . 13.3 Sistemas basados en directorios . . . . . . . . . 13.3.1 Directorios centralizados vs distribuidos 13.4 Latencia en accesos remotos . . . . . . . . . . . 13.4.1 Modelos de consistencia relajados . . . . 13.4.2 Prefetching . . . . . . . . . . . . . . . . 13.4.3 Multithreading . . . . . . . . . . . . . . 13.5 Problemas de la asincronı́a . . . . . . . . . . . . 13.6 Soporte para Sistemas Operativos . . . . . . . . 13.7 Casos . . . . . . . . . . . . . . . . . . . . . . . 13.7.1 DASH . . . . . . . . . . . . . . . . . . . 13.7.2 Alewife . . . . . . . . . . . . . . . . . . 13.7.3 KSR-1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 46 47 48 48 49 49 49 50 50 50 51 51 51 52 14 Subsistema de Entrada/Salida: 14.1 Esquema tı́pico de dispositivos de E/S . . 14.1.1 Caracterización de la carga de E/S 14.2 Benchmarks en el mundo de E/S . . . . . 14.2.1 Aplicaciones . . . . . . . . . . . . . 14.2.2 Sintéticos . . . . . . . . . . . . . . 14.3 Discos . . . . . . . . . . . . . . . . . . . . 14.4 Arreglo o baterı́a de discos . . . . . . . . . 14.4.1 Niveles de RAID . . . . . . . . . . 14.4.2 Comparación de niveles de RAID . 14.5 Caso MIMD: iPSC/2 . . . . . . . . . . . . 14.6 Otros casos . . . . . . . . . . . . . . . . . 14.6.1 CM-2 . . . . . . . . . . . . . . . . 14.6.2 CRAY Y-MP C90 . . . . . . . . . 14.7 Misceláneas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 53 53 55 55 56 56 56 56 57 57 57 57 57 58 15 Máquinas SIMD 15.1 Arreglos de Procesadores 15.2 Experiencias en SIMD . . 15.3 Caso: el CM-2 . . . . . . 15.3.1 Procesador . . . . 15.3.2 Comunicaciones . . 15.3.3 I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 59 60 60 60 61 61 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Generalidades sobre Paralelismo archivo: general.tex [1 clase] Contenido Aplicaciones del paralelismo — Grandes desafı́os — Supercomputación en Venezuela — Mecanismos para lograr mayor desempeño a nivel de harware — Taxonomı́a elemental de computadores — Observaciones sobre diseños de nuevas máquinas 1.1 Aplicaciones del paralelismo ¿ Qué pbs. se corren en para.? ¿ Cómo se mejora el desempeño en Supercomputadoras? • Laboratorios virtuales ( 3er paradigma de ciencia, junto a exper. y teorı́a) • Manufactura: robótica, control de sistemas, diseño de plantas • Economı́a: modelos socio-económicos • Medicina: Procesos bioquı́micos, diseño de medicamentos y fármacos, investigación genética, diseño de prótesis y herramientas para colocarlas • Quı́mica computacional: diseño de catalizadores, membrana, nuevos materiales • Ingenierı́a – – – – Diseño de automóviles (choques), aviones Análisis de estructuras Seguridad de plantas nucleares Modelaje de redes de transmisión de electricidad Grandes desafı́os en supercomputación. 1.2 Supercomputación en Venezuela La industria petrolera Algunas aplicaciones iniciales no eran de interés en Vzla, e.g.: licitaciones para pozos. Pero en cambio: Exploración • 2 millones de LOC en Geofı́sica,INTEVEP. • Procesamiento de imágenes sı́smicas (2D vs. 3D) 3D influye en flujo de caja al recuperar grandes volúmenes más rápido (es decir, primero el más grande, p.e.) Recuperación Pozos estructurales vs. reactores termoquı́micos / Modelos de percolación (autámatas celulares) / Modelaje de yacimientos (grids heterogéneos) (30.000 lı́neas - black oil sim.) / Petroquı́mica y derivados (quı́mica computacional). Refinación El modelo SIMPAR (modelo de área) / Modelos son realmente lineales? Los ceros ... Otras industrias CVG / Electricidad — Edelca (powergrid ...) / Banca (sist. dist. de alta disponibilidad. Modelo de inversión y carteras de activos) 1.3 Mecanismos paa lograr mayor desempeño a nivel de HW Varios procesadores: Conexión ¿C?ómo conectarlos entre sı́? Memoria Esquema de memoria compartida / Distribuı́da / Hı́brido I/O ¿ Cómo se accesa ? Multiplicidad de unidades funcionando en cada CPU • varias ULAS • varios sumadores, mult., etc., independientes (superscalar) => uso de marcadores (scoreboards) para llevar cuenta de registros y unidades funcionales requeridas • unidades “paralelas” (sumador par. en vez de bit-serial, comp. paralelo, etc) esto no lo veremos • segmentación encauzada en CPU Ciclos más cortos para instrucciones más frecuentes (RISC, también op. más comunes tienen long. más corta) Solapamiento de op. CPU y E/S (E/S ind.): Controladores de E/S. DMA Uso de jerarquı́a de memoria Registros — Cache — Mem ppal — mem sec. El CPU suele ser 1000 veces más rápido que mem ppal. Problemas tı́picos de jerarquı́a • Cómo tener la inf. requerida en CACHE • Coherencia/actualización de CACHE y mem. ppal 1.4 Taxonomı́a sencilla de computadoras Flynn: SISD, SIMD, MISD (?), MIMD (SM/DM). (Pb: Vectorial?) En qué nos concentraremos durante el curso: Paralelismo peq., moderado y masivo La Ley de Amdahl vs. paralelismo masivo: los resultados de Gustafson 1.5 Observaciones sobre diseños de nuevas máquinas o ¿Cómo puede fracasar una máquina antes de salir? Un nuevo diseño debe tomar en cuenta: Funcionalidad requerida • soporte SO: UNIX, tam. de mem, manejo de mem. virtual, cambio de contexto • soporte lenguaje • pto flotante • someterse a estandares: pto flotante (IEEE,DEC,IBM), I/O bus (VME,SCSI,Futurebus), Redes – Ethernet Costo Tiempo de diseño diseños complejos tardan más Sobrevivir tendencias • hardware: capa. de DRAM: multiplica por 4 c/ 3 años. Chips de 4MB • de softw.: req. de memoria crece de 1.5 a 2 por año => bits de direccionamiento se consumen a 0.5 a 1 bit anual (razón de abandono de muchas arq.), mejoras de compiladores • mejoras en áreas: Supercomp. mejoran 19% por año Mainframes 16% Mini 20 % Micro 26 % Ejemplo planifica para una compañı́a y un fabricante le ofrece una nueva máquina que será 2x más rápida que las máq. de hoy, pero que saldrá en 3 años. Si es un micro, en 3 años la ind. tendrá 1.263 ≈ 2. Conclusión: no es ninguna ganga. 2 Introducción archivo: int.tex [2 clases aprox.] Contenido ¿Qué es paralelismo? — ¿Por qué paralelismo? — Paralelismo vs. Sist. Distribuidos — Tipos de paralelismo (resp. al número de proc.) — Orientación del curso — Cursos paralelismo USB — Niveles de aprovechamiento de máquinas paralelas Desempeño: latencia y ancho de banda — Ley de Amdahl — Medidas de desempeño: MIPS, MFlops — Falacias — Benchmarks — Bibliografı́a Mejoras Para mayor motivación, incorporar info sobre limitación inherente del secuencial: lentitud de evolución (curva de aumento del reloj de 25% por año, ley de Moore sobre avances de 60% anual en la densidad de chips). Estudiar los artı́culos de Gordon Bell en ACM del 89 [Bel89] y del 92 [Bel92] sobre futuro de la supercomputación, y [SC91] sobre arquitectura en general. 2.1 Desempeño: latencia y ancho de banda Recordar objetivos: • Maximizar desempeño en una máquina • Decidir entre dos arquitecturas • Diseño de arquitecturas de mayor desempeño ¿Qué es el desempeño (performance)? • Visión del programador: tiempo de respuesta/tiempo de ejecución/latencia • Visión de un director de centro: cantidad de trabajos por hora/throughput/ancho de banda (BW) Ejemplo: ¿Cuáles de las siguientes mejoras se reflejan en la latencia, ancho de banda o ambos (resp. a sist. monoprocesador)? Reloj más rápido: Ambos 1 Procesador por tarea: sólo BW Procesamiento en par. de programs cientı́ficos: Ambos BW y latencia no son completamente indptes.. Por ejemplo, un PIPELINE a nivel de tareas mejora BW pero no latencia. Generalmente empeora. Nos concentraremos en latencia. 2.2 Ley de Amdahl Principio de diseño para mejorar desempeño: acelerar el caso común (operaciones más frec.) Para cuantificar esto, usaremos la Ley de Amdahl (1966 o 67): Speedup = T. de ejec. sin usar aceleramiento T. de ejec. acelerado Ejemplo 1 Que mejora se obtiene si incorporamos un mecanismo que permite correr 10 veces más rapidamente, pero sólo se puede usar la mitad del tiempo: Speedup = Ttotal 1 = Ttotal 0.5 + + 2×10 Ttotal 2 0.5 10 ≈ 1.8 Ejemplo 2 Se mejora velocida del CPU 5x sin afectar tiempo de I/O, pero cuesta 5x. El CPU se usa sólo 50% del tiempo (el resto espera por I/O). El costo del CPU es 30% del costo del sistema. Basado en costo/beneficio ¿vale la pena la mejora? Speedup= 0.5+1 0.5 =1.67 5 Costo nueva maq.=( 31 × 5) + 23 =2.33 × Costo vieja maq. El costo aumenta más rapidamente que el speedup: no vale la pena! 2.3 ¿Cómo medimos el desempeño de un computador para poder compararlo con otro? Preguntar MIPS pico: poco representativo. Toma la más rápida! sostenido: en qué programa? Contraejemplo: RISC vs. CISC. Se pierde la noción de tiempo total de ejecución. Ejemplo de falacia del MIPS: Supongamos una arq. load/store, cuya mezcla de instr. en una carga representativa viene dada por: Instr. Frecuencia No. de ciclos que tarda Load 20% 2 Opr. ULA 40% 1 Store 12% 2 Branch 28% 2 Se construye un compilador optimizante que logra reducir las inst. ULA en 50%. Con un reloj de 20 ns., compare los MIPS del código no optimizado con los del optimizado. El tiempo que tarda una instrucción promedio en ciclos por reloj (CPI) es X CP I = f reci × ciclos/instri i:Instruc M IP S = ciclos/seg CP I × 106 50M Hz M IP Sviejo = (0.2∗2+0.4∗1+0.12∗2+0.28∗2)∗10 =50/16=31.25 6 50M Hz M IP Snuevo = (2/8∗2+2/8∗1+1.2/8∗2+2.8/8∗2)∗106 =50/16=28.57 La compilación optimizante empeora el desempeño ? Dónde está el error? Resp: El nuevo ejecuta menos instrucciones. El tiempo CPU viejo es (No. Inst viejo)/(MIPS viejo 106 ) = 32 (No. Inst viejo) ns El tiempo CPU nuevo es (0.8)(No. Inst viejo)/(MIPS nuevo 106 ) = 28 (No. Inst viejo) ns Los fabricantes suelen publicar los MIPS de la siguiente manera: • MIPS sin derivación Meaningless Indicator of Processor Speed. • MIPS nativo (como el calculado antes): es necesrio completar con el nombre del programa usado, del # de instr. ensamblador por # de instr. lenguaje “standard” (e.g. C). • MIPS pico • MIPS relativo, por ejemplo, VAX MIPS, relativo a la VAX 11/780. Para que tenga sentido habrı́a que especificar con qué programa se hizo la medición, qué versiones de compilador y sistema, etc. MFlops = (# de flops en un programa)/(Tiempo de ejecución * 106 ) Mide operaciones flotantes, no instrucciones . Intenta independizarse del problema del # de ciclos por instrucción. Solo tiene sentido para programas instensivos en cálculo pto. flotante, sino absurdo (ej: compiladores). Inconvenientes: √ • Diverso set de operaciones. CRAY-2 no tiene div, mientras que 68882 tiene div y . • Heterogeneidad en tiempo de ejecución, por ejemplo, entre + y *. Una solución propuesta es normalizarlas (Normalized vs. native MFlops). Peso propuesto ADD,SUB,COMPARE,MULT 1 √ DIVIDE, 4 EXP,SIN 8 Ej: DEC 3100 corriendo SPICE. Nativo = 1.2 / Normalized = 1.7 Conclusión: usar? 2.4 la medición de desempeño depende del programa ejecutado. La pregunta es qué programa Programas para medir desempeño Mi carga promedio (my program mix): es lo ideal pero es poco realista, puesto que: • ¿cómo (y quién) corre el programa en todas las máqs disponibles? • ¿quién entona el programa? ¿cuánto se entona? Programa real representativo que cumpla con las siguientes caracterı́sticas: • Escrito en lenguaje de alto nivel (portable) • Representativo de algún estilo de prog. o carga (eg: prog. numérica) • medición es fácil • amplia distribución Propuestos a nivel de supercomputación por un grupo de universidades y compañı́as: Perfect Club. Es un conjunto abierto de programas/algoritmos. A nivel general: SPEC (Systems Performance Evaluation Cooperative Effort), propuesto por un grupo que incluye practicamente todas las compañı́as importantes (IBM,ATT, SUN, DEC, etc). SPEC es un conjunto de 10 programas de amplia difusión: GNU C, Circuit simulator, Monte Carlo sim., LISP interpreter, Numerical kernels, etc. Kernels: Son pequeños pedazos de programas muy utilizados que han sido extraı́dos para medir desempeño. Ejemplos son los “Livermore Loops” (24 lazos internos de comp. num. en fı́sica) y “Linpack”. Linpack es un paquete de programas para álgebra lineal, el cuál suele utilizar BLAS (Basic Linear Algebra Subrotines). Las subrutinas de BLAS operan sobre arreglos unidimensionales y están escritas en ensamblador1 de cada máquina para max. perf. Existen varias versiones: simple y doble precisión, rolled/unrolled loops (para maq. vect. rolled es mejor!). Los inconvenientes de LINPACK son: no tiene div, no usa func. mat (sin,cos, etc), casi todo el tiempo en una función (saxpy)2 , y baja localidad de datos. Tpoy benchmarks No son nada representativos! Ej: criba de Erastótenes, Puzzle, Quicksort. Además adolecen de una serie de fallas: • 33% inst. ejecutadas son asig. de const. • 5% asig. con result. de una expr. • no hay “while” • 50% son eval. control de lazos • Solo trabaja enteros • 58% variables son locales • Son tan pequeños que la rata de hit de datso/inst es practicamente 100%. Sintéticos: Tratan de combinar en un programa una mezcla de instrucciones que se considera “representativa”. Ej: Whetstones (en 1976-Algol 60, hoy en FORTRAN y PASCAL), tomado por estadı́sticas en un centro de cómputo. Peculiaridades: alto porc. de flotantes, 50% del tiempo ejecuta librerı́as mat., pocas variables locales (si se asignan var. glob a reg.— lo cual es muy raro —, el perf explota), alta local. de inst. Otro ejemplo: Dhrystones. Condsidera explic. pbs de loclaidad, caece de operacioens flotantes, hasta 40% en func. sobre strings, si se usa versión anterior a 2.1, un eliminador de “dead code” puede descartar hasta 25%! 2.5 Otros errores y/o suposiciones incorrectas comunes en la medida de desempeño • Afirmaciones tales como: tamaño igual velocidad, velocidad del reloj. • CPI puede calcularse de la mezcla de inst. y los tiempos de ejecución del mismo (e.g.: no toma en cuenta jerarquı́a de memoria, ineficiencia de pipeline) • Desempeño pico: solo garantiza la velocidad que nunca se superará. Ejemplo: CRAY X-MP Hitachi Mejor caso 2.6 sec 1.3 sec Hitachi 105% más rapido FFT vect. 3.9 sec 7.7 sec CRAY 97 • ¿Qué se puede concluir entre dos maq. que se superan mutuamente en problemas diferentes? 1 Si no existe en versión ensamblador sino FORTRAN, la perdida de desempeño puede ser hasta de 50%. pequeño cache tendrá una alta rata de hits. 2 Un 2.6 Bibliografı́a • [HB84] es un libro general, aunque un poco viejo. Los principios expuestos siguen siendo válidos, aunque los ejemplos citados son de máquinas por lo general obsoletas. La parte multi-procesadores es muy pobre. • [AG89] trata de cubrir las áreas de principios y generalidades del procesamiento paralelo (”Foundations”), la parte de software y finalmente la de arquitectura. No entra en profundidad en ninguna de ellas pero dá una visión general del área. No cubre vectoriales. En arquitecturas es un compendio de máquinas paralelas. • [PH90] es utilizado esencialmente en sus capı́tulos relativos al desempeño, vector processors, pipelining, memory hierarchy y I/O. No trata las arquitecturas MIMD. • [Sto90] es otra referencia. Analiza en profundidad el sub-sistema de memoria. • Revistas especializadas: IEEE Computer, CACM, IEEE T. on P and D Syst, SIGCA, J. of Par and Dist. Comp, I. Journal on Supercomputing. En particular artı́culos como [Bel89, Bel92], [SC91] y otros tantos en benchmarking [Wei90], números especiales como [ACM92], etc. 3 Pipelining y máquinas vectoriales archivo: pipeline.tex [2 clases] Fundamento Incremento de velocidad por etapa del cauce. Sea un pipeline de k etapas (de igual duración) Speedupn = Tseq nk Tk = k+(n−1) El término k en el denominador es el tiempo que tarda en llenar el pipe. Notese que cuando n k y n → ∞ =⇒Speedup → k Es decir, a mayor etapas, “más paralelismo”, i.e. mayor throughput de instrucciones Qué podemos encauzar para mejorar velocidad de ejecución? En 1 procesador • El ciclo de instrucciones • Operaciones aritméticas: hasta 14 etapas en CRAY-1 . hasta 26 en CYBER 205 • Operaciones vectoriales En sistema de procesadores MIMD (organizado por SW) y Arq. Sistólicas 3.1 Factores que limitan speedup ideal de un pipeline Propagación de reloj a todas las etapas: Acceso de memoria: En la tecnologı́a actual esto limita a entre 10 y 20 etapas. Sea una máquina RISC sencilla, LOAD/STORE, una instrucción por palabra 1. Inst. Fetch – prefetch 2. Dec – decode y operand register fetch 3. Exec – ejecución y cálculo de dire. 4. MEM – accesar operandos en memoria (sólo si instr. LOADS/STORES) 5. WB – guardar resultados en registro Instr. Instr. Instr. Instr. 1 2 3 4 IF Dec Exe Mem WB |-AM--|-----|-----|-AM--|-----| |-AM--|-----|-----|-AM--|-----| |-AM--|-----|-----|-AM--|-----| |-AM--|-----|-----|-AM--|-----| La memoria debe tener capacidad de ejecutar 2 accesos por ciclo. Soluciones: • Uso de cache (depende de una buena localidad) • Separación de cache de instr. y datos • Requerimientos de lograr pipeline de accesos (por ejemplo, que pasa si hay falla en cache?) =⇒ el potencial cuello de botella es movido al subsistema de memoria Azares estructurales (Structural Hazards) En la multiplicación de punto flot. hay operaciones sobre la ULA que son costosas, p.e, el shift: es preferible varias etapas shift de un ciclo a 1 completa de k ciclos. Una multiplicación flotante está dividida en varias operaciones: suma de los exponentes; generación de los productos parciales de las mantisas (multiplicación); suma de los productos parciales; redondeo al numero de bits según la precesisión; renormalizar el resultado. Sumar expon. Multip. manti Sumar. prod. parc. Renormalizar Redondear t=1 X 2 3 4 X X X X 5 6 X 7 X X Pero si vienen dos sumas seguidas X y Y, se produce un conflicto de uso Sumar expon. Multip. mant. Sumar. prod.. Renormalizar Redondear t=1 X 2 Y X 3 4 XY X Y XY 5 Y X 6 7 Y X X Y =⇒ Introducir retardos (burbujas, pausas) para evitar conflictos estructurales. Otra técnica es la greedy que lanza una operación al momento que no haya conflicto. La técnica basada en vectores de colisión (que dá resultados buenos), que permiten • Determinar en c/ paso si el comenzar otra operación conducirı́a a un conflicto posterior • Determinar el ciclo de comienzo de instr. que maximiza el thruput de instr. (ver Hwang y Briggs, Stone, etc. para más detalles). Por ejemplo, es posible que una retardo mayor induzca un mejor desempeño. Elóptimo se obtiene introduciendo retardos entre etapas de manera apropiada. Esta técnica nos permite que, dada una situación potencial de aparición de colisiones, como obtener el máximo desempeño en tales condiciones. Sin embargo, el mayor desempeño se logra si logramos evitar tales colisiones, por ejemplo: • Replicando elementos/recursos crı́ticos del HW • Cambiando el orden de operaciones. Ej: no permitir dos sumas seguidas suma→suma →load =⇒suma→load →suma. Esto es generalmente responsabilidad del compilador optimizante. Dependencias (Azares de datos) Una dependencia de datos puede producir también burbujas. Ej: ADD R1,R2,R3 (R1 ←− R1+R3) SUB R4,R1,R5 (R4 ←− R1 – R5) ADD SUB t=1 2 3 4 5 ._______._______._______._______._______. Fetch Dec R2+R3 [Mem] R1 <._______._______._______._______._______. Fetch Dec R1-R5 [Mem] R4 <- En t=4, el nuevo valor de R1 por el ADD aún no ha sido actualizado, por lo que el valor usado en SUB es erróneo. Solución: forwarding o bypassing. El resultado de la ULA siempre es realimentado al latch de entrada de la ULA. El HW detecta si la entrada de la próxima instr. debe ser tomada del latch o de los registros. Inconv. Implementación de bypasses tiene su costo en HW. Otra solución es mediante reordenamiento de código (trabajo del compilador) Ej: A ←−B + C LD R1,B .Fetch .Dec .Ej .←B .R1 ← . LD R2,C . .Fetch .Dec .Ej .←C .R2 ← . ADD R3,R1,R2. .Fetch .Dec .burb. .R1+R2 .mem .R3 ← . ST R3,A . . .Fetch .burb. .Dec .Ej . . Podrı́a enviarse directamente el resultado del add a memoria sin pasar por R3. En general, la reexpedición interna busca evitar accesos a memoria innecesarios: 1. R1 −→Mx −→R2 =⇒R1 −→ . • −→Mx • −→R2 2. Mx −→R1 Mx −→R1 =⇒Mx −→R1 −→R2 3. R1 −→Mx R2 −→Mx =⇒R2 −→Mx También el compilador podrı́a tratar de evitar LD seguido por instrucciones que usan inmediatamente el valor. Ej: Supongamos que 20% de instr. son LD y 50% de las veces al LD le sigue una instr. que requiere el res. de la carga. Si la burbuja es de 1 ciclo ¿Cuánta velocidad se pierde? 3 0.8 × 1 + 4 0.2 × 1.5 = 1.1=⇒10%de retraso Si no hay orden posible que arregle el pb, introducir nop, ie, burbuja, lo cual es más barato que HW especial. (en vectoriales veremos otra solución a este problema a nivel de la algoritmica, p.e.: cyclic reduction) Otros azares de datos se producen en los accesos a la memoria. Estos, por la inyterdependencia, pueden también producir burbujas en el pipe: RAW : Leer después de escribir puede traer interlock ya que puede no estar actualizada la memoria cuando empieza la lectura. WAR : si la lectura no ha terminado y se manda a escribir hay carrera critica WAW : carrera crı́tica RAR : No trae problemas. Bifurcaciones (Azares de control) Problema: la próxima inst. buscada, puede no ser la próxima a no ser ejecutada. Ej: ADD R1,R2,R3 BZ R1, α ... α : ... Hwang and Briggs citan que pipelining puede perder 30-40% efectividad por pbs. de bifurcación Soluciones: Delayed Branching / Bifurcaciones pronosticadas / Historia de bifurcaciones 3 80% 4 20% de las veces no hay pb. de las veces son LD, de las cuales 50promedio para una carga Delayed Branching: Cambiar orden de instrucciones.Ej: ADD R1,R2,R3 BZ R4, α ... α : ... se cambia a BZ R1, α ADD R1,R2,R3 ... α : ... eg: RS6000, basado en observaciones que rara vez se salta sobre una condición recién calculada(!) Pronosticar la bifurcación a tomar (adivinar camino a tomar): Si salto hacia atrás (fácil de reconocer por offset negativo), pronosticar hacia atrás =⇒probablemente sea un lazo, los cuales generalmente se ejecutan más de una vez. BZ — suponer que no da cero Esta estrategia da resultado en parte porque la inst. a buscar debe estar en el cache (en general). También por el uso de res. temp. — no se obliga a escribir el resultado hasta que se sepa a ciencia cierta que el pronóstico es valedero Historia de bifurcaciones En BP y BN (igualmente probable; depende del compilador) ¿ Hacia donde salto? podrı́a dejarme convencer por frec. hist. previa a corto plazo. Como los caches se adaptan bien al comportamoento en hist. reciente, podemos tomar las ideas Inst. addr | |----> Branch ad. aaa bbb ... Target addres yyy xxx ... Si la instrucción está en el cache, se toma el valor (último utilizado) y se actualiza luego de ejecutada con el valor real (no el predicho). Si no está, incorporarla al cache con la dirección de branch tomada (polı́tica de reemplazo?) Esta idea aún no ha sido muy usada en la práctica (solo IBM 3090 mode. 400, 1986) pero suena razonable dados las caract/costos de HW actuales (ver Stone p. 175). H y B sugieren manejo de 2 mem. cache: una por alternativa de salto =⇒engorroso! 3.2 Complicaciones adicionales en manejo de pipeline Manejo preciso de interrupciones según standard IEEE En realidad, la secuencia ADD SUB de la pag. 13 puede conducir a carrera crı́tica si ocurre interrupción a mediados de ejecución. Al cambiar orden de ejecución ADD −→DIV por DIV −→ADD, y ambas producen trap, ¿Cuál se trabaja primero? ¿Por qué? Para trabajar correctamente el VAX 8800 requiere 4 PC: Program counter, Current Program Counter, IBox Starting Address, EBox Starting Address5 Aparte, encolar resultados: adelantar los pipes hasta que se puede usar (history file y future file) Heterogeneidad en duración de inst.: En la Vax una inst. puede llevar de 1 a 100s ciclos =⇒ventajas de RISC (aunque VAX 8800 lo que hace es pipeline the micro-engine!!) 3.3 Más velocidad aún Introducir delays para alargar # de etapas: Si suma tarda 3 ciclos, convertirlo en 3 etapas de 1 ciclo =⇒Cada inst. tarda más pero completamos en cada instr. (ver Stone) 5 Sirven para saber para cada instrucción donde está en proceso pipeline, 1 PC por etapa! Loop Unrolling Máquinas superescalares Ejecutan más de una instr. a la vez, eg: una de pto flot. y una entero. El manejo de interrupciones requiere aún más cuidado. Ej: • en SPARC, instr. enteras no causan pb porque terminan pero op. flot. se limitan a 2, y aún ası́, son imprecisas • dejar entrar al ALU una instr. solo si las que ya están en ALU no pueden causar interrup. (no es muy razonable por costo para cosas poco frecuentes) Encadenar pipelines * seguido de +. (ver máq. vectoriales) 3.4 Falacias El diseño del set de instr. de las m. es indep. de supipelining: No, por complicaciones de • Instrucciones de tamaño variable =⇒Imbalance en etapas, retardos y complican detección de azares. • Modelos de direcc. sofisticados (post-incr, multiple acceso a mem) Incrementar el # de etapas del pipe siempre incr. desempeño No, por pbs técnicos de reloj. No, por mayor dependencia de lazos. Ej: en 14 Livermore Loops (agregar gráfica) Evaluar un esquema de pipeline con código no-optimizado El código optimizado es más difı́cil de alterar o reordenar para pipeline. Algunos autores encuentran que ene lc ódigo optim. hay 20% menos thruput. 4 Máquinas vectoriales archivo: vector.tex 2 clases Definición Una máquina vectorial es aquella que tiene instrucciones especiales para trabajar sobre vectores, e.g. C := A + B implementados de manera de obtener un alto rendimiento. Propiedades importantes de tener operaciones vectoriales • Al pedir una instrucción vectorial se garantiza la ausencia de azares por datos (Ojo! no todo lazo sobre elemento de un vector garantiza esta independencia =⇒ no todo lazo puede ser vectorizado) • Una única instrucción vectorial cvonlleva mucho trabajo =⇒red. req. de BW respecto a instr. Pueden encontrarse reduciones de 600 a 1, ej, SAXPY. Esto rompe con la homogeneidad de duración del set deinst. • Las instr. vect. tienen un patrón de acceso predecible: C[1: 7 : 2] inf :sup:stride6 := A[2 : 5 : 1] + B[7 : 4 : −1] Si es predecible, tal vez podamos incorporar mecanismos para suplir suficientes datos al pipe vect. en el tiempo requerido • Se eliminan los azares de control (no hay bifurcación) ¿Cuántas ints. vect? Entre 20 y > 100. La IBM 3090 VF tiene 171 4.1 Arquitecturas vectoriales Si requerimos hacer operaciones como C := A+B logrando (después de start-up time)una operación completada por ciclo, la memoria requiere trabajar a una velocidad de 3 accesos por ciclo −→PROBLEMA CLAVE! Soluciones: • Una memoria de alta velocidad (tipo cache) y sacar datos vectoriales de allı́ (pb: tamaño) • Memorias intercaladas: dos formas de acceso – Accesadas de manera sı́ncrona, capturadas en latchs para luego transferirlas una por una. – Accesadas de manera defasada(en pipe) El número depende de los req. de la unidad de pipe y de la latencia de la memoria. Ejemplo: Un pipe que requiere tres accesos por ciclo. La mem. tiene una latencia de 2 ciclos =⇒3 × 2⇒6 módulos de mem (en general, son potencias de 2) Ejemplo El siguiente ej. muestra una situación ideal para el proc. vectorial. Tenemos un banco de 8 módulos de mem. con dos ciclos de latencia, y un sumador en pipe. de 4 etapas. La operación realizada es X = A + B.(llevar p. 264 del Stone). En este caso, se obtiene un BW de un res. por ciclo. Los pbs surgen cuando los elementos no pueden almacenarse de manera ótima. Ej: A C := (E + F ) + G := A + B Las instr. anteriores pueden requerir otro patrón de almacenamientos que produzcan conflictos. Conflictos en acceso matan una máqina vectorial Posible solución: introducir retardos (CDC Star). Ej: todos los vectores empiezan en M0 . Se accesa primero A[0] y se guarda en un buffer durante dos ciclos (mientras se accesa B[0]). Se obtiene el mismo BW pero aumenta la latencia (en vez de empezar a obtener res. al 5 ciclo, lo hace al cabo de 11) Aunque la solución es elegante, su abuso conduce a desempeño muy inferior a lo lograble mediante otras arq., eg CRAY-1 vs. CDC Star. Trampa Concentrarse en desempeño pico e ignorar startup time. Este determina el tamaño de los vectores para el cuál se obtiene un desempeño mejor que escalar. Esta métrica se denomina nv . Para CDC-Star 100 es 100 y para CRAY-1 es 2. Para que Cyber 205 (descendiente de STar) sea mejor que CRAY-1 se necesitan vectores de al menos 200 para SAXPY. Hay algoritmos muy usados, como eliminación gaussiana (para triangular matrices) que en cada iteración se decrementa de uno la longitud del vector. Otras caracterı́sticas de este algoritmo (comunes a otros algo. numéricos) son: • Requiere accesos por filas y por columnas de una matriz • Operaciones son, en su mayorı́a, V × V →V , V × escalar→V • Excepciones son operaciones de reducción (escalares) como MAX, que devuelve la posición del elemento mayor. Este será el pivote. 4.2 ¿ Cómo guardar matrices en un banco de mem. intercaladas de forma que el acceso por fila y por columna sea lo más rápido posible? [fotocopiar Stone 280+282] En matriz 8x8 con 8 módulos, almacenar por filas será terrible para acceso por columnas, ya que todos los ele. de una col. estarán en el mismo módulo. Es preferible agregar una columna dummy.: stride para acceso por fila: 1, para col:9. Una forma de evitar este problema es seleccionar un paso7 “s” (es decir, una forma de guardar los elemntos en mem) que sea primo relativo al núemro de módulos. Los pasos sucesivos accesan módulos separados de M/MCD(M,s). Como M es generalmente potencia de 2, cualqier s impar salva la situación 4.3 ¿Qué otros tipos de accesos se utilizan? Según Kuck, además de por filas y por col., tenemos: • por diagonales/antidiagonales. No es posible accesar eficientemente por filas, columnas y diagonales si el # de módulos es potencia de 2. • Bloques cuadrados. Dos sugerencias: • Que el númeor de módulos en 1 banco no sea una potencia de 2 sino un número primo. (Ej: BSP, con 17, o GF11, con 567?) • Aplicando hashing a las posiciones de los elementos (no implementado). Es un temas importante de investigación (Ej: Supercomputing 92: Lang, Valero et al., “Acceso en potencias de 2 sin conflicto”). Hay otros accesos, s=2, etc. En conclusión: el porgramador debe cuidar/estar pendiente de asignación de elem. de matriz a memoria según sus patrones de refe. 7 stride 4.4 Arquitecturas basadas en reg. vect • CRAY intercala bancos de registros vetcoriales entre mem. ppal y pipe vect. • No es raro encontrar bancos de 64 o 128 reg. • A diferencia de un cache, deben manejarse explicitamente (compilador o programador) • A veces puede utilizarse otra mem. entre ppal y reg, que permitira reestructurar datos (ej: para accesar col. en vez de filas, p. 286b Stone). La ventaja sobre otros métodos (hashing, realignement network) es que sólo se hace cuando se necesita. • Los vectores de largo variable (VLR) traen inconv. =⇒técnica de strip-mining • Soporte del compilador, por ejemplo, para lazos internos: dep. entre elem, intercambiar lazos, strip mining (ver prox. curso) Strip-mining: Los registros vectoriales tienen un tamaño que determina el número máximo de elementos que puede procesarse simultáneamente de manera vectorial. Este es el Maximum Vector Length (MVL). El tamaño de una operación vectorial es un parámetro dinámico, por lo que se usa un registro especial, VLR, para guardar dicha talla. Strip-mining es la generación de código tal que cada operación vectorial sea hecha para una talla ≤ MVL. Si el número de elementos a procesar es N > M V L, la operación debe realizarse en varios bloques. El primero se hace por el resto de la división entera por MVL, es decir, V LR←N mod M V L, y el resto de las operaciones se harán tal que V LR←M V L. Esto implica un overhead adicional de load y store de los bloques, y de carga del nuevo valor de VLR. Ejemplo: la version strip-mined de SAXPY es (tomado de H y P,p. 364) low = 1 VL = (N mod MVL) /* bloque incompleto */ do 1 j = 0,(N/MVL) /*lazo externo*/ do 10 i = low,low+VL-1 /* vectorizado por el compilador */ Y(i) = a*X(i) + Y(i) 10: continue low = low + VL /* inicio del nuevo vector */ VL = MVL /*resetea MVL */ 1: continue Conduce al siguiente modelo de desempeño Ttotal = TstartupT otal a + ( N + 1) × (Tlazo b + (Tstartup c ) + N × Telem MV L a Cáclulo de la dirección del vector, inicialización control vectorial, etc escalar de stripmining c recarga de pipes por bloque b código 4.5 Mejoras a máquinas vect. Encadenamiento (forwarding extendido a unidades vectoriales): Ejemplo: SAXPY Comparación interesante respecto a capa. de encadenamiento en Cheng “Vector Pipelining, Chaining and Speed on the IBM 3090 and CRAY X-MP”, Computer, Sept. 1989 • nV depende de operación (asig., SAXPY, etc) – IBM: 5 – 13 – X-MP: 2 • X-MP es más robusto: tarda idem A*X+Y que (A+X)*Y. IBM es asimétrico • División: IBM:17.4 ciclos. CRAY: 2 ciclos • En X-MP: 14 ciclos para cargar un escalar, 17 para u elem. de vector. Máscara de vectores (vectores enmascarados) do 100 i=1,64 if A[i] <> 0 then A[i]:=A[i]-B[i] 100 continue Las desventajas son: no reduce tiempo de eje.; En algunas máquinas, las oper. se ejecutan pero no se guarda el res. =⇒interrup. por div por 0 puede ocurrir! Oper. de reducción s := ai × bi + s −→ si := si−d + ai × bi Se termina con d sumatorias parciales que hay que sumar, y puede cambiar el orden de las sumas (overflows!). Otra técnica es el “Recursive doubling”: se suman 2 vectores de 64 reg, luego 2 de 32 y asi ... Manejo de matrices sparse • Vector de bits: reducción 1 a 64. Se usa 1 bit para repr. 64 bits de una doble palabra. El problema es que la esparsidad práctica es mucho mayor, e.g., SIMPAR: entre 0.1 y 0,01% • Hashing non zero elem. • Compresión/expansión: expandir esparse en vectores; hacer oper; recomprimir. • Usar scatter/gather.(scatter: comprimir un vector de acuerdo a un vector máscara; gather: intercalar dos vectores comprimidos) Uso de varios pipes : igual que Tomasulo, etc. Bin-packing (método de scheduling) Problema abierto 4.6 El uso apropiado de cache en sist. vect. Métricas adicionales para medir desempeño de maqs vect. Hockney’s • r∞ : MFLOPS sobre vector infinito, i.e., se ignora el startup time. Generalmente n=1000. −1 r∞ = lim n→∞ Tstart + Te × n ⇒r∞ = 1/Te n • n1/2 : largo del vector para alcanzar r∞ /2. n1/2 = tstart /te ya que n1/2 se alcanza cuando el tiempo de procesar esos elementos es igual al tiempo de startup. Si mejoro el reloj, afecto r∞ mientras que si agrego etapas al pipe, afecto n1/2 . Derivación de Hockney’s Puede realizarse a partir de datos del fabricante: r∞ es ciclos por seg, si en cada ciclo puede darse una salida (notese que depende de oper!). n1/2 = s + k − 1, donde s es el overhead general (fetch operand, store VLR, etc.),k número de etpas de pipe. También puede medirse experimentalmente: correr el sgte programa call second(t1) call second(t1) To <- T2-T1 do 20 n=1,NMAX **1000 call second(t1) do 10 i=1,N 10: A(I)=B(I)xC(I) call second(t2) T=(T2-T1)-T0 20: write(T,n) ; le compilador vectoriza esto Graficar T vs n. La inversa de la pendiente de esta recta es r∞ . Extrapolando, se obtiene el punto de corte con el eje de n, que es n1/2 . Una de las grandes ideas de Cray fué tener un nV pequeño. P.e., las máquinas japonesas tienen startup 50-100% mayor que Cray. 4.7 Trampas y falacias Trampa Incremente el desempeño vectoreial e ignore desempeño escalar. La situación tı́pica es que 50% del tiempo se dedica a oper. escalares. Ej: si nos concentramos en mejorar por 4 veces el perf. vectorial, obtenemos T 4T S= = = 1.6 0.5T + 0.5T /4 2.5T Falacia Puede obtener desempeño vect. sin anchode banda de mem. Cray-1 mejoró desempeño en LINPACK por factor 2x usando transformaciones sofisticadas que permitieron retener + datos en reg. 5 Sub-sistema de memoria archivo: memoria.tex 1 clase 5.1 Cache ¿Por qué cache? • CPU performance – antes de 1985: 1926% crec. anual en velocidad – después de 1985: 50100% • Memoria principal (DRAM): 7% anual =⇒un nivel adicional en la jerarquı́a de memoria que siga el paso (CACHE, hecha en SRam, más cara), cuya eficiencia se basa en la localidad espacial: “ Si un item es referenciadp, pronto items cercanos serán referenciados también”. Tendencias 1970 1980 1990 Cache en sist. comerciales 2K 8K 256K Cache en supercomputadoras (vectoriales) 16K 64K 1M “A medida que la capacidad de memoria aumenta de 107 bytes a 108 y 109 , hay una fuerte probabilidad que el cache no crezca linealmente con la memoria ppal. En efecto, varios constructores, tales como Amdhal y Hitachi han producido máquinas con 2 niveles de cache” (Stone) 5.2 Organización de un cache Directorio del cache (bits de control, ver más adelante) Conjuntos asociativos de lı́neas8 o bloques: Varias alternativas para esto. • Correspondencia directa (Direct Mapped): el bloque i de memoria ⇒lı́nea mod Número de lı́neas del cache (un conjunto asociativo). Ej: Sea un cache de 8Kbytes, organizado en 128 lı́neas de 16 palabras de 4 bytes cada una (1 lı́nea = 64 bytes). Para obtener la posición en el cache de una dirección ADD (en bytes): Lı́nea =(ADD div 64) mod 128 El cache necesita guardar sólo los bits más significativos de la dirección para saber cuá de los posibles bloques de memoria se encuentra en el bloque de cache. Ventajas: costo de impl. en HW es bajo. La polı́tica de reemplazo es trivial. Desventajas: puede haber reemplazo aunque cache no esté lleno. Mal desempeño si se requieren dos bloques mapeados al mismo bloque. • Totalmente asociativa (Fully associative): cada bloque de la memoria puede estar mapeado en cualquier bloque del cache. Esto implica que para obtener una dirección ADD, se debe buscar de manera asociativa en el campo de la dirección (el cual debe contener todos los bits de dirección de la lı́nea). Ventajas: Uso eficiente del cache, buena tasa de aciertos. Desventajas: El costo en HW y tiempo de tener una memoria totalmente asociativa y de bus’queda. • Asociación por conjuntos (Set associative): El cache se divide en grupos (sets). Cada bloque de memoria está mapeado a uno de los grupos. Dentro de cada grupo, un bloque puede ocupar cualquiera de las lı́neas. Es equivalente a dividir el cache en n sub-caches directamentre mapeados. Un n-way set associative cache define un cache donde cada grupo tiene n bloques. Ejemplo: mismo cache que antes, pero 2-way ass. Para saber si ADD está en el cache, determinamos en que grupo está mapeado, y luego hacemos una búsqueda asociativa en los bloques del grupo Grupo =(ADD div 64) mod (Tamaño del cache (128) / n (2) = 64) El set-ass. es el más común. La heurı́stica es que la tasa de fallas (miss rate) de un cache directamente mapeado de tamaño X es aprox. el mismo de un 2-way de talla X/2. 5.3 Polı́ticas a definir para manejo de cache Polı́tica de colocación: depende de la organización. Polı́tica de extracción: (Cómo y qué inf. entra al cache) extracción por demanda extracción anticipada (prefetching): Al fallar ref., traer i e i+1. Al ref. por prim. vez linea i en cache, traer i+1. extracción selectiva Datos que no pueden ser traı́dos al cache. (eg: datos compartidos) Polı́ticas de reemplazo (qué lı́nea sale del cache): LRU, al azar (HyP encuentran que azar y LRU son ambos buenos a partir de cierta cap. de cache, pero azar es más barato) 5.4 Problemas abiertos Un cache único o varios (Ej: instr., escalares, vectores). Un sólo cache permite que el sist. busque mejor, pero puede haber contención. La tendencia en maq. escal./superescal. es a más de un cache. Tamaño: La curva del beneficio resp. al tamaño (en miss rate) descelera a partir de cierto punto: empı́ricamente, duplicar tamaño, reduce % fallas en 30%. Tamaño de lı́nea: depende del modelo de accesos. Si hay una alta localidad espacial, mientras mayor tamaño mejor (pero el stride puede invalidar esto!). En cambio, si hay varios puntos de localidad, es preferible más lı́neas más pequeñas. Esta última es la tendencia excepto en máquinas vctoriales. 5.5 Efecto de las fallas La pérdida se modeliza de la sgte manera: tef f = tcache + (1 − h)tmain h es el hit rate. Si main es 10 veces más lento, decrementar h de 0.99 a 0.98 incrmenta tef f en 10%. Un incremento de 10% en h duplica tef f tcache depende de la organización. 5.6 Cache en arq. vectoriales La mejora de cache en arq. vect. es muy discutida. Generalmente, los pbs en algebra lineal usan una cantidad de datos que sobrepasa de lejos la cap. de los caches. Además, si el stride es mayor que el tamaño de la lı́nea, estaremos trayendo lı́neas al cache frecnetemente. En conlcusión, en lugra de mejorar puede empeorar!. CRAY no tiene cache, sino bloques de reg. usados explicite. por programador. ¿Cómo debe ser un cache para vectores? Grande para contener todo un vector? ¿Pequeño y contener muchos fragmentos de vectores? OJO: Accesos seriales a vectores atentan contra el cache con LRU, ya que la carga de un vector puede vaciar (flush) un cache entero y dejar solo data inútil. Entonces, qué polı́tica usar. Problema abierto. Stone concluye que “Los registros vectoriales deben ser organizados como registros accesibles por el programa en vez de cache hasta que se sepa como mejorar desempeño con cache organziado por vectores. 5.7 Polı́ticas de actualización de mem. ppal Write-through: actualizar directamente la palabra modificada en cache ⇒cache y mem. siempre consistentes. ¿Qué hacer si al tratar de escribir hay falla de cache? Alternativas: 1. write-through-with-write-allocate: escribir en mem. ppal, y traer bloque act. al cache. 2. write-through-with-no-write-allocate: sólo escribir en mem. ppal. DEJAR QUE PIENSEN Analizar alternativas resp. dato empı́rico: 5–30% de operaciones son de escribir 70-95% de lectura. (en relaidad estos datos no son de gran ayuda. Los wites vienen en grupos o no? La localidad de ref. se mantiene durante las sec. de write? Write-back: En caso de falla de escritura, traer bloque al cache. Ensuciar(poner bit de “dirty”) solo cache y act. mem. ppal cuando se reemplace el bloque del cache. Variantes: • Write-back simple: esc. en mem.ppal el bloque reemplazado. (no usa bit “sucio”). • Flagged Write-back: escribir sólo si tiene bit de “sucio” en ON. En reemplazo, dar prioridad a traer nuevo bloque, para solapar overwriting con oper. del procesador. Esto requiere un bloque de registros de “escrituras en curso”. 5.8 Cache y E/S ¿Dónde colocar el cache? a) b) CPU ------- CACHE ------ MEM. PPAL | | I/O PROCESSOR CPU ------- CACHE ------ MEM. PPAL | | I/O PROCESSOR a) tiene demasiada actividad en cache. b) es preferible resp. desempeño pero ... consistencia lógica entre CAHE y mem. debeser exacto para evitar que CPU encuentre un valor y I/O Proc. otro. Solución posible: usar write-thru para cosnistencia ree. escrituras en cache y Mem se entera de cambios en cache. Pero ¿Cómo se entera cache de cambios en Mem? • I/O Proc. debe invalidar datos en cache, y forzar que se produzca un cache miss simulado, prendiendo bit “corrupted” en directorio. • I/O Proc. escribe nuevos datos en cache en vez de invalidar. “Para la mayor parte de los sistemas, la prob. que un update conlleve a un cache hit es baja y no justifica el tráfico extra hacia el cache”. Pero, y si quiero (me conviene) usar write-back para disminuir tráfico CPU ------- CACHE ------ MEM. PPAL \ / \ / I/O PROCESSOR El I/Oproc. conserva una copia del directorio del cache. Esto es necesario para poder invalidar. En write-back, el I/O pide datos en CACHE (revisa si está en dir). El dir. se actualiza para ambos solo si hay un cache miss. 6 CASO MAQUINA VECTORIAL: CRAY archivo: crays.tex 6.1 CRAY Y-MP C90 Tomado de [Cra92] 6.1.1 Generalidades La C90 posee 8 o 16 procesadores. Posee soporte para multitasking en cada procesador, paralelismo (un programa corriendo en varios procesadores) y Autotasking (partición automática de programas en CFT77 en tareas para ejecución en varios procesadores). Posee dual-mode. 6.1.2 Pipelining and segmentation Todo el hardware está completamente segmentado. Esto implica que todas las operaciones (exchange sequences, memory ref, inst. fetch sequences, inst. issue sequences y unidades funcionales) entregan un resultado por CP9 6.1.3 Sección de comunicación inter-procesadores (ICS) EL ICS contiene registros y semáforos compartidos para pasar datos e información de control entre porocesadores. Además contiene lógica que permite a un CPu interrumpir a otro y hacerlo cambiar a modo monitor (especial para multitasking). Los reg. y semáforos comp. están divididos en grupos idénticos (clusters) de 8 32-bit shared address (SB) reg., 8 64-bit shared scalar (ST) reg, y 32 sem. (SM) de 1 bit. Cada CPU está asignado a un cluster, a cuyos reg. tiene acceso. Para transferir datos entre CPUs, un CPU carga los datos en registros compartidos desde sus registros escalares o de dirección, luego otro CPU asignado al mismo cluster puede leerlos. Los reg. semáforos permiten a un CPU de suspenderse temporalmente para sincronizarse con otro. Cada CPU puede prender o apagar un SM reg de su cluster, y luego realizar un Test and Set sobre esos reg. Un TAS sobre un SM ejecutado por un CPU puede hacer que su operación se suspenda hasta que otro CPU apague el SM. El HW detecta si todos están haciendo TAS (deadlock). 6.1.4 Sección de cómputo del CPU Registros Dirección: 8 reg. A y 64 reg. B, de 32 bits c/u. Los A sirven especialmente para referenciar la memoria o como ı́ndices, además de control de lazos, oper. de I/O, etc. Los B sirven para almacenamiento intermedio de los A. Escalares: 8 registros S y 64 registros T, de 64 bits c/u. Los S son fuente y destio de oper. escalares. Los T sirven de respaldo a los S (intermediate storage); pueden usarse para traer de o llevar datos a la memoria. Vectores: 8 reg. de 128 elementos de 64 bits c/u. Estos sirven de fuente y destino para los dos pipes, uno para elem. pares y el otro para impares. Además, posee un reg. VL (8 bits, 1 a 128) y un reg. de máscara VM. 9 CP es Clock period. Unidades funcionales Dirección: un sumador y un multiplicador. Escalares: cuatro unidades de tipo entero, de uso exclusivo: sumador, lógico, shift, population/parity/leading zero. Tres unidades flotantes compartidas con los vectoriales. Vectoriales: 2 grupos de enteros de uso exclusivo: pipe 0 (para los pares) y pipe 1 (para impares). Cada grupo tiene: sumador, shift, dos lógicos (uno full), vector population/parity/leading zero. Unidades de Punto Flotante Hay dos grupos con tres unidades c/u. Los vect. pueden usar los dos grupos (uno para pares, otro para impares), los escalares solo uno. En vect., los oper. pueden ser vector con vector, o escalar con vector. las unidades son: un sumador, multiplicador, reciprocal aprox. 6.2 Sección de control del CPU La ejecución de las tareas asignadas a cada CPU son controladas a través de tres secuencias: exchange, fetch and issue. • La secuencia Exchange permite arrancar la primera tarea o hacer un cambio de contexto, trayendo un bloque de parámetros (reg. A y S, P, et.) de programa (exchange packages) a los registros y salvando los previos. • La secuencia de Fetch arranca inmediatamente después de un exchange, y trae un bloque de inst. a un buffer de inst. • La secuencia de Issue selecciona la inst. apuntada por reg. P para ejecución, incrementa P, etc. Cuando un issue no encuentra la inst. en el buffer, otra secuencia de Fetch es arrancada y un bloque es traido al siguiente buffer. 6.3 Procesamiento paralelo • Las unidades func. son independientes: pueden operar concurrentemente si no hay conflicto (de datos o estructurales). • Los dos pipes vect. permiten operar concurrentemente sobre dos secciones de los vectores, lo cual junto con el chaining pude dar, p.e., 2 sumas y dos mutl. flotantes por CP10 6.3.1 Memoria La memoria central de 256 Mwords es compartida. Cada CPU tiene 4 puertos a la memoria (vector, T, B, Exchange par. reg), c/u con ancho de dos palabras (hasta 8 referencias simultáneas en cada CPU). Pueden hacerse accesos bi-direccionales (lectura y escritura simultánea). 6.3.2 I/O La sección de I/O comparte un puerto entre todos los CPU. 10 CP = 4.2 ns, implica un peak perf. de 4/4.2 Gigaflops 6.4 Programación • CAL: Cray assembler lang. UNICOS (Unix de CRAY). • Macrotasking: usando llamadas de librerı́a (desde Fortran, pe.e.) permite ejecución en varios proc. de varias trareas cooperantes. Paralelismo de grano grueso. • Microtasking: Paralelsimo de grano fino, que permite ejecución paralela de pequeños segm., pro ejemplo, iteraciones de un DO. El scheduling es dinámico. Se utiliza dando directivas al compilador. • CFT77: posee autotasking y vectorización. • C (Ansi), Pascal, Ada, Lisp. Además, librerı́as, utiliatrias, software de com. (TCP/IP, etc). 7 Cray Y-MP E Tomado de [Cra91] 7.1 Generalidades Máxima configuración: 8 CPU. Memoria de 256 Mwords, 4 secciones y 256 bancos. 7.1.1 Diferencias con C90 • Max de 8 CPU contra 16 de C90. • Registros vect. de 64 elementos, en vez de 128 en C90. • Buffer de instrucciones de: 4 para un total de 512 parcelas de 16 bit, mientras que 8 para C90 (total de 1024 de 16bit). • Sólo un grupo de unidades funcionales enteras y flotante para vectores. La C90 tiene dos grupos (pipe 0 y pipe 1) para procesar cada CP dos ele. de cada vector operando. • CP de 6 ns, contra 4.2 ns, 1 VM contra 2. • Memoria: 256 bancos en 4 seciones, contra 1024 en 16. Tiempo de acceso de 15 ns, con un bank busy time de 102 ns. Total BW memoria es 32 words/CP por procesador • 9 clusters max, contra 17. • 1 CPU en 1987, primeras entregas en 1988. 25 M$. Performance 8 Pico de 4 Gflops. CRAY-1 [DD89] • Monoprocesador, introducido en 1976 • 4 tipos de chips de 2 compuertas por chip, en ECL, con .7 ns de retardo por compuerta. • 12.5 ns CP. • 4 Mwords (CRAY-1S) de 64 bits de memoria (bipolar, menos 1-M, MOS), en 16 bancos. El busy time de un banco es 4 CP, y la latencia es 12 CP. • 8 Reg. vect. de 64 elem. de 64 bits. Performance 8.1 Max. perf: 160 Mflops. Max. escalar: 80 Mips. CRAY-2 • 4 procesadores, con pipelining y overlapping pero sin chaining. Los pipes tienen más segmentos que CRAY-1 • Memoria Compartida: 256 Mwords de 256 K DRAM en 128 bancos. El bank busy time es 57 CP, y el acceso escalar es 59 CP. • Memoria local: 16 Kwords, 4 CP de local a vector reg. • CP de 4.1 ns • Mucho overhead para oper. vectoriales: 63 CP para cargar y guardar vector, 22 para vector multiply y add. • Gran mejora respecto a I/O. • Costo: 15-20M$ Performance proc. 8.2 Pico: 488 Mflops por proc. Código de multiplicación de matrices corre a 1.7 Gflops sobre 4 CRAY-3 • Versión en GaAs de CRAY-2, desarrollada por S. Cray (Cray Computer Company) • CP de 2 ns. • 16 proc. • Memoria de 512Mwords estática con 256 o 512 bancos, bank busy time de 25 ns, tiempo de ciclo de memoria de 50 ns. 2 puertos a memoria por CPU. Total BW de memoria 16 veces CRAY-2 • VR tailgating emula chaining • Pico de 16 Gflops • Liquid colant inmersion • Elimina desbalance de CRAY-2 aumentando velocidad escalar a 4 veces CRAY-2. • Precio alrededor de 25-30 M$ 8.3 CRAY X-MP • Hasta 4 proc. • Cada propc posee misma arquitectura que CRAY-1, excepto que tiene 3 vı́as a la memoria, y CP de 8.5 ns. • Memory hasta 16 M y 64 bancos. El modelo X-MP-4 ECL tiene bank busy time de 34 ns y tiempo de acceso de 14 CP • Incorpora SSD • Costo de 25 a 30 M$ • Anunciada en Agosto 1982, primera entrega en Junio 1983 9 Introducción a MIMD archivo: mimdint.tex 3 horas aprox Fuentes: 9.1 El Stone, el Almasi & Gottlieb y notas personales. Definición y objetivos Según Flynn (1972), un computador MIMD es “una máquina que comprende mútiples unidades procesadoras, cada una de las cuales ejecuta su propia secuencia de instrucciones independientemente sobre datos locales, cooperando en la solución de un problema, gobernados por un mismo sistema de operación, de manera ası́ncrona”. Esta definición lo diferencia claramente de los sistemas distribuı́dos, y de los otros tipos de máquinas con paralelismo (Vectorial, SIMD, etc). Sin embargo, habrı́a que aclarar que los “datos locales” no significa que no pueden compartir datos. Lo que Flynn debı́a tener en mente es que cada procesador trae (al CPU) su propio conjunto de datos para procesar. El interés del MIMD reside en el potencial de ejecutar una tarea, que tarda un tiempo T en un procesador, en un tiempo T/N en N procesadores, es decir, alcanzar un Speedup de N con N procesadores. Podemos ver los beneficios potenciales del MIMD de dos puntos de vista: Costo: una máquina MIMD con un número suficiente de procesadores podrı́a substituir (provee mismo performance) una máquina costosa (mainframe o supercomputador). Debido a que el costo de dichos procesadores es bajo, el costo del MIMD serı́a mucho menor que el de la máquina reemplazada. Velocidad: Dado un desempeño deseado, basta con agregar un número de procesadores suficiente para alcanzarlo. Al concepto de crecimiento del desempeño con respecto al número de procesadores se le denomina escalabilidad. 9.2 Modelos de desempeño El desempeño real obtenido en una máquina MIMD se vé limitado por factores ligados a la naturaleza de la tarea a ejecutar y a la arquitectura. Limitaciones inherentes a las aplicaciones: Ya en 1967 Amdahl estableció que las aplicaciones no eran completamente paralelizables. En cambio, propuso un modelo de las aplicaciones dividido en dos partes: una parte o fracción paralelizable y una fracción serial. El speedup está acotado (ver clase performance) por la fracción serial. Limitaciones inherentes a la arquitectura: Una tarea que es repartida en una arquitectura MIMD, necesitará que sus partes se comuniquen (intercambiando datos, por ejemplo) para cooperar en la ejecución de la tarea, salvo en el muy excepcional caso (pero que existe) en que no hay necesidad de comunicación y todos los procesadores tienen un canal propio de E/S. Al tiempo de ejecución de las tareas debe agregarse el tiempo invertido en la comunicación, el cual es puro overhead respecto al secuencial, donde no existe. Este tiempo de comunicación puede a su vez dividirse en dos partes, si la arquitectura permite solapamiento de comunicación y cálculo (ej: Transputer). La expresión del Speedup S generalizado que toma en cuenta todos estos factores es: S = tsec. fs .t + (1 − fs )tsec. /n + fno−sola. .tcom • tsec. es el tiempo que tarda la aplicación en un solo procesador • fs es la fracción serial de la aplicación, 1 − fs es la fracción paralelizable. • n es el número de procesadores. • tcom es el tiempo total de comunicación, fno−sola. es la fracción de ese tiempo que no es solapada con los cálculos. 9.3 Granularidad Una aplicación puede representarse como un grafo dirigido, cuyos nodos son las sub-tareas que la componen, y los vértices la dependencia de datos entre tareas. Una arquitectura paralela también puede representarse como un grafo dirigido, cuyos nodos son los procesadores y los vértices los canales de comunicación entre nodos. La granularidad de una tarea es una medida del tamaño de las sub-tareas que la componen11 . La expresión de la granularidad de una tarea, es decir, su partición en tareas, reposa a menudo sobre el usuario. Para ello, este dispondrá desde directivas del compilador (es el caso tı́pico de garnularidad gruesa en supercomputadoras, incluso Cray tiene compiladores paralelizantes) hasta lenguajes paralelos con diferentes niveles de granularidad (occam, ADA, etc.) o con granularidad fina (Data-Flow). La granularidad de una arquitectura expresa la potencia de cálculo de los nodos. Mientras mayor sea la granularidad, menor será la necesidad de comunicación entre nodos (es decir, menor será el overhead) pero también será menor el paralelismo aprovechado de la aplicación. El objetivo de la partición de una aplicación es de obtener un nodo para cada procesador de la arquitectura. Los parámetros pueden ser varios: número de nodos y topologı́a de la arquitectura, número de nodos de la aplicación. Hay una gran interrlación entre éstos. Por ejemplo, podrı́a fijarse la arquitectura y tratar de encontrar una partición de la aplicación que se adapte bien a esa arquitectura. O al revés, dada una partición, encontrar una topologı́a y número de procesadores de la arquitectura que se adapte bien a la partición. Stone presenta el siguiente modelo para expresar granularidad. Se tienen M tareas y N procesadores. Al distribuir las tareas en esa máquina se obtiene un quantum de ejecución R y un overhead de comunicación C para ese R. El factor R/C es una medida de la granularidad. • R/C grande =⇒alta (gruesa, coarse) granularidad: puede no aprovecharse el paralelismo. • R/C pequeño =⇒baja (fina, fine) granularidad: el overhead es mayor que el beneficio obtenido 9.4 Conclusiones sobre el desempeño • El procesamiento en paralelo en MIMD agrega un overhead que no existe en mono-procesador. Este overhead incluye: scheduling, contención, sincronización y comunicación entre procesadores. • Agregar procesadores tiende a disminuir la parte computacional, pero incrementa el overhead. Este puede incluso crecer más que linealmente. • El objetivo del diseñador de arquitecturas es obtener una máquina “balanceada” en R/C. Sin embargo, esto es fuertemente dependiente de las herramientas de compilación y de aprovechamiento de paralelismo de una tarea. Como ejemplo, tenemos la CM-1, con un tremendo desempeño en ciertas aplicaciones. Falacias [Stone] Una máquina de muchos procesadores de tecnologı́a obsoleta pueden reemplazar a una máquina pequeña (pocos o un procesador). La máquina paralela siempre se hará más cara cuando sus componentes se irán poniendo obsoletos, su producción (oconstrucción) se encarecerá. Además, la necesidad de herramientas especiales para máquinas paralelas hace que el costo de la segunda crezca con el tiempo. Podemos obtener el desempeño deseado con solo agregar el número de procesadores suficiente. 11 Este modelo asume que las tareas son divididas en granos relativamente iguales. Esto ya fué invalidado con la presentación de los modelos más acordes con la realidad. El trade-off en R/C puede verse de la siguiente manera: ¿cuántos procesadores necesito para alcanzar un desempeño dado? Esto, si es posible, tendrá un costo creciente con el número de procesadores. Si para aumentar el desempeño en 30% debo multiplicar por dos el número de procesadores, podrı́a pensar que no tengo el rendimiento que justifique la inversión. 9.5 Taxonomı́a de MIMD Entre las múltiples taxonomı́as de arquitecturas que se han publicado, tomaremos aquı́ solamente dos. La primera clasifica las máquinas únicamente por el número de procesadores que posee. La clasificación es: Paralelismo bajo: incluye las máquinas con menos de 20 procesadores. Mi heurı́stica para determinar el corte es el número de procesadores de CRAY, actualmente en 16 (CRAY Y-MP C90). Paralelismo mediano: entre 20 y 1000 procesadores. Paralelismo masivo: más de 1000 procesadores. Todos estos números dependen de la tecnologı́a y de la granularidad. Uno puede pensar que el costo de una máquina crece con n. Para n masivo, el costo de cada procesador no puede ser muy grande, p.e, CM-1 con procesadores muy sencillos (1 bit). En cambio, para n pequeños, se puede tomar lujos en los procesadores, p.e., CRAY. Sin embargo, con los avances tecnológicos cada vez tenemos máquina con nodos potentes que desafı́an esta regla (e.g.: Delta de intel, Ncube, CM-5, etc). La segunda taxonomı́a atañe solo a los MIMD. Esta los clasifica de acuerdo a la conexión procesadoresmemoria. La memoria, como vimos en pipeline, también debe paralelizarse para aceptar accesos simultáneos. Tendremos entonces un conjunto de módulos de memoria y un conjunto de procesadores. Memoria Compartida: Cada procesador tiene acceso a cualquier módulo de memoria. El acceso se realiza a través de una Red de Interconexión (RI). Los procesadores comunican a través de variables compartidas. Memoria Distribuı́da: Cada procesador tiene solo su memoria local. La comunicación de datos o acceso a otros módulos de meoria se realiza por intercambio de mensajes entre procesadores. Los procesadores están conectados a través de una RI. M1 P1 M1 P1 M2 P2 M2 P2 RI .. . Mm .. . Pn .. . Mn .. . Pn RI 10 Redes de Interconexión archivo:ri.tex, ruteo.tex 10.0.1 Introducción Permiten la conexión de procesadores a memorias (en SIMD y MIMD/SM) o entre procesadores (MIMD/DM). Parámetros a considerar en RI 1. Latencia: cuánto tarda un mensaje (pedido de acceso) en atravesar la red. 2. Ancho de banda: qué tráfico soporta. 3. Conectividad: capacidad de establecer conexiones 4. Costo del Hardware: depende del número de elementos de comuntación. 5. Fiabilidad: capacidad de funcionamiento en caso de falla de algún componente. 6. Funcionalidad: qué tipo de funciones incorpora la red (e.g.: recombinación para “hot spots”). El ancho de banda de una RI es una medida de la capacidad de accesos simultáneos que ella provee. El ancho de banda promedio consumido BWc será una función de la probabilidad de acceso de cada procesador, del número de procesadores, del tiempo del ciclo de acceso y de la cantidad de información (bits) de cada acceso. Caracterı́sticas de una RI • Estática (MIMD/DM) o Dinámica (conexiones programables) • Modo de operación: sı́ncrono (e.g.: SIMD) o ası́ncrono. • Método de conmutación: por paquete o por circuito. A continuación presentaremos las RI dinámicas. Las estáticas, usadas únicamente en MIMD/DM, son descritas en la clase sobre MIMD/DM. 10.1 Buses Un bus une en una misma vı́a de acceso un conjunto de procesadores y memorias. La gran ventaja del bus es la economı́a en hardware, por ello su uso en sistemas baratos. El acceso al bus se hace en exclusión mutua, lo cual produce contención: un acceso debe ser pospuesto debido a que hay otro en curso. Sea un sistema con N procesadores conectados por un bus a una o más memorias (elementos pasivos). Las caracterı́sticas del sistema son: Ancho de banda (por procesador): proporcional a 1/N Latencia: constante (resp. a N) Conectividad: cualquiera con cualquiera Costo en hardware: en cable y en conmutadores es prop. a N Fiabilidad: Débil Control de acceso al bus: Para controlar el acceso en exclusión mutua al bus, existen varios protocolos, entre ellos: daisy chainning (prioridad al más cercano), fixed time slice, LRU, rotating daisy chaining, FIFO. Ancho de banda El BW en un bus será expresado en función del ciclo de acceso, del tamaño del bus (que define la cantidad de bits en cada acceso). Sean p procesadores conectados a una o más memorias a través de un bus. Supongamos que, en cada ciclo de acceso, la probabilidad de que un procesador accese al bus es independiente del resto e igual a r. La probabilidad de que no accese al bus es entonces (1 − r). La probabilidad de que ningún procesador accese al bus es (1 − r)p . La prob. de que haya al menos un acceso al bus es 1 − (1 − r)p . Como el bus solo atiende un pedido en cada ciclo, el promedio de pedidos de acceso atendidos por ciclo es igual a la fracción de ancho de banda consumida: FBW 1 − (1 − r)p = Mientras más cercano sea a 1 FBW , mayor será el ancho de banda consumido, es decir, que habrá mayor competencia por el bus y mayor contención (el bus se satura). Nótese que a mayor r, más rapidamente se satura el bus respecto a p. El ancho de banda es: BWc = FBW × AnchoBus bits tc iclo segundo Los pedidos que no son atendidos, serán reemitidos al ciclo siguiente, por lo que la rata r aumenta a una nueva rata aumentada a. Bajo una polı́tica equitable de otorgamiento de acceso al bus, la probabilidad de que un pedido sea aceptado es (asumiendo independencia e igual probabilidad entre procesadores): Pa = 1 − (1 − a)p pa Multiples buses Tener múltiples buses mejora con respecto a un solo bus, pero debido a que el costo en cable y conmutadores depende del ancho del bus, esto hace prohibitivo su uso (ver x-bar). Varias máquinas multi-bus han fracasado, la última fué la SUPRENUM. 10.2 Conmutadores de barras cruzadas o x-bar Los conmutadores x-bar son herencia de la telefonı́a. Un x-bar es una matriz de conmutadores elementales N × M que permite la conexión de N objetos de entrada a M objetos de salida. Estos objetos pueden ser procesadores y memorias (es el caso de MIMD/SM y SIMD) o únicamente procesadores (MIMD/DM). Cada conmutador cij tiene dos estados: ON, conecta el objeto de entrada i al objeto de salida j; y OFF (no conectado). Ancho de banda (por procesador): constante Latencia: constante (resp. a N ) Conectividad: cualquiera con cualquiera libre Costo en hardware: en cable prop. a N y en conmutadores prop. a N2 Fiabilidad: Alta La operación de una red x-bar necesita la programación del estado de cada conmutador, en función de la fuente y el destino. Este control debe estar a cargo de alguien (árbitro) para evitar conflictos sobre una lı́nea. El tipo de conmutación de x-bar es conexión de circuito tı́picamente, lo cual permite comuicación en ambas direcciones. Nótese que el costo en conmutadores crece con el cuadrado de N . Si tomamos en cuenta el ancho de las lı́neas, entonces tenemos que el número de conmutadores es igual a (Ancho×N )2 . Si tomamos en cuenta que el ancho es la suma del ancho del bus de datos (e.g: 32) más parte del ancho del bus de direcciones (entre 20 y 30 bits) tenemos una idea de los prohibitivo de esta opción con buses. Una memoria multi-puerto (como la usada en Cray’s) equivale a este esquema. Es por eso que N es pequeño. Ancho de banda El ancho de banda de un x-bar puede estimarse analı́ticamente como en el caso del bus, a diferencia que en x-bar habrá un número promedio de solicitudes aceptadas por ciclo. Existen otras técnicas de estimación del desempeño, tales como: colas y cadenas de Markov, simulación, midiendo en sistema real. Tenemos una red x-bar que une p procesadores a m módulos de memoria. Se asume: pedidos sı́ncronos (a principio del ciclo), accesos aleatorios, equiprobables (Prob. de que Pi accese a mj = 1/m ya que a cada ciclo un P debe accesar un mo’dulo)) e independientes entre sı́, independencia entre nuevos y rechazados. FBW = m(1 − (1 − 1/m)p ) Nota: el ideal es m. Si m/p es constante, tiende a una cosntante. En el caso de que los procesadores tengan memoria local, y de los MIMD/DM, no siempre habrá acceso a través de la red. Sea r la probabilidad de que un procesador solicite un acceso a la red. FBW = m(1 − (1 − r/m)p ) Nota: crece con p y con m La probabilidad de aceptación de un acceso es Pa 10.3 = FBW rp Redes Multi-etapas Objetivo: ofrecer una buena conectividad a un costo en conmutadores menor que el x-bar. Precio a pagar: latencia (varias etapas a atravesar en vez de una); conectividad (capacidad de conexión). Estudiados en telefonı́a por Clos y otros desde los años 50. Clos determinó los parámetros de interés de una red. Capacidad no-bloqueante: una red es sin bloqueo si es capaz de establecer una conexión entre una entrada y una salida inactivas sin alterar las otras conexiones. Capacidad de ser re-ordenable: (en inglés rearrengeable). Una red es reordenable si es capaz d establecer una conexión entre una entrada y una salida inactivas eventualmente redistribuyendo las conexiones existentes. Ciertas permutaciones son particularmente relevantes: • Shift (up and down): (cálculo de matrices, acumulaciones) Shif t(a0 , . . . , an−1 ) = an−1 , a0 , . . . , an−2 • Perfect Shuffle: (barajadura en el H y B) si n es par P S(a0 , . . . , an−1 ) = a0 , an/2 , a1 , an/2+1 , . . . • Identidad Construcción: cada etapa consiste de un número regular de x-bar (a × b). Las salidas de la etapa i son las entradas de la etapa i + 1 según una permutación fija. Las redes multi-etapas se clasifican en dos familias: Clos (variantes de la red original general descrita por Clos) y Banyan (redes que surgen de establecer un árbol de conexión entre cada entrada y cada salida). A la familia de Clos pertenece Benes. A la familia Banyan pertenece Omega, Shuffle, Shuffle-exchange, Baseline. 10.3.1 Red de Clos Una red de Clos C(p, q, r) posee tres etapas, y conecta p × r entradas a p × r salidas. Sus propiedades son: q ≥ p =⇒Re-ordenable q ≥ 2p − 1=⇒No-bloqueante El costo en conmutadores (puntos de cruce) es 2rpq + qr2 en lugar de p2 × r2 del x-bar. 10.3.2 Red de Benes̆ Es una red de Clos C(2, 2, 2N −1 ), con 2 log2 N − 1 etapas, y N/2 conmutadores elementales por etapa. Como q = p = 2, la red es re-ordenable. Inconveniente: el cálculo del control de los conmutadores es complejo. La solución (usada en GF-11, 576×576 SIMD para interconectar procesadores) es de tener una tabla para las permutaciones más frecuentes. Se determina a la compilación. 10.3.3 Redes Banyan Una red de Banyan se define como todas aquellas que poseen un sólo camino entre cada entrada y cada salida. Su costo crece en n log n, por lo cual son mucho más económicas que las redes Clos. Por el contrario, son altamente bloqueantes, pero su programación e implementación son muy sencillas. Son tag-directed =⇒packet switching Una red Banyan se caracteriza como B(a, b, l), donde l es el número de etapas, y los elementos de conmutación en cada etapa son a × b, conectando al entradas con bl salidas. En l etapas de a × a, una entrada puede enviarse sobre al . El número de conmutadores es #C = al+1 l. Si n = al , entonces #C = n × log n × a/ log a Una red Delta es una red Banyan, en la cual las conexiones entre etapas se hacen en perfect shuffle. Problema: no hace identidad Entre las redes Banyan más populares está la red Omega, la cual es equivalente a un hipercubo. 10.3.4 Desempeño y ancho de banda Utilizando el modelo analı́tico, y con las asumpciones tomadas para el caso del x-bar. El ancho de banda se calcula en cada etapa. Si los elementos de conmutación son a × b y hay l etapas, entonces: BW = bl rl Pa = bl rl al r Donde ri = 1 − (1 − ri−1 /b)a 10.3.5 Conclusión redes multi-etapas Clos costosa en conmutadores, difı́cil de programar, usada para sistemas grandes, SIMD (por reordenabilidad), circuit switching Banyan Util para packet switching, problema de bloqueo, muy utilizado. El problema de contención es atenuado con recombinación de pedidos (hot spots). Esto aumenta complejidad de los switches en el orden de 6. 11 MIMD Memoria Compartida Motivación Los MIMD/SM tienen una serie de propiedades interesantes: • El espacio único de memoria coincide con la visión del programador. • El compartimiento de datos y código se hace de manera natural y económica. • De igual manera, los accesos de E/S hacia y desde la memoria son simples. • Soporta eficientemente los paradigmas SM y DM. Sin embargo (veremos para memoria distribuı́da), posee algunos inconvenientes: • No se expande facilmente (escalabilidad). Este es el mayor inconveniente de los MIMD/SM. • Se necesitan técnicas de sincronización para controlar los accesos a las variables compartidas. • La contención puede reducir la velocidad del sistema (ej: hot spots). • El uso de caches para mejorar el desempeño impone el control de la consistencia de caches. • El debugging es complicado (Manejo de semáforos, ¿Quién alteró la variable? , etc.) Las máquinas MIMD/DM en cambio son escalables pero más difı́ciles de programar y dependientes de la arquitectura. La tendencia actualmente es a combinar los dos esquemas de la siguiente manera: una máquina DM a la base, con HW y SW especial para implementar un espacio único de memoria (Virtual shared memory). Actualmente hay gran actividad en este tópico, y ya hay máquinas escalables con este esquema hı́brido (KSR1, Dash,...). 11.1 Técnicas de sincronización Las técnicas de sincronización entre procesos son especialmente relevantes para MIMD/SM ya que necesitan acceso controlado a variables compartidas, y también a otros recursos ya que están fuertemente acoplados. Estos accesos se hacen tı́picamente en exclusión mutua; la sección de código que accesa a ese recurso se encierra en una sección crı́tica. Entre las técnicas de control de exclusión mutua tenemos los cerrojos locks y los semáforos. Además de sincronizarse para accesar a variables compartidas, también necesitarán sincronizaciones generales (de control) como las barreras. Estas técnicas necesitan un apoyo especial de hardware para ejecutarse sin conflictos en una arquitectura MIMD/SM. Veremos algunas de las más utilizadas. 11.1.1 Test and Set Prueba el valor de una variable y la modifica de manera atómica (tı́picamente bloqueando el bus). Devuelve el valor de la variable. Se usa para implementar LOCKS: lectura de la variable, prueba si es cero (abierto), y si lo es lo pone en uno. Si no se hace de manera atómica, se corre el peligro de que dos procesos vean simultaneamente la puerta abierta y entren! LOCK(x):begin var y:integer; Repeat {y <- TAS(x)} until y=0 end El LOCK (o Spin-lock) se queda en espera activa hasta que entra. Esto puede traer consecuencias terribles en el desempeño (hot spot), además de retardar (por conflicto) el UNLOCK. Una alternativa es el semáforo binario, que pone a dormir a los procesos en espera (puede manejar prioridades u orden de llegada para escoger cuando se libere). Esto es más efectivo que el spin-lock dependiendo del costo de cambio de contexto. Se necesita que los procesos sean suficientemente “pesados” para que sea más eficiente que spin-lock. Además, el manejo de la cola de procesos en espera implica el acceso a una varable compartida: el apuntador a la cabeza de la cola (encolar debe implementarse sobre un mecanismode spinlocks). 11.1.2 Incr y decr. Usado para semáforos generalizados. Se lee una variable y se incrementa (o decrementa) de manera atómica. Incr(add): Mem[add] := Mem[add] + 1 Return(Mem[add]) Su utilización en un semáforo generalizado serı́a LOOP: while sem < 0 do skip if decr(sem) < 0 then incr(sem) goto LOOP {seccion critica} incr(sem) Incr/decr provee forma fácil de implementar semáforos generalizados pero no resuelve spin/lock ni contención. 11.1.3 Compare and Swap Reuce muchas regiones crı́ticas sobre una variable compartida a una sola instr. atómica (Ej: manipular la var. compartida apuntador a cabeza de cola). Debido a que el tiempo dentro de la rehión se reduce, disminuye la contención respecto a hacerlo con semáforos. CAS(dir,old,new): temp := Mem[dir] if temp = old then Mem[dir] := new return(true) else old := temp return(false) Problema: difı́cil de usar (ver Stone) 11.1.4 Fetch and Add Permite acceso concurrente a uan msima variable =⇒reduce contención por hot spot (no por conflicto de banco). Ver Gotlieb (RP3 y Ultracomputer). Más complejo que CAS. Requiere red combinadora. El efecto es de secuencializar las operaciones sobre una variable. FAdd(dir,cte) temp := Mem[dir] Mem[dir] := Mem[dir] + cte return(temp) 1. La localidad se escribe una sóla vez para satisfacer M peticiones de escritura concurrente. 2. Los valores retornados a los M procesadores son los mismos que los que retornarı́a algún ordenamiento serial arbitrario de accesos. Nótese que actualizar variables tipo cuenta bancaria no requiere semáforos nio reg. crı́ticas: solo FAdd. (Ver Stone para uso en implementación de cola de procesos) No está cllaro si el costo de la red combinadora se justifica; nótese que los accesos deben ser simultáneos!. 11.2 Barreras • Una barrera de sincronización es un punto al cuál deben llegar todos los procesos antes de continuar. • Surge en paralelización de lazos (tı́picamente) y algoritmos data parallel (sincr. por iteración) • Implementadas a menudo con un bus adicional que conecta a procesadores para efectos de control. La implementación en HW equivale a prender u bit porprocesador indicando si ninguno a llegado, si alguno o si todos. Por SW implica un test sobre un contador =⇒hot spot. Existe una nueva técnica (a ser implementada en SW) de una barrera difusa, donde el compilador trata de hacer algunas instrucciones mientras espera (ver paper Gupta y Epstein) 12 MIMD Memoria Distribuida [2 clases] Los MIMD/DM son arquitecturas sin espacio común de memoria, cada procesador posee su memoria local. El acceso a datos no locales se hace por intercambio de mensaje entre procesadores. Los procesadores de estas arqitecturas están interconectados a través de una red, que puede ser reconfigurable (dinámica) o estática. En las dinámicas, tenemos todos los tipos estudiados en la clase de RI, y que son ampliamente utilizadas en MIMD/SM. Las estáticas, que dan origen a topologı́as fijas, son particulares de los MIMD/DM. Veremos las más comunes y sus propiedades. Ventajas de la MIMD/DM: viceversa, ver más abajo): lo que es desventaja en MIMD/SM es ventaja para el MIMD/DM (y • El debugging es más simple (que en MIMD/SM). Como la información se comparte únicamente vı́a mensajes intercambiados entre procesadores, basta con analizar la traza de las comunicaciones para detectar los problemas, en lugar de llevar trazas de todos los acesos a memoria. • Escalabilidad: debido a que el acoplamiento es débil, el crecimiento de la arquitectura es más sencillo, tı́picamente no hay conmutadores. • Ancho de banda de la memoria es proporcional al número de procesadores. En contrapartida, la DM presenta las siguientes desventajas: • Carga de programas y datos debe hacerse en cada nodo, al igual que la salida debe permitir el acceso desde cada nodo. Esto implica un overhead en el aranque, y en la obtención de resultados. Además, si utilizamos replicación de datos para reducir comunicaciones, podemos traer problemas de consistencia. • La programación es más difı́cil (menos natural) • Menos flexible: una SM puede simular eficientemente una DM, pero no a la inversa. • Necesidad de enrutamiento. 12.1 La comunicación Tı́picamente, la comunicación es más costosa en tiempo que el cálculo en los procesadores, lo cuál determina que en MIMD/DM la granularidad debe ser suficentemente alta. Para reducir este problema, se dota a los procesadores de cálculo con co-procesadores de comunicación, que pueden funcionar concurrentemente con los cálculos. La caracterı́stica esencial de los DM es la comunicación. Si la red es estática, la comunicación entre dos procesadores puede acarrear la necesidad de enrutar los mensajes. Si la red es reconfigurable, hay que agregar la reconfiguración de la red. Es decir, necesitamos un sistema de transporte (capas 0 a 2 de redes OSI). Además, la comunicación de mensajes puede hacerse por paquetes o enviando el mensaje completo. Si los mensajes son largos, vale la pena paquetizar ya que ası́ el sistema es más equitable: ningún mensaje ocupa demasiado tiempo un enlace. Si los mensajes son pequeños, entonces puede evitarse el overhead de enpaquetar y desempaquetar el mensaje. El tiempo de una comunicación punto a punto puede desglosarse ası́: • Preparación de la información P . Ej: a la transmisión tenemos paquetización, encabezados, envı́o a la cola, y a la recepción tenemois las operaciones inversas. • Permanencia en las colas Q. Puede haber varios paquetes compartiendo el enlace de comunicación. • Transmisión: esto incluye el start-up de protocolo de bajo nivel (Tstartup ) y la transmisión de la información en sı́, que depende de la rata (R) y del tamaño del mensaje (L). • Propagación de la señal en el medio. La fórmula del retardo D por comunicación incluye todos estos factores D = P + Q + (Tstartup + RL) Ej: T800 El cálculo por una comunicación punto a punto de un dato de 32 bits en el T800 es: P + Tstartup R Q L = 2.5µs ≈ 0.07µs/bit =⇒D = 4.7µs = 0 = 32 Una operación flotante en el T800 tarda 0.25µs, lo cual implica una relación Cálculo por comunicación del orden de 20!. 12.2 Enrutamiento Es necesario cuando dos nodos que no están directamente conectados desean comunicar. En el casos de redes estáticas, será generalmente necesario a menos que se tenga un grafo completo (raro!). En el caso de redes reconfigurables, depende de si enrutar es más o menos costoso que reconfigurar la red. Existen dos técnicas de enrutamiento: Store and Forward: un mensaje (o paquete) es de nodo en nodo hasta alcanzar su destino. En cada nodo, el mensaje (o paquete) es recibido (almacenado) completo y luego reenviado. Sea Nint el número de nodos intermedios atravesados, la latencia es TSF = P + Q + Tstartup + RLNint Cut-Through: el mensaje (o paquete) es reexpedido antes de ser totalmente recibido, desdde que el encabeado es recibido y decodificado. La latencia es TCT = P + Q + Tstartup + RL + Td Nint En general, el CT es mejor, ya que la latencia es menor y necesita menos capacidad de buffer. Una variante del CT utilizada en el T9000 y el hipercubo es el Wormhole Routing. La variante consiste en que WH bloquea la ruta cuando no puede avanzar, mientras que CT guarda el mensaje en buffers hasta que la ruta es liberada. Cálculo de la ruta: La ruta viene dada por una función de enrutamiento R en cada nodo, que asigna el próximo nodo-enlace para cada mensaje que pasa por el procesador. El enrutamiento puede ser: Estático: la ruta es determinada en función del origen y destino (EJ: la ruta más corta). No hay balance de carga. Dinámico: la ruta para mensajes con el mismo origen y destino puede variar, de acuerdo, por ejemplo, a la carga. Permite balancear las comunicaciones, pero el cálculo es más costoso (overhead adicional), e implica posibilidad de desecuenciamiento. Bloqueo: Un enrutamiento puede provocar bloqueos (deadlocks). La prevención de bloqueos es más complicada en el caso dinámico. Un bloqueo puede surgir tı́picamente por saturación de buffers. Ej: Sea un anillo de 4 procesadores n0 − n3 , cada uno con capacidad de almacenar unmensaje en tránsito. Un bloqueo se presenta si cada nodo emite un mensaje a un destinatario alejado de dos nodos (eg: n0 →n2 , etc.). En este caso ningún mensaje puede avanzar hasta su destino y tenemos un bloqueo. Una solución a este problema es de establecer canales virtuales para cada mensaje. Un canal virtual establece un buffer privado en cada nodo para cada ruta origen-destino. 6 n2 Store and Forward n1 n0 n2 n1 Cut-Through n0 Th Tm • Th es el tiempo que tarda en recibir y decodificar el encabezado. • Tm es el tiempo que tarda en enviar completo un mensaje al nodo vecino. Figure 1: Latencia según la técnica de enrutamiento. 12.3 Topologı́as fijas Los parámetros de interés para el análisis de una topologı́a son12 : 1. Diámetro: el máximo de las distancias mı́nimas entre dos nodos cualesquiera. 2. Conectividad: medida de l número de caminos independientes entre un par de nodos. Es el mı́nimo número de nodos o arcos que deben ser suprimidos para que la red sea disconexa. 3. Flexibilidad: capacidad de resolver problemas para otras topologı́as. 4. El número de procesadores, el número de arcos. 5. Tiempo de comunicación (latencia), para ciertas familias de comunicación: (a) Broadcast: óptimo es O(d) (d es diámetro). (b) Single and multi-node accumulation: equiv. a 5a (c) Single node scatter (gather) y total exchange. Ver Bertsekas y Tsitsiklis “Parallel and Distributed Computation: Numerical Methods”, Prentice-Hall International, 1989. 12.3.1 Topologı́as comunes Lineal: Diámetro D = n − 1. Conectividad C = 1 (pobre). Ruteo simple. enlaces/nodo = 2. Anillo: D = techo(n − 1/2), C = 2. Ruteo simple. enlaces/nodo = 2. Arbol: C = 1 D depende del tipo de árbol: • Estrella: D = 1 • Lineal: D = n − 1 Malla: malla de d-dimensiones, con ni nodos en cada dimensión. (x1 , . . . , xd ), xi ∈ {1, . . . , ni } Los arcos son los pares ((x1 , . . . , xd ), (x1 , . . . , xd )) , ∃i | xi − x0i |= 1, ∀j 6= i, xj = xi Pd El diámetro D = i=1 (ni − 1) = O(N 1/d − 1) enlaces/nodo = constante(2d) Extensible Hipercubos: El hipercubo binario (una malla con ni = 2.) posee una serie de proiedades topológicas interesantes que motivaron su utilización en varias máquinas experimentales y comerciales (CM-1, iPSC, nCube, etc.): • Hipercubo de d dimensiones posee 2d nodos. • Cada nodo está conectado a d vecinos. • Número de arcos total = d2d−1 • Sea un hipercubo de dimensión d, cuyos nodos están etiquetados por un número binario según la codificación de Gray b1 , . . . , bn , donde n = 2d . Un hipercubo de dimensión d + 1 se obtiene agregando n nodos con las etiquetas tomadas de manera que b1 , . . . , bn −→0b1 , . . . , 0bn , 1bn, . . . , 1b0 12 Estos parámetros son aplicables a redes de interconexión en general. • Posee d caminos disjuntos entre dos nodos • Si Distancia de Hamming entre dos nodos es K, entonces K de los caminos atraviesan K enlaces y el resto son de K + 2. • Diámetro D = log2 N • El enrutamiento es simple (equivalente a tagged self-routing). El algoritmo que toma la ruta más corta: Sea P = p1 , . . . , pd el nodo fuente y D = d1 , . . . , dn el destino, entonces los bits en “1” de P ⊕ R indican la dimensión a escoger como próximo nodo. Ej: tomo siempre el más significativo. • Hipercubos mapean: anillos (código de Gray); mallas (se agrupan los bits de acuerdo a la dimensión de la malla. Ej: 8→4 × 2⇒b0 b1 b2 →x = b0 b1 , y = b2 ); árboles (se puede construir un árbol balanceado con dos raı́ces) El gran inconveniente del hipercubo es la escalabilidad: • Un hipercubo crece sólo en potencias de 2. • El número de enlaces por procesador aumenta =⇒limitació fı́sica del procesador. Para paliar los inconvenientes del hipercubo, se han propuesto variantes (redes jerárquicas) donde cada nodo del hipercubo consiste en una red de procesadores. Un ejemplo de esto es el Cube Connected Cycles (CCC), donde cada nodo es un anillo de d procesadores. La idea es aprovechar localidad. 13 MIMD: Esquemas Hı́bridos [2 clases] Referencias: 13.1 [NL91, LLG+ 92, Hwa93, Nik93, DT90] Motivación Dadas las ventajas y desventajas de cada esquema de MIMD, rápidamente surgió la motivación de combinar ambos esquemas para obtener lo mejor de cada uno. • Desde el punto de vista de los SM, el objetivo es resolver el problema de la escalabilidad de la red, y aliviar el tráfico en la red (disminuir los conflictos). • Desde el punto de vista de los DM, los objetivos son facilitar la programación y hacerla independiente de la topologı́a. En el SM, la solución para aliviar el tráfico de la red es usar cache. Este permite mantener la visión de un espacio único de memoria. El problema de la escalabilidad de la red es más difı́cil de atacar. Una solución es hacer clusters de procesadores compartiendo memoria local, y unidos por alguna red a la memoria global. Con este esquema jerárquico, puede haber crecimiento sin necesidad de afectar a la red entre clusters. En DM, la solución consiste en una combinación de HW y SW para dar una visión de espacio único de memoria. En este caso, la memoria global está distribuida entre las memorias locales, con posibilidad de replicación, lo cual las hace ver como caches. Los esquemas resultantes puden ser: • Una memoria principal y caches distribuidos • No memoria única principal, sino distribuida, con visión de espacio único • Igual a la anterior, pero con caches locales además de memoria principal • MIMD/DM con software Estas soluciones hacen que ambos esquemas se confundan, dando origen a máquinas llamadas Virtual Shared Memory, Distributed Shared Memory o NUMA (Non-Uniform Memory Access machines). En ambos casos, se plantea la necesidad de resolver el problema de la coherencia de caches o variable compartida. Para mantener la coherencia del cache se debe: 1. Si al leer una variable del cache se produce una falla de cache, debe buscarse el último valor. Si existe memoria global, y ésta está actualizada, se toma de allı́. Sino, debe interrogarse todos los demás caches para saber quién lo tiene. 2. Al escribir una variable compartida, se debe invalidar las copias en el resto de los caches. Si existe memoria global debe actualizarse. El impacto sobre el desempeño de escribir es mayor que el de leer, ya que después de la primera lectura, las siguientes lecturas producen aciertos. Solución trivial 1: No permitir que variables compartidas entren al cache (ej: un determinado rango de localidades en memoria virtual que son inamovibles o usando versiones especiales de LOAD y STORE que bypasseen el cache). Esta solución es utilizada pero implica un mal desempeño, ya que deben accesarse en exclusión mutua. En DM, implica tener sólo una copia de cada variable, lo cuál equivale al esquema puro. Solución 2: Control de coherencia estático. Consiste en dividir datos en • privados. Son cargados en sus respectivos caches. • compartidos. Se dividen a su vez en: – Read-only o no modificables: pueden cargarse en los caches. – Modificables o r/w: no entran al cache, la única copia es en memoria principal. Es factible en aquellos casos donde pueda realizarse esta clasificación. Sin embargo, su rigidez implica pobre desempeño en muchos otros casos, ya que hay que atravesar la red para accesar la variable. Solución 3: Control de coherencia dinámico. Una actualización consiste en: 1. Buscar caches con copia del dato e invalidarlos 2. Inhabilitar caches (lock for exclusive access) 3. Modificar valor 13.2 Implementación de coherencia dinámica La coherencia implica que cuando se modifique un valor en el cache, se invalide las otras copias. Existen dos métodos de implementar esto: • si se dispone de un medio broadcast económico, tal como el bus, usar snoopy cache. Esta es la forma clásica de implementar caches coherentes en sistemas multiprocesadores sobre un bus. El problema con este método es que solo puede utilizarse en sistemas unids por bus, y que interfiere ciclos de otros procesadores. Existen protocolos “estándars” para manejar la consistencia de los caches a través de un medio broadcast, tales como el MESI (Modifief, Exclusive, Shared, Invalid) o Illinois Protocol. Este comprende los diferentes estados de un bloque del cache y las acciones que deben tomarse en cada caso. • Directorio general, que contiene, para cada bloque de memoria, apuntadores a los procesadores o nodos que poseen una copia. De esta manera, cuando haya que invalidarlas, se enviará la orden de invalidar solo a los nodos que poseen copia. Hay varias formas de implementar este directorio: centralizado o distribuido. Puede convertirse en cuello de botella si centralizado, además de ser menos escalable, pero más eficiente si SM. Otras alternativas dinámicas Invalidar al escribir: Al obtener una variable para escritura, divulga un cache-invalidate a otros caches. Actualizar al escribir: Al obtener var, divulga su nuevo valor a todos los demás caches; los que lo tengan, actualizan. Cargar al escribir: Idem que anterior, salvo que todos los caches cargan el nuevo valor. En principio, las alternativas van de mayor a menor eficiencia, salvo en el caso de programar una barrera, ya que todos necesitan el valor. El problema principal, aparte de la coherencia, es el de la latencia en accesos remotos. Espacio de direcciones. [NL91] Dos aspectos relacionados con el espacio de direcciones deben ser enfrentados por los diseñdores de sistemas: • ¿Lineal o estructurado (objetos, tuplas, ...) ? • Grano: desde word (HW) hasta página (SW). Depende de la latencia de la arquitectura. A mayor latencia, mayor grano. Un mayor grano provoca “false sharing”, mayor tráfico, etc. La tendencia es dar soporte en HW para disminuri el grano. 13.3 Sistemas basados en directorios Existen diferentes tipos de directorios, de acuerdo a como implementan el manejo de la información. En todos los casos, seconsidera que cada procesador se agrega con una cantidad igual de memoria M o de bloques K, donde K es M dividido por el tamaño del bloque. Full-map. Por cada bloque contienen: • una entrada (apuntador o bit) por nodo. Esta entrada será diferente de cero si existe una copia del bloque en ese nodo. • un bit “Dirty”. Se coloca en 1 cuando uno de los nodos tiene acceso en escritura. En ese caso todos los otros nodos tienen en 0 su apuntador. El cache mantiene dos bits de estado por bloque: 1 bit de válido y otro queindica si puede o no ser escrito. Estos bits de estado deben ser consistentes con el directorio. El full-map cubre la posibilidad que haya una copia de un bloque en todos los nodos. El tamaño del directorio es: KN entradas, cada uno de tamaño O(N ) (una entrada por procesador). Esto implica que Tamaño del directorio = O(N 2 ) El inconveniente de este esquema es que el tamaño crece cuadraticamente con el número de procesadores, además del problema de que la estructura crece con N. Todo esto atenta contra la escalabilidad de este esquema. Limited. La idea es limitar el número de procesadores que pueden tener simultaneamente copia de un bloque. Si hay más solicitudes que número de copias máximo, una de las entradas deberá invalidarse (se escoge una vı́ctima o eviction). Funciona como un set-associative cache de pointers. Si hay “processor locality”, es decir, que el worker set (número de procesadores activamente usando un bloque) es menor que el número máximo de copias, funcionará bien. Sino, habrá thrashing. En este caso, el tamaño se reduce. Como el número de entradas es constante y los apuntadores se codifican en binario (para representar N procesadores se requieren log2 N bits), entonces el tamaño de cada entrada es una constante por log2 N , en conclusión Tamaño del directorio = O(N log2 N ) El inconveniente de este método es que puede caer en thrashing. Alewife implementa una versión extendida de este esquema (LIMITLESS): Cuando se solicitan más copias que el máximo, esto causa un trap y se maneja por SW. De esta manera el caso frecuente se maneja de manera óptima (por HW) y el caso raro se contempla pra evitar thrashing. Chained lists. Implementa la estructura como una lista encadenada (o doblemente encadenada). En el directorio se encuentra un apuntador al último que solicitó copia del cache. Cada vez que un nodo solicita copia, el directorio le pasa el apuntador al anterior y registra su dirección. Cuando hay que invalidar, el directorio envia la orden de invalidar al nodo que tiene registrado, y este a su vez invalida y pasa la orden al siguiente, etc. El último (primero que solicitó copia) registra un apuntador a nulo. Este esquema es altamente escalable, pero tiene un gran costo en tiempo. 13.3.1 Directorios centralizados vs distribuidos Los directorios centralizados poseenla virtud de asegurar eficazmente consistencias secuencial (ver más adelante), ya que serializan los accesos compartidos. Para accesar en escritura un dato, hay que obtener primero el acceso en exclusión mutua. Un ente centralizado naturalmente hace esto. Sin embargo, este es un cuello de botella potencial, que genera alto tráfico sobre la red, además de conflictos (todos quieren accesar el mismo elemento) y contención. En consecuencia, para lograr escalabilidad, no basta con distribuir la memoria sino también hay que distribuir el directorio. Por otro lado los directorios distribuidos tienden a desperdiciar memoria por duplicación de información. Además, necesitan incorporar mecanismos distribuidos de exclusión mutua para garantizar acceso en exclusión mutua, invalidaciones, etc. Una forma utilizada es manejar la idea del “propietario” de un bloque. De esta manera, ese nodo se encarga de manejar los accesos a ese bloque (ver DASH). En algunos sistemas, este propietario puede cambiar (ver KSR-1). 13.4 Latencia en accesos remotos Las siguientes técnicas se emplean para atacar el problema de la latencia: Técnicas para tolerar la latencia. Estas se refieren basicamente a como reducir la diferencia entre una carga local y una carga remota. Entre estas tenemos uso de redes de alta velocidad, aceleramiento del tiempo de acceso a la cola de mensajes, agrupamiento de accesos remotos para reducir el overhead global, etc. Otra forma es jugar con el tamaño del bloque. Pero si es muy grande puede provicar “flase sharing”, es decir, que el bloque incluye dos datos que son accesador por diferentes procesadores pero, como cayeron en el mismo bloque, son tratados como si estuvieran siendo compartidos. Técnicas para esconder la latencia. La idea es evitar que la penalización por accesos remotos se refleje en el desempeño. Entre estas tenemos: 1. Modelos de consistencia relajados 2. Pre-fetching 3. Multi-threading 13.4.1 Modelos de consistencia relajados Existe una jerarquı́a de consistencia en paralelismo. En un programa secuencial, la consistencia se expresa como que el valor que devuelve una lectura es el último escrito. En el primer nivel está el modelo más restrictivo (Lamport), de consistencia secuencial. Es el que surgirı́a de ejecutar enun solo procesador concurrentemente. Lo que se obtiene es que las operaciones globales pueden ordenarse totalmente en el tiempo. En el segundo nivel están los modelos de “processor consistency” y “weak consistency”. Processor consistency significa que desde el punto de vista de las operaciones de uno de los procesadores, son secuecialmente consistentes (los writes de un procesador son vistos en orden, aunque entrelazados con los de otros procesadores). El modelo de weak cons. no impone ningún orden en las operaciones, pero provee de ciertas operaciones que se garantizan secuentially consistent. En el tercer nivel está la release consistency, que es un weak cosnsitency con dos operadores (acquire y release) que son processor consistent. El nivel superior implica menor concurrencia pero mayor facilidad para el programdor/sisterma para manejar la consistencia (exclusión mutua, etc.). A medida que bajamos, aumenta la concurrencia, es decir, el desempeño en el uso de recursos paralelos, pero complica el manejo de consistencia. DASH implementa release consistency. 13.4.2 Prefetching Prefetching consiste en traer un bloque a un nodo antes de referenciarlo. Se logrará beneficio si se gana tiempo en el acceso. Se perderá si el bloque es invalidado antes de usarse o si no se usa (por ejemplo, porque habı́a un salto condicional). La conistencia debe ser mantenida, es decir, que los bloques prefetched deben chequearse que no han sido reescritos antes de usarse. En el mejor de los casos el dato estará en el cache para el momento de usarse. Sin embargo, producen beneficios en el desempeño (ver DASH o Hwang). 13.4.3 Multithreading Tener varios threads en cada procesadro puede causar que toda la latencia sea escondida, a codnidción de tener suficientes threads y que el precio sea bajo (cambio de contexto). Esto permite solucionar el problema del remote load y casi del synchornizing load (según Nikhil) a condición qu ese maneje el match de las cargas. La idea es cambiar de contexto cuando hay un cache miss. El efecto del multithreading es bastante importante como demuestran los resulados en Hwang 93. 13.5 Problemas de la asincronı́a La asincronı́a produce basicamente dos problemas, según Nikhil. • Remote Loads. Se quiere hacer dos remotes loads (de A y B, en nodos diferentes para calcular en otro nodo. Solicita el primero, y luego, envı́a el segundo antes de recibir el primero? Si lo hace, como hacer el matching cuando empiecen a llegar? En otras palabras, cómo manejar varios eventos pendientes? • Synchronizing Loads. Mismo problema que antes. Cómo saber cuándo los valores han sido ya producidos? Si semáforos, entonces busy-waiting? o si rendez-vous, cuándo lo hace? 13.6 Soporte para Sistemas Operativos La nueva tecnologı́a RISC no ha tomado en cuenta los requerimientos de las nuevas verisones de UNIX-like SO, y no son raros los workloads en los cuales 50 % de ref. a memoria fueron causados por el SO. La Tendencia para SO basados en UNIX es de implementarse como conjunot de procesos servidores, conunpequeño kernel replicado (eg: MACH, Chorus) que se comunican mediante pasaje de mensajes. Esto dá máxima flexibilidad resp. a ambientes paralelos/distribuidos =⇒requerimientos especiales de comunicación de procesos. • Requerimientos especiales respecto a comunicación entre máquinas: al invocar RPCs, sorprendentemente el t. de com. es apenas el 17% del tiempo del RPC en SRC. • RISC no ayudan a rebajar overhead de traps y llamadas al sistema (piense en interrupts y pipelining). Por ejemplo, muchos lightweight RPC para lograr un system call, requiere entrar y salir del kernel 2 veces,lo cual es costoso en salvadas de contexto (eg: Motorola 88000 tiene 5 pipelines). • Por otro lado, el i860 y el MIPS R2000 por ejemplo tienen un sólo interrupt vector handler, lo cual agrega ciclos para determinar donde ir. • Copiar parámetros de un nivel a otro en un RPC o system call implica que además puede afectar negativamente wrtite-thru caches. • Manejo de fallas de memoria (page faults). – En el 88000, un page fault congela la ejecución de FP pipe, pero como este también realiza operaciones enteras, cuando es rehabilitado puede alterar registros, por lo cual necesita guardar previamente todos los registros. – El i860 debe,por razones similares, guardar el estado de los pipes; si el FP estaba usandose, se agregan 60 instrucciones más por page fault handling. – Otros procesadores, como SPARC, RS6000, tienen instrucciones precisas para evitar esto. • Otra falla es pérdida de interrupciones en algunos RISC. Por ej: el i860 no provee la dirección de la causa de falla, sólo la dirección dela instr. que la causa. Esto implica cerca de 26 instr. para manejar el trap. Comentario de AT: no sorprende que mucha gente (eg: Liverpool Par. Library Project] rechace las soluciones de SO para máquinas paralelas como demasiado pesadas re efectos en desempeño. Comentario de Stone: • muy poco se sabe hoy sobre lospatrones comunes de acceso a datos compartidos en multiprocesadores, porlo tanto todo protocolo de coherencia es digno de consideración en el futuro inmediato. • Para multiprocesamiento masivo con 100 o 1000 procesadores, la coherencia del cache puede no ser factible as implementar si tiene que satisfacer las necsidades de sincro. y compartimiento normal. 13.7 Casos 13.7.1 DASH Proyecto realizado en Stanford para implementar distributed shared memory. Consiste en un conjunto de “clusters” interconectados por una red de interconexión. Cada cluster posee: • Un conjunto de procesadores (4 Silicon Graphics), con dos niveles de cache (primer nivel: 1 palabara cada dos ciclos, segundo nivel: 1 cada 30 ciclos sincronizado con el bus a 16 MHz) . Los caches de segundo nivel están conectados por un bus con un snoopy protocol. • Una memoria principal. La memoria global del sistema está dividida entre los clusters. • Un directorio, que maneja los accesos remotos, y dá servicio de los accesos a la memoria del cluster y los datos locally cached. Directorio. IMplementa un full-map (1 bit por cluster), pero disminuido ya que solo guarda un apuntador por cluster en lugar de por procesador. Cada bloque de memoria tiene un home cluster, quien se encarga del manejo del acceso a dicho bloque. Cada directorio posee entradas para los bloques que le pertenecen, lo cual evita que haya duplicacion. EL home cluster se determina por la direccion fı́sica del bloque. El directorio maneja tres estados para un bloque: • uncached: not cached by any cluster • shared: in an unmodified state in the caches of one or more clusters • dirty: modified in a single cache of some cluster Protocolo de acceso. Cuando hay un cache-miss del 1er nivel de cache, se busca en el segundo. Si no está en el segundo se emite una solicitud al bus local por si está en otro cache local. Si está, se realiza una transferencia rápida de cache a cache. Sino, el directorio captura el requerimiento y, sino está en su memoria local, envı́a la solicitud al home cluster del bloque. Cuando un home cluster recibe una sooicitud, chequea el estado del bloque. Sie está limpio lo toma de la memoria y lo envı́a. Si no está limpio pero está local, fuerza un update y envı́a después. Si está sucio remoto, envı́a una solicitud al cluster remoto; éste localiza el dato y envı́a el nuevo valor simultaneamente al solicitante y al home cluster. Prototipo. La red de interconexión está compuesta por dos wormhole-routed grid de 4x4 clusters (máximo, 64 procesadores). Uno de los grids es para las solicitudes y el otro para la respuesta. Los grids son de 16 bits wide. 13.7.2 Alewife Un mesh con un SPARC LE (sparc modificado) por nodo, con LIMITLESS directory. Se basa en multithreading para esconder la latencia. El cambio de contexto se hace en 14 ticks. Cada nodo posee 64KBytes de direct-mapped cahche y 4 MBYTEs compartida. Los nodos (hasta 64) están interconectados por un wormhole routed mesh de dos dimensiones. 13.7.3 KSR-1 Basado en la idea de que todo es cache (ALLCACHE(TM)) o “cache-only memory” (COMA). Consiste en una red jeráquica de dos niveles. En el nivel bajo hay anillos de 32 procesadores unidos enun slotted ring a 1Gbyte/s. Estos anillos se llaman SE:0. Otro anillo SE:1 conecta hasta 34 anillos SE:0, lo caul dá un máximo de 1088 procesadores. Cada procesador tiene un sub-cache de 0.5MBytes y un cache local de 32 Mbytes. No hay un “nodo ppropietario o home” para un dato. El propietario de un bloque cambia constantemente. Provee consistencia secuecnial 14 Subsistema de Entrada/Salida: [1 clase]: Fotocopiar H y P: 513, 517, 532, (event. 539-546) EL subsistema de E/S ha sido a menudo despreciado por los constructores de super-computadores, lo cual ha llevado a una situación donde la tecnologı́a para CPU y memoria crece rapidamente y la de E/S se rezaga. Esto provoca una tendencia a convertir la E/S en el cuello de botella del sistema. La excepción es IBM. Terminologı́a: el subsistema de E/S posee una organización jerárqica. Los siguientes elementos son a menudo referenciados: Procesador de E/S: En sistemas de alto desempeño, el sistema es enriquecido con un co-procesador que se encarga de la E/S, para ası́ permitir al CPU la mayor libertad para ocuparse de los cálculos. Cuando el CPU encuentre una instrucción de E/S, esta es pasada al procesador de E/S. Controlador: son dispositivos asociados a un periférico especı́fico de E/S (cinta, terminal gráfico, disco, etc.), que interpretan las órdenes de E/S y la traducen en comandos de bajo nivel para controlar el periférico. Canal: este término, acuñado por IBM, designa las vı́as de comunicación entre el sistema compuesto por el CPU-Procesador de E/S y los controladores de E/S. A veces, el procesador de E/S es inexistente y sólo existen interfaces simples entre el bus del CPU y los canales. Algunas de estas interfaces generalizadas son: para sistemas baratos, el SCSI; y para sistemas de alto desempeño, el HIPPI (High-Performance Parallel Interface). Para acelerar accesos a discos, se usan disk o file caches. Estos pueden ser parte de la mem. ppal o funcionar como buffer aparte. 14.1 Esquema tı́pico de dispositivos de E/S La latencia y el thruput de un sistema de E/S puede verse limitado por cualquier parte del camino entre el dispositivo y mem. principal, i.e.: • El dispositivo mismo • El controlador de E/S • El bus de mem. y E/S • La mem. ppal • El CPU o procesador de E/S (velocidad de atender interrupción) • Velocidad del software/firmware menjador de E/S • Eficiencia del uso en el manejo del dispositivo. ¿Cómo medimos desempeño del subsistema de E/S? 14.1.1 Caracterización de la carga de E/S Supercomputadores: Dominado por accesos en disco a grandes archivos. Generalmente una gran lectura inicial. Luego muchas escrituras periódicas (para checkpoints) =⇒dominado por escrituras. CPU CACHE Bus de Mem. y E/S Mem. Ppal Control. E/S Control. E/S Disco Disco Gráficos Control. E/S Red Figure 2: Esquema tı́pico de dispositivos de E/S Procesamiento de transacciones (e.g. banca): Involucra muchos cambios a informaciones compartidas desde muchos terminales, más alta confiabilidad. Los requerimientos son en varios órdenes: • Alta rata de transacciones y tiempo de respuesta corto (95% < 1 s.) • alta disponibilidad13 más extensibilidad modular más simple de usar y administr • extensibilidad modular • simple de usar y administrar TP-1 es un benchmark que simula ATM (cajeros automáticos) y mide respecto al número de transacciones de déb/cred. por seg. Cada acceso a disco es corto =⇒benchmark accesa de a 100 bytes por seg. Cada transacción requiere entre 2 y 10 accesos a disco y entre 5000 y 20000 instrucciones de CPU. En general, los accesos son al azar (no hay patrones o stride),pero hay grandes porciones de la BD que no se referencian (la mayorı́a de los accesos, alrededor del 80%, es al 20% de la data). Estaciones de trabajo UNIX: muchos archivos, abiertos por cortos perı́odos, la mayorı́a se borra o cambia en tiempo corto (ver H y P). Una estación de trabajo para ingenierı́a de 1 MIPS reuqiere 2.5 a 10 KByte/s. Para mediados de 90 se estiman estaciones de 100 MIPS con req. 100 veces mayor. Resultados de Ousterhout: • 80% de accesos a discos eran a archivos pequeños (¡ 10KB) • 90% de todos los acesos eran secuenciales • 67% de lecturas, 27% escrituras, 6% R/W. 13 Tiempo promedio entre fallas (MTBF) de componentes simples de 10000 h =⇒99% disponibilidad Aplicaciones de tiempo real: entre estas citemos las siguientes. • Procesamiento de imágenes por satélite: los datos llegan a ratas de 7-10 MB/s • Video y HDTV: imagen enpantalla de 1000x1000 pixels, 3 bytes/pixel, 30 veces por segundo =⇒90 MB/s sostenido. Con menos resolución o con compresión puede bajar a alrededor de 20 MB/s. • Broadband ISDN: rata de datos de un usuario final es de 75 MB/s en recepción y de 18.75 MB/s envı́os. En todas estas aplicaciones es claro que la capacidad de un sólo disco es sobrepasada, lo cual lleva a utilizar arreglos de discos. Resultados de un cuestionario de uso de sistemas con Transputers [Eck90] (PUMA, Siemens). • Tipos de aplicaciones: – Computational fluid dynamics – QCD – Ecuaciones de Einstein – Proc. de imágenes • E/S manejada por host • Checkpointing como carga supercomp. Data swapping por proces. de imágenes • Accesos secuenciales • Patrón de E/S vs. computación: fases de E/S-Computación-E/S-Comp-... . Solapamiento posible • Multitasking (en un nodo) sólo en una aplicación (consecuencia de madurez de plataforma ?) • Espacio de disco usdo: 76KB a 10 GB • Entre 1 y 5 archivospor aplicación, excepto QCD (50) • Transferencias de 10-100 bloques, de 104 a 105 bytes. 14.2 Benchmarks en el mundo de E/S Pueden dividirse en dos clases [CP93]): aplicaciones y sintéticos. 14.2.1 Aplicaciones 1. Andrew: diseñado en Carnegie-Mellon para comparar el File system de Andrew con otros file system. Se convirtió en un estándard de facto. Modela la carga generada por un conjunto tı́pico de desarrolladores de SW: copia un sub-directorio, examina y lee la nueva copia, y luego compila la copia. El sub-directorio contiene 70 archivos con 0.2MB. 2. TPC-B: (Realizado por el Transaction Processing PErformance Council ). La primera versión se llamó TP-1 (1985) y se convirtió en el estándard de facto para transacciones. TPC-A y TPC-B reemplazan a TP-1. Simula operaciones de Débito/Crédito. La métrica utilizada es thruput máximo en transacciones por segundo, calificado por un umbral de tiempo de respuesta que exige que el 90% de todas las transacciones se complete en 2 segundos. También reporta precio y almacenamiento requerido. 3. Sdet: System Performance Evaluation Cooperative (SPEC) publicó un conjunto de benchmarks System development Multi-tasking (SDM) suite, que mide el desempeño global de un sistema para desarrollo de software y ambiuente de investigación. COnsiste en dos benchmarks: Sdet y Kenbus. Son muy similares, salvo en la mezcla. Sdet hace más I/O. Consiste en un conjunto de scripts concurrentes con comandos de edición, formateo de texto, compilación, creación y borrado de archivos, ası́ como otras utilitarias de UNIX. Va aumentando el número de scripts concurrentes hasta alcanzar el máximo thruput del sistema en scripts completados por hora. Sdet reporta este máximo, junot con el gráfico thruput vs. concurrencia de scripts. 14.2.2 Sintéticos 1. Bonnie: mide desempeño de I/O sobre un archivo para un conjunto de cargas simples. Uno lee ela archivo caracter por caracter; otro lo escribe caracter po caracter. Otra carga hace accesos secuenciales por bloques; por último, usa tres procesos haciendo accesos aleatorios. Debe cuidar que el archivo sea mayor que el cache. Reporta thruput en Kiliobytes por segundos o I/O por segundo, y uso de CPU. 2. I/OStone: se basa en trazas de minis y workstation Unix e IBM mainframes. Usa 400 archivos con un total de 1MB, leyendo y escribiendo datos en patrones de acceso (realizado por un solo proceso) que aproximan a los de la traza. Reporta IOStones por segundo. 14.3 Discos (Ver H y P o cualqier libro de mem. secundaria para detalles) • Ratas de transferencia tı́picas en 1990: 1 a 3 MB/s • La transferencia es a menudo solo una pequeña parte del tiempo de acceso, por lo que se desconecta del bus mientras hace seeking, dando oportunidad a multiplexar varios discos sobre el bus. • Los discos grandes (mayor diámetro, más capacidda por menso electrónica) y lospequeños (mayor volumen de ventas) poseen un costo relativo similar, de 3 a 5 $ por MB. 14.4 Arreglo o baterı́a de discos (Tomado de [KGP89]) Es el equivalente en E/S a la memoria intercalada. El problema es que con N dispositivos mecánicos, la confiabilidad (reliability) se reduce en N =⇒RAID (Redundant Array of Inexpensive Disks). 14.4.1 Niveles de RAID Nivel 1: Discos especulares Se utiliza sobre todo por tolerancia a fallas. Se replica el disco en arreglos =⇒reduce en 50% la capacidad de almacenamiento. Permite lecturas más rápidas (min(Latencia(D1),Latencia(D2))) o realiza lecturas simultáneas de datos diferentes si el hardware posee suficiente concurrencia, pero las escrituras son más lentas, ya que es el max(Latencia(D1),Latencia(D2). Nivel 2: Bit interleaved array con ECC. Permite detectar y corregir errores (tipicamente corrección de 1 error y detección de dos). Cada bit de una palabra más cada bit de ECC va a un disco propio (de 10 a 40% más discos para Hamming). Es muy caro y generalmente no se requiere Hamming completo, pues el disco tiene detector independiente de falla. Para la lectura, hay que esperar latencia rotacional de todos los discos, lo cual puede duplicar el tiempo de acceso esperado. Nivel 3: Detección de falla por hardware más bit de paridad. Sólo usa bit de paridad y confı́a en el hecho que el disco detecta si está en problemas. La ventaja es que reduce el overhead, y puede reconstruirse falla de un error más rapidamente. Nivel 4: Intercalar bloques en lugar de bits con disco de validación. Los esquemas anteriores no permiten el acceso concurrente en cada grupo de dsicos. Los accesos son secuenciales. Solo aumenta la rata de transmisión al costo de mayor latencia por el problema de la sincronzación, lo cuál (salvo el 1) los inhabilita para transacciones. En el nivel 4, un archivo de un solo bloque podrá accesarse directamente, permitiendonse incluso acceso concurrente a varios discos, eventualmente sobre archivos diferentes. Al accesar un archivo en lectura, se lee del disco donde se encuentra el bloque, o concurrentemente si posee más de 1 bloque, y se lee el disco de paridad. Para escribir, se necesita leer el bloque de data más el bloque de paridad para luego reescribir ambos. No es necesario accesar a los bloques de otros discos puesto que la paridad puede geenrarse a partir de los bloques de datos viejo y nuevo y el bloque de paridad. newparity = (old data xor new data) xor old parity Este esquema presenta el inconveniente que las escrituras no pueden ser concurrentes ya que el bloque de paridad debe accesarse en exclusión mutua. Nivel 5: Paridad decalada para paralelizar escrituras. En este caso el bloque de paridad de dos bloques consecutivos se encuentra en discos diferentes. De esta manera se permite el acceso concurrente en escritura. Permite más r/w en paralelo. Existen productos “RAID-like” en el mercado: Imprimis (4 drives de 51/4 más parity drive), Ciprico Rimfire 6600 (4+1),etc. 14.4.2 Comparación de niveles de RAID Los únicos niveles que proveen a la vez buen desempeño en accesos pequeños y grandes son los niveles 1 y 5. Respecto a la lectura, ambos proveen casi un 100 % de efciencia. Los discos especulares aceptan lectura concurrente sobre cada disco, por lo tanto no hay penalización. Los de nivel 5, aceptan G+1 lecturas concurrentes con G+1 accesos. En escritura, el nivel 1 provee la mitad de la eficiencia, ya que hay que escribir en ambos discos. El nivel 5, en escritura de archivos grandes (muchos bloques) escribirá G sectores en G + 1 accesos (es decir, puede calcular la paridad completamente porque posee todos los bloques. No necesita leer primero y luego escribir). Si solo escribe un bloque, la eficiencia es de 25%, ya que cada escritura implica cuatro accesos (leer bloques viejos de datos y paridad y escribir los nuevos). 14.5 Caso MIMD: iPSC/2 Procesador dedicado de E/S (hasta 127, conectables a c/nodo procesador). Este puede conectarse a una interfaz SCSI, o u adaptador VME o MUltibus. Un nodo no conectado directamente a procesador de E/S debe enviar su pedido por la red. Los archivos se guardan en forma distribuida. cada bloque de 4KB va a un i/o distinto. Cada nodo i/o contiene un cache de 2 MB o más. El encabezado de un archivo es guardado en un nodo de E/S para garantizar consistencia de acceso, pero podrı́a volverse cuello de botella. Existen técnicas que aprovechen topologı́a hipercubo para distribuir los nodos i/o de manera que cada nodo tenga cerca un nodo i/o. 14.6 14.6.1 Otros casos CM-2 Ver info sobre Data Vault en calse SIMD. 14.6.2 CRAY Y-MP C90 El subsistema de E/S del CRAY Y-MP C90 es denominado IOS-E. Puede poseer hasta 8 clusters e interfaces para dos estaciones de trabajo. Un I/O cluster consta de: • 4 procesadores de I/O auxiliares EIOP. Un EIOP controla hasta 24 adaptadores de canal para transferencia de datos desde y hacia los periféricos, y hacia o desde el SSD y el mainframe via los buffers de canal (4 para cada IOP). La transferencia se hace a través de canales de 200 MB/s. • Un procesador-multiplexor (IOP MUX), que coordina la comunicación con los IOP. • 16 buffers de I/O • 1 LOSP (para control, 20 MB/s) • 2 HISP • 16 adaptadores de canal. El SSD posee desde 128 MWords hasta 2 GWords. El acceso desde el CPU se hace por canales de alta velocidad de 1800 MB/s (tı́picamente un canal cada dos CPU). Utiliza discos en arreglos de 9: 8 para 1 byte de data + uno de paridad. 14.7 Misceláneas Si varios procesadores quieren accesar secuencialmente un archivo, el manejo de apuntadores puede ser complicado. Para más referencias ver: • [RB90] presenta el caso de acceso en paralelo a archivos desde un hipercubo. Muestra un algoritmo para distribuir “nodos” de I/O en el hipercubo para minimizar número de hops. • [Cro89] considera el rol de los archivos en sistemas paralelos. Introduce el concepto de archivos paralelos. 15 Máquinas SIMD Definición: Máquina de múltiples elementos procesadores, pero con una única Unidad de Control para el conjunto. La UC decodifica y difunde la instrucción a los elementos procesadores. Existe la posibilidad de inhibir ciertos procesadores para evitar que ejecuten una instrucción dada (masking). Cada procesador puede tener memoria local o no. Se encuentran las mismas organizaciones PE-Mem que en MIMD. Hay ejemplos de SIMD cuyos PE (elementos procesadores) operan sobre palabras de varios bits: ILLIAC IV )(64), BSP (16), GF-11 (576); o sobre 1-bit CM (64K), DAP (hasta 4K), MPP (16K). Hay un compromiso entre el poder de los procesadores y el # de procesadores. Motivación: existen varias razones que motivaron la aparición de este tipo de arquitecturas. 1. Existen aplicaciones, como: procesamiento de imágenes, FFT, parallel sorting, multiplicación de matrices, etc, que se programan de manera conveniente bajo el paradigma SIMD, y por ende pueden ejecutarse eficientemente en máquinas de ese tipo. 2. Razones económicas: hacer N procesadores con una UC es más barato que N computadores similares. 3. La ejecución sı́ncrona permite hacer comunicaciones eficientes, ya que todos accesan al mismo tiempo y no hay necesidad de sincronizar. Además, elimina carrera crı́tica y deadlock, lo cual facilita el debugging. 4. Eficiencia en el uso de memoria de instrucciones. Los SIMD nacieron para resolver problemas especı́ficos. La idea data del 58, para procesar señales de radar. Hay dos tipos dentro de SIMD: • Arreglos de procesadores (array computer): utilizados en aplicaciones numéricas, de búsqueda y reconocimento de patrones, etc. • Procesadores asociativos: empleados en manejo de base de datos, por ejemplo. Aunque no existen aún máquinas comerciales de este tipo, a nivel de prototipos de investigación está en boga. 15.1 Arreglos de Procesadores Parámetros: podemos señalar los siguientes parámetros de interés. • El # de procesadores • El # de bancos de memoria • La red de comunicación • Control local • Control global La red de comunicación es del tipo de las estudiadas en MIMD. Puede ser fija (ejemplo: ILLIAC IV y CM-1 en malla, o CM-1, en hipercubo). Los problemas de acceso a la memoria son similares a los de los computadores vectoriales. El control puede ser: autónomo, donde cada PE decodifica la isntrucción, e incluso puede poseer control a nivel de las microinstrucciones; o no-autónomo, donde los POE estáncompletamente regulados por la unidad central. 15.2 Experiencias en SIMD Desde el 64 empezaron los primeros prototipos, hasta que en el 72 empezó ILLIAC IV, proyecto de 256 PE que llego solo hasta 64. ILLIAC estaba pensado para operar sobre matrices y resolver ecuaciones diferenciales. En 1979 empezó el proyecto de BSP, de Burroughs (participante en ILLIAC), que aspiraba a 512 pero llegó a 16. En 1983, el Goddard Aerospace Center comenzó el MPP, una malla de 128x128, para procesamiento de imágenes. Pero todas esas iniciativas fueron más bien negativas respecto a las expectativas. MPP sigue vivo, pero ha consumido un presupuesto exagerado. En 1985, Danny Hillis montó una compañı́a (Thinking Machines) y sacó su CM-1, primera máquina SIMD comercial exitosa. Esto relanzó las expectativas sobre SIMD. En 1989 lanzó el CM-2. La nueva versión, el CM-5, se aleja de los SIMD. El éxito de las CM llevó a otra compañı́a, MAssPar, a sacar su máquina en 1990. Es una malla de dos dimensiones de 16K procesadores, donde cada PE se conecta a sus 8 vecinos. El GF-11 fué creado en IBM, para hacer cálculos en investigación en fı́sica molecular. Reducirı́a un cálculo que tardarı́a 150 años a 20 Mflops, a 4 meses a 11 GFlops. 15.3 Caso: el CM-2 El CM-2 es un CM-1 con las siguientes mejoras: • Mejor tecnologı́a. Posee más memoria por PE. • Acelerador de punto flotante • Red NEXUS de acceso desde front-end. Permite conectar hasta 4 front-end. Un CM-2 puede dividirse en 4, 2 o 1 secciones. Arquitectura del sistema: • 1 o varios front-end, para desarrollo y debugging, procesamiento serial y generación de macro-instrucciones. • 1 decodificador: secuenciador que traduce las micro-instrucciones a nano-instrucciones que ejecutan los PE, una por ciclo. • Data Vault (bóveda de datos): 10 Gbytes (hasta 20), 25 Mbytes/s sostenido cada uno. Pueden haber varios por sistema. • n (16, 32 , 64) procesadores de 1 bit, con su memoria, interconectados en grupos de 16 en un hipercubo de dimensión 12. Además están conecctados en malla. Lenguajes: *Lisp, Fortran, sobre PARIS. El paradigma de programación es llamado “Data Parallel Algorithms”. Ver libro de Hillis o Daniel Hillis and Guy Steele, “Data Parallel Algorithms”, Communications of the ACM, Dec 86. 15.3.1 Procesador • ALU y latchs • 64K o 256 K bits de memoria local • Cuatro flag registers de 1 bit • Aceleradores de punto flotante opcionales • Interfaz al enrutador • Interfaz a la malla NEWS • Interfaz directa al hipercubo • Interfaz de I/O. Un chip de 1 cm2 CMOS de 68 pines, contiene 16 PE. La memoria está compuesta por chips comerciales. Un acelerador de f.p. es compartido por 32 PE (2 chips). ALU: Posee tres entradas y 2 salidas (bit-serial ALU). En un ciclo lee dos bits de la memoria y 1 del flag. Produce dos salidas: una para la memoria y otra para otro flag. Una tercera bandera activa o no el store. Las operaciones son dadas pro dos tablas (cargadas con una nano-instrucción) de 8 bits cada una: una para la salida hacia la memoria y la otra para la condición. Ejemplo: suma de dos k-bit signed integers. 1. Carga el context flag 2. Otro flag se selecciona como carry (vı́a NEWS) 3. K iteraciones: lee un bit de cada operando y el carry, ejecuta la suma y el carry-out es enviado en el carry flag. 15.3.2 Comunicaciones • Entre vecinos, vı́a un NEWS. Este es un conmuitador que permite coenctar las salidas de los flags al norte, este, oeste y sur. • Entre cualquiera vı́a un enrutador (router) • Directamente sobre el hipercubo (bypasseando el router) • Usa daisy chain para arbitrar sobre el uso del router. Router: El enrutador permite a los 16 PÉs de un nodo conectarse a cualquier otro en cualquier nodo. Un mensaje está compuesto por una trama de aprox. 64 bits (a confirmar!): • Data (tı́picamente 32 bits) • Información de dirección para alcanzar el destino (12 bits para el nodo, + 4 para el PE en la malla). En cada nodo, “O exclusivo” de la dirección de origen y la dirección de destino (dirección relativa = 12 bits). Cada vez que se envı́a en una dimensión, el “1” se pone en “0”. • Dirección de retorno (16 bits) La metodologı́a de enrutamiento es store and forward. En un enrutador, el mensaje recibido debe ser guardado en memoria y luego enviado. Se hace bit por bit (750 ns por bit). Cada ciclo se envı́a en una dirección del hipercubo. Esto se hace en secuencia de 12 (1 por dimensión). Cada ciclo de 12 ciclos de dimensión se llama “petit cycle”, con una duracio’n de ≈ 800 ciclos (12x64 bits) de 750 ns ⇒600 µs. Sin tráfico un mensaje tarda max. 1 petit cycle en llegar a su destino. Cuando hay tra’fico, unmensjae que nopuede avanzar en una dirección porque hay otro de mayor prioridad, debe esperar un petit cycle. Si no hay espacio de buffers en el enrutador, un mensaje que llega puede ser enviado sobre uno de los enrutadores libres, aunque lo aleje. SI dos mensajes quieren salir por la misma dirección, pero uno de ellos puede ser enviado en otra dirección, este será enviado en esa dirección. 15.3.3 I/O Cada grupo de 8K PE comparte 2 procesadores (canales) de I/O. Cada canal provee 50 Mbytes/s. Un controlador de I/O trata 8K coo dos bancos de 4K. cada chip de PE tiene una lı́nea de I/O =⇒un banco puede enviar 256 bits en paralelo. Se pueden conectar controladores o frame buffer a los canales de I/O. Data Vault: es un dispositivo de almacenamiento masivo de datos del CM. Provee un canal de 25 Mbytes/s sostenido y una capacidad de hasta 20 GBytes. • Arreglo de 39 discos • 64 bits del bus de I/O se dividen en dos de 32 bits. Verifica paridad, agrega 7 bits de ECC y almacena cada bit en un arreglo diferente. • Un minicomputador controla y corre un proceso de servidor de archivos. • El front-end se comunica con el Data Vault vı́a Ethernet. Este chequea y envı́a ack al f-e. Los datos de la memoria del CM son pasados a los I/O controller, con paridad por byte y colocda en la memoria de los I/O controller. References [ACM92] Special number on supercomputing. Communications of the ACM, August 1992. [AG89] George Almasi and Allan Gottlieb. Highly Parallel Computing. The Benjammin/Cummings, 1989. [Bel89] Gordon Bell. The future of high performance in science and engineering. Communications of the ACM, August 1989. [Bel92] Gordon Bell. Ultracomputers: a teraflop before its time. Communications of the ACM, August 1992. [CP93] Peter Chen and David Patterson. Storage performance — metrics and benchmarks. Proceedings of the IEEE, 81(8), August 1993. [Cra91] Cray Research, Inc., Mn. CRAY Y-MP E Series Functional Description Manual, 1991. Number: HR-04016-0A. [Cra92] Cray Research, Inc., Mn. CRAY Y-MP C90 Functional Description Manual, 1992. Number: HR-04028. [Cro89] Thomas Crokett. File concepts for parallel I/O. In Proceedings of Supercomputing ’89, pages 574–579, 1989. [DD89] Jack Dongarra and Ian Duff. Advanced architectures comoputers. Technical Memorandum 57 (Revision 2), Argonne National Laboratory, Il., September 1989. [DT90] Michel Dubois and Shreekant Takkar. (special issue on cache architectures in tightly coupled multiprocessors). IEEE Computer, June 1990. [Eck90] Eckardt. Investigation of distributed disk i/o concepts. PUMA Report, August 1990. [HB84] Kai Hwang and Fayé Briggs. Computer Architectures and Parallel Processing. McGraw-Hill, 1984. [Hwa93] Kai Hwang. Advanced Computer Architectures: McGraw-Hill, 1993. Parallelism, Scalability, Programmability. [KGP89] Randy Katz, Garth Gibson, and David Patterson. Disk system architectures for high performance computing. Proceedings of the IEEE, 77(12), December 1989. [LLG+ 92] Daniel Lenoski, James Laudon, Kourosh Gharachorloo, Wolf-Dietrich Weber, Anoop Gupta, John Hennessy, Mark Horowitz, and Monica Lam. The stanford dash multiprocessor. IEEE Computer, March 1992. [Nik93] Rishiyur Nikhil. Multithreaded architectures. Supercomputing ’93 Tutorial, 1993. [NL91] Bill Nitzberg and Virginia Lo. Distibuted shared memory: A survey of issues and algorithms. IEEE Computer, August 1991. [PH90] David Patterson and John Hennessy. Computer Architecture: A Quantitative Approach. Morgan/Kaufmann, 1990. [RB90] Reddy and Banerjee. Design, analysis and simulation of i/o architectures for hypercube multiprocessors. IEEE Transactions on Parallel and Distributed System, Abril 1990. [SC91] Harold Stone and John Cocke. Computer architectures in the 1990s. IEEE Computer, September 1991. [Sto90] Harold S. Stone. High-Performance Computer Architecture. Addison-Wesley, second edition, 1990. [Wei90] Weicker. An overview of common benchmarks. Computer, December 1990.