CI 4841 Introducción al Paralelismo Una porción considerable de las aplicaciones numéricas que son utilizadas en ciencia e ingeniería requieren de mucho poder de cómputo para poder ser ejecutadas en un tiempo razonable. En la actualidad, la mayoría de las computadoras ofrecen este poder de cómputo a través de la interacción de varios -desde decenas hasta miles- procesadores. Además, en los últimos años se ha producido una gran expansión en el uso de arquitecturas paralelas con memoria distribuida debido a la aparición de los clusters de procesadores personales. Este tipo de plataformas tienen una elevada relación de prestación/costo y para poder aprovecharlas es necesario utilizar aplicaciones paralelas. En esta asignatura se proporcionarán los principios básicos para la programación de este tipo de aplicaciones. El conocimiento de los fundamentos de la Programación Paralela dará al estudiante las herramientas y los métodos necesarios para identificar, analizar y abordar aquellos problemas cuya solución óptima es posible obtenerla explotando su paralelismo inherente de forma implícita o explícita, aprovechando para ello el hardware o software más apropiado. El curso está organizado para familiarizar al estudiante con ideas, conceptos y herramientas disponibles de la computación de alto rendimiento. Más importante, mediante prácticas el participante podrá adquirir conocimientos y destrezas en técnicas computacionales contemporáneas en el ámbito de la tecnología de cluster y la computación en paralelo, que le permitirán abordar con eficacia problemas que requieren del paralelismo para obtener resultados en tiempo razonable. Objetivos: Al finalizar el curso el estudiante será capaz de: a) Conocer distintas técnicas o modelos de computación, en hardware y software, para explotar paralelismo. b) Identificar, analizar y describir el paralelismo inherente a ciertos problemas. c) Diseñar y programar soluciones utilizando los modelos de cómputo y programación paralela aprendidos. Contenido: 1. Nociones fundamentales de paralelismo. Introducción: Motivación, importancia y objetivos de la Programación Paralela. Definiciones básicas: Algoritmo, Tarea y Proceso. Diferencias entre Computación Secuencial, Concurrente, Paralela y Distribuida. 2. Arquitecturas Paralelas. Revisión de las arquitecturas paralelas: SISD, SIMD, MISD y MIMD. Este tópico hace énfasis en dos clases de máquinas MIMD: memoria compartida y memoria distribuida, incluyendo los clusters de computadores 3. Aspectos de Rendimiento y Escalabilidad de los Sistemas Paralelos. Métricas para la evaluación del rendimiento de los sistemas paralelos. Efecto de la Granularidad. Fuentes de overhead. 4. Paradigmas de Programación Paralela. Programación Paralela explícita e implícita. Espacio de Memoria compartida o envío de mensajes. Descomposición por datos y por tareas. 5. Técnicas de programación paralela: Programación multi-hilos, OpenMP para memoria compartida y Programación con envío de mensajes. Librería MPI para el envío de mensajes.