Introducción a la Computación Paralela J. Aguilar, E. Leiss Introducción a la Computación Paralela J. Aguilar, E. Leiss Introducción a la Computación Paralela © 2004 – J. Aguilar, E. Leiss Autores: Jose Lisandro Aguilar Castro CEMISID, Departamento de Computación Universidad de Los Andes Mérida, Venezuela Ernst Leiss Department of Computer Science University of Houston, Texas, USA 1ra Edición, 2004 “RESERVADOS TODOS LOS DERECHOS” Depósito Legal: LF395920040041698 ISBN: 980-12-0752-3 Esta publicación ha sido realizada gracias al apoyo financiero del Consejo de Desarrollo Científico, Humanístico y Tecnológico de la Universidad de Los Andes Diagramación Electrónica: Miguel Rodríguez Diseño de Portada: Rossana Ríos Impreso en: Graficas Quinteto Mérida, Venezuela 2 Introducción a la Computación Paralela J. Aguilar, E. Leiss Este es uno de los primeros libros en español que hace una descripción amplia del área Computación Paralela. El libro comienza presentando los modelos de paralelismo, así como uno de los problemas fundamentales del área, la comunicación. Después caracteriza las posibles fuentes de paralelismo, así como algunas metodologías para desarrollar aplicaciones paralelas. El libro presenta aspectos fundamentales de las plataformas paralelas, tales como la asignación y planificación de tareas, la dependencia de datos y posibles transformaciones de código, las medidas de rendimiento usadas, entre otros, todos ellos a ser considerados por sus Sistemas Operativos y/o Compiladores. Es un libro que puede ser usado por estudiantes culminando carreras en el ámbito de las Ciencias Computacionales o que están iniciando estudios de Maestría en esa área. Los autores, Septiembre 2004 3 Introducción a la Computación Paralela J. Aguilar, E. Leiss Indice Capítulo 1. Elementos Introductorios 1.1. Motivación 10 1.2. Historia 15 1.3. Clasificaciones 17 1.3.1. Clasificación de Flynn 18 1.3.2. Modelo basado en la organización de la Memoria 21 1.3.3. Modelo basado en la Coordinación 25 1.4. Comunicación 30 1.4.1. Pase de Mensajes 30 1.4.2. Exclusión Mutua 34 1.4.3. Redes de Interconexión 34 1.4.3.1. Redes de Interconexión para Maquinas a Memoria Compartida 35 1.4.3.2. Redes de Interconexión para Maquinas a Memoria Distribuida 40 1.4.3.3. Otros Aspectos Comunicacionales 44 1.5. Tendencias 46 1.5.1. En Arquitecturas 46 1.5.2. En Aplicaciones 47 1.5.3. En Redes de Interconexión 48 Capítulo 2. Caracterización del Paralelismo 2.1. Generalidades 51 2.2. Perfil de Paralelismo 52 2.2.1. Granularidad 52 2.2.2. Grado de Paralelismo 54 2.3. Fuentes de Paralelismo 54 2.3.1. Paralelismo de Control 56 2.3.2. Paralelismo de Datos 58 2.3.3. Paralelismo del Flujo de Ejecución 63 2.4. Comparación entre los Enfoques 64 2.5. Aspecto de Diseño de los Programas Paralelos 66 2.5.1. Paralelizando un Programa Secuencial 67 2.5.1.1. Paralelización Automática 67 2.5.1.2. Librerías Paralelas 68 2.5.1.3. Recodificación de Partes 68 2.5.2. Desarrollando un Programa Paralelo Nuevo 69 2.5.3. Paradigmas de Programación Paralela 69 2.6. Metodología de Programación 71 2.6.1. Generalidades 71 2.6.2. Metodología 75 2.6.2.1. Mecanismo Espiral 76 2.6.2.2. Descomposición 76 2.6.2.3. Comunicación 81 2.6.2.4. Agrupamiento 81 2.6.2.5. Asignación 84 4 Introducción a la Computación Paralela J. Aguilar, E. Leiss Capítulo 3. Ciertos Problemas en Computación Paralela/Distribuida 3.1. Problema de Planificación en los Sistemas Distribuidos/Paralelos 85 3.1.1. Planificación de Tareas de Programas Paralelos/Distribuidos 87 3.1.2. Planificación de las Operaciones de Entrada/Salida 90 3.1.3. Planificación de Lazos de Ejecución 94 3.1.3.1. Planificación de Lazos Paralelos 95 3.1.3.2. Lazos con Dependencia de Datos entre Iteraciones 97 3.1.3.2.1. Descomposición de Lazos 99 3.1.4. Planificación de Estructuras Condicionales 101 3.2. Problema de Asignación de Tareas en los Sistemas Distribuidos/Paralelos 102 3.2.1. Definición de una Función de Costo General 106 3.2.2. Diferentes Restricciones en los Sistemas Distribuidos/Paralelos 108 3.2.3. Ejemplos de Uso de la Función de Costo sobre Diferentes Arquitecturas Distribuidas/Paralelas 109 3.3. Asignación de Datos 109 3.3.1. Problema de Asignación de Archivos 109 3.3.2. Problema de Replicación de Archivos 110 3.4. Distribución de Carga de Trabajo 110 3.4.1. Equilibrio de la Carga de Trabajo 116 3.5. Partición de Datos/Programas 117 3.5.1. Descomposición de Programas 117 3.5.2. Problema de Descomposición de Archivos 118 3.6. Mecanismo de Migración 118 3.7. Manejo de la Memoria 119 3.7.1. Bancos de Memoria 121 3.7.2. Memorias Cache 124 3.7.2.1. Coherencia de Memorias en Sistemas Multiprocesadores 127 3.7.2.2. Políticas de Reemplazo 129 3.8. Tolerancia a Fallas 131 Capítulo 4. Análisis de Dependencia y Técnicas de Transformación 4.1. Generalidades 134 4.2. Dependencia de Datos 136 4.2.1. Análisis Escalar 141 4.2.2. Dependencia en los Lazos 142 4.2.3. Test de Dependencias de Datos 153 4.2.3.1. Análisis Diofantino 154 4.2.3.2. Test Inexacto 156 4.2.3.3. Test de Dependencia usando el Vector de Dirección 158 4.2.3.4. Teoremas de Verificación de Dependencias 159 4.3. Técnicas de Transformación 161 4.3.1. Transformación DOALL 164 4.3.2. Distribución de Lazos 165 4.3.3. Intercambio de Lazos 167 4.3.4. Eliminación de Dependencias de Salidas y Antidependencias 173 4.3.5. Fusión de Lazos 176 4.3.6. Torsión de Lazos 178 4.3.7. Otras Técnicas de Transformación 181 4.3.7.1. Alineación y Replicación 181 4.3.7.2. Destapar Minas y Unir lazos 182 4.3.7.3. Partición de Nodos 185 4.3.7.4. Encoger Lazos 186 4.3.7.5. Desenrollar Lazos 187 4.4 Remarcas Finales 188 5 Introducción a la Computación Paralela J. Aguilar, E. Leiss Capítulo 5. Medidas de Rendimiento 5.1. Introducción 192 5.2. Aceleración y Eficiencia 193 5.3. Escalabilidad 204 5.4. Complejidad Algoritmica Paralela 206 5.5. Puntos de Referencia o Programas de Comparación del Rendimiento (Benchmarks) 216 5.6. Otros Aspectos de Rendimiento 219 Capítulo 6. Ejemplos de Programas Paralelos 6.1. Producto de Dos Vectores 224 6.2. Paralelización de un Lazo Livermore 225 6.3. Paralelización de la Multiplicación de Matrices 227 6.4. Paralelización del Algoritmo de los Números Primos 229 6.5. Dependencia del Vecino más Cercano 230 6.6. Búsqueda 233 6.7. Algoritmo de Búsqueda del Camino más Corto 233 6.8. Paralelización de LINPACK 235 6.9. Inversión de una Matriz 239 6.10 Operaciones de Reducción 240 Bibliografía 242 Glosario 245 6 Introducción a la Computación Paralela J. Aguilar, E. Leiss Indice de Figuras Capítulo 1. Elementos Introductorios 1.1. Eras de la Computación 1.2. Arquitectura tipo SISD (Máquina Von-Neumann). 1.3. Arquitectura tipo SIMD. 1.4. Arquitectura tipo MISD. 1.5. Arquitectura tipo SIMD-Memoria Distribuida. 1.6. Arquitectura tipo MIMD-Memoria Compartida. 1.7. Arquitectura tipo MIMD-Memoria Distribuida. 1.8. Una posible arquitectura tipo MIMD-Distribuida-Compartida. 1.9. Encauzamiento. 1.10. Comparación entre procesamiento serial, encauzado y paralelo. 1.11. Arreglo Sistólico en Multiplicación de Matrices. 1.12. Un Conmutador con dos posibles modos de funcionamiento 1.13. Bus. 1.14. Redes a 1 etapa (3x6) 1.15. Red Clos (2,2,2) 1.16. Red conectada en Cubo para 8 procesadores y Bancos de Memoria 1.17. Operación shuffle-exchange 1.18. Red Omega 1.19. Lineal. 1.20. Malla M(3, 7). 1.21. Toro T(3, 3). 1.22. Hipercubo de dimensión 3. 1.23. Redes De Bruijn 1.24. Red Arbol Binario 1.25. Hilos Capítulo 2. Caracterización del Paralelismo 2.1. Modo Concurrente 2.2. Modo Paralelo 2.3. Aumento de la granularidad en el problema de multiplicación de matrices 2.4. Dependencia de Tareas 2.5. Paralelismo de Datos 2.6. Esquemas de distribución de los datos sobre los procesadores 2.7. Comparación del paralelismo de control contra el paralelismo de flujo 2.8. Comparación de las diferentes fuentes de paralelismo 2.9. Paralelización Automática 2.10. Librerías Paralelas 2.11. Recodificación del Código Secuencial 2.12 Paradigma Arbol Binario. (x+z)3- (x+z)2 2.13. Flujo de Ejecución del programa que calcula f(x,y,z)= . yz (x+z)3- (x+z)2 2.14. Asignación para el programa que calcula f(x,y,z)= yz 2.15. Asignación Optima para el programa que calcula (x+z)3- (x+z)2 f(x,y,z)= en una Maquina MIMD tipo Malla. yz 2.16. Metodología de Desarrollo de Aplicaciones Paralelas. 7 Introducción a la Computación Paralela J. Aguilar, E. Leiss 2.17. Pasos claves del proceso de diseño. 2.18. Posibles particiones de una matriz. 2.19. Multiplicación de matrices según una partición por Columnas. 2.20. Descomposición Funcional para el Problema del Calculo del Integral 2.21. Estructura Programada de un compilador de un lenguaje de alto nivel 2.22. Calculo del Integral con Desequilibrio de la Carga de Trabajo. 2.23. Posibles particiones de un Arbol 2.24. Costos Comunicacionales 2.25. Cálculos Redundantes 2.26. Distribución del trabajo Capítulo 3. Ciertos Problemas en Computación Paralela/Distribuida 3.1. Sistema de Planificación 3.2. Elementos necesarios en la tarea de Planificación 3.3. Planificación de tareas considerando los tiempos de comunicación 3.4. Problema de Optimización de Ejecución de las Operaciones de E/S 3.5. Planificación de E/S. 3.6. Dos ejemplos de Asignación de Lazos Paralelos 3.7. Planificación sobre 3 procesadores basada en una descomposición de los lazos 3.8. Un esquema de Planificación de Lazos Paralelos basado en una cola central 3.9. Un grafo de lazos de tareas 3.10. Un Grafo de Tareas Replicadas para el Grafo de Lazos de Tareas de la figura 3.9 y u={1, 1}. 3.11. Posibles Planificaciones del Grafo de tareas replicados para u={1, 1} 3.12. Un ejemplo de Planificación de una Estructura Condicional 3.13. Asignación de Tareas 3.14. Asignación de un Arbol Binario sobre una Red tipo Malla 3.15. Problema de la Distribución de la carga de trabajo 3.16. Distribución de la carga usando la técnica de Difusión 3.17. Efecto por equilibrar la carga de trabajo 3.18. Organización de la Memoria 3.19. Bancos de Memoria 3.20. Eficiencia de los Bancos de Memoria 3.21. Asignación de datos continuos en los Bancos de Memoria según diferentes esquemas de direccionamiento. 3.22. Efecto de agregar una columna en una matriz 3.23. Definición del Banco de Inicio 3.24. Organización de una Memoria Cache en un entorno Distribuido 3.25. Protocolo de Respaldo Primario en la Operación Escribir Capítulo 4. Análisis de Dependencia y Técnicas de Transformación 4.1 Grafo de dependencia del ejemplo 4.6 4.2 Grafo de dependencia del ejemplo 4.2 4.3. Grafo de dependencia del ejemplo 4.8 4.4. Espacio de iteraciones del ejemplo 4.19. 4.5. Grafo de Dependencia en el Espacio de iteraciones del ejemplo 4.20. 4.6. Ejemplos de direcciones de dependencias. 4.7. Grafo de Dependencia para el ejemplo 4.21. 4.8. Grafo de Dependencia del ejemplo 4.23. 4.9. Dependencias especificas del ejemplo 4.23. 4.10. Grafo de dependencia para el ejemplo 4.24. 4.11. Grafo de dependencia del ejemplo 4.25 4.12. Jerarquía de Direcciones para dos lazos anidados. 8 Introducción a la Computación Paralela J. Aguilar, E. Leiss 4.13. Grafo de Dependencia del ejemplo 4.40. 4.14. Los cuatro tipos de dependencias para el ejemplo 4.42. 4.15. Ordenes de ejecución del ejemplo 4.46 antes y después del intercambio. 4.16. Grafo de dependencia del ejemplo 4.48. 4.17. Nuevo Grafo de dependencia del ejemplo 4.48. 4.18. Ordenes de ejecución del ejemplo 4.49. 4.19. Espacio de iteraciones del ejemplo 4.51. 4.20. Grafo de dependencia del ejemplo 4.55. 4.21. Grafo de dependencia del código modificado del ejemplo 4.55. 4.22. Grafo de dependencia del ejemplo 4.56. 4.23. Grafo de dependencia del código modificado del ejemplo 4.56. 4.24. Grafo del espacio de direcciones del ejemplo 4.61. 4.25. Nuevo grafo del espacio de direcciones del ejemplo 4.61. 4.26. Espacio de iteraciones del ejemplo 4.62. 4.27. Nuevo espacio de iteraciones del código transformado. 4.28. Espacio de iteraciones del ejemplo 4.68 antes (a) y después (b) de la unión. 4.29. Grafo de Dependencia del ejemplo 4.69. 4.30. Espacio de iteraciones del ejemplo 4.71 antes (a) y después (b) de la transformación. Capítulo 5. Medidas de Rendimiento 5.1. Rendimiento de Sistemas Paralelos (S vs P) 5.2. Cuando se puede escalar una arquitectura. 5.3. Limite de la aceleración paralela de la "ley de Amdahl" y su desarrollo en el tiempo 5.4. Saturación arquitectónica S vs. N 5.5. Curvas de la aceleración que miden la utilidad de la computación paralela. 5.6 El árbol del calculo del máximo del ejemplo 5.3. 5.7. Grafo de dependencia del ejemplo 5.5. 5.8. Solapar la comunicación con la computación Capítulo 6. Ejemplos de Programas Paralelos 6.1. Partición de los vectores a multiplicar 6.2. Paralelización de un lazo Livermore 6.3. Paralelización de la Multiplicación de Matrices 6.4. Otro esquema paralelo de Multiplicación de Matrices 6.5. Dependencia de Vecinos 6.6. Paralelizacion del calculo de la diferencia finita en una dimensión 6.7. Versión paralela del Algoritmo de Floyd basada en una descomposición en una dimensión 6.8. Versión paralela del Algoritmo de Floyd basada en una descomposición en dos dimensiones 6.9. Paralelización del algoritmo de LINPACK según un esquema round robin de asignación de trabajo, para 4 procesadores. 6.10. implementación paralela del método de Eliminación de Gauss 6.11. Esquema paralelo de Reducción 9 Introducción a la Computación Paralela J. Aguilar, E. Leiss Capítulo 1. Elementos Introductorios 1.1 Motivación El procesamiento paralelo es un tipo de procesamiento de la información, que permite que se ejecuten varios procesos concurrentemente [5, 10, 17, 30, 35]. El procesamiento paralelo puede ser de diferentes tipos: i) Un tipo es ejecutar procesos independientes simultáneamente, los cuales son controlados por el sistema operativo (usando tiempo compartido, multiprogramación y multiprocesamiento). ii) Otro tipo es descomponer los programas en tareas (controladas por el sistema operativo, los compiladores, los lenguajes de programación, etc.), algunas de las cuales pueden ser ejecutadas en paralelo. iii) Finalmente, el último tipo se basa en usar técnicas de encauzamiento para introducir paralelismo a nivel de instrucciones, lo que implica dividirlas en pasos sucesivos que pueden ser ejecutados en paralelo, cada uno procesando datos diferentes. Es difícil determinar qué resulta más natural, sí el procesamiento paralelo o el secuencial. Los enfoques paralelos resultan una necesidad, dada la constante afirmación de que la velocidad máxima en procesamiento secuencial se alcanzará prontamente, excepto que aparezcan avances en otras áreas que definan nuevos mecanismos de procesamiento, los cuales pueden venir de nuevos descubrimientos en áreas tales como computación AND, computación cuántica, etc. En los últimos años, el uso extensivo del paralelismo ha estado ligada a varios hechos [2, 10, 13, 20]: - La necesidad de mayor potencia de cálculo: independientemente de que la potencia de los procesadores aumente, siempre habrá un limite que dependerá de la tecnología del momento. Para aumentar la potencia de cálculo, además de los progresos tecnológicos que permitan aumentar la velocidad de cálculo, se requieren nuevos paradigmas basados en cálculo paralelo. Es decir, una manera de aumentar la velocidad de cálculo es usar múltiples procesadores juntos. Así, un problema es dividido en partes, cada una de las cuales es ejecutada en paralelo en diferentes procesadores. La programación para esta forma de cálculo es conocida como programación paralela, y las plataformas computacionales donde pueden ser ejecutadas estas aplicaciones son los sistemas paralelos y distribuidos. La idea que se usa es que al tener n computadores se debería tener n veces más poder de cálculo, lo que conllevaría a que el problema pudiera resolverse en 1/n veces del tiempo requerido por el secuencial. Por supuesto, esto bajo condiciones ideales que raramente se consiguen en la práctica. Sin embargo, mejoras sustanciales pueden ser alcanzadas dependiendo del problema y la cantidad de paralelismo presente en el mismo. 10
Description: