La programación concurrente y distribuida de datos y tareas es una ampliación de las habilidades de programación serial desarrolladas en cursos previos. Esta ampliación es imprescindible por cuanto las plataformas de hardware actuales y futuras ofrecen características de computación paralela que no podrían ser aprovechadas por programadores que solo dominen la programación serial.
El objetivo general del curso es que los estudiantes desarrollen habilidades para resolver problemas que requieren incremento del desempeño mediante la paralelización de datos y tareas a través de los paradigmas de programación concurrente y distribuido.
Durante el curso el estudiante desarrollará habilidades para:
- Comprender y explicar las motivaciones y tendencias de la computación paralela para contextualizar el desarrollo de software paralelo en la actualidad mediante el estudio de las características generales de las tecnologías más relevantes.
- Diseñar soluciones concurrentes y distribuidas correctas.
- Resolver problemas por paralelización de datos y paralelización de tareas.
- Construir programas concurrentes para resolver problemas mediante hilos de ejecución y recursos compartidos.
- Construir programas distribuidos para resolver problemas mediante procesos y recursos distribuidos.
- Probar programas concurrentes y distribuidos para asegurar su efectividad y calidad mediante el uso de pruebas de software.
- Evaluar y comparar el desempeño de programas concurrentes y distribuidos para determinar su incremento en el rendimiento respecto a versiones funcionalmente equivalentes mediante la aplicación de métricas básicas de uso común.
- Explicar el modelo de ejecución concurrente y distribuido (máquina nocional) para implementar programas de forma correcta.
Objetivo |
Eje temático |
Desglose |
1 Comprender motivaciones y tendencias |
1.1 La necesidad de computación paralela |
Las necesidades de separación de asuntos y desempeño que motiva el software paralelo. |
1.2 Hardware paralelo |
Sinopsis de modelos de hardware paralelo. Jerarquía de Flynn |
|
1.3 Software paralelo |
Concepto de proceso y de hilo de ejecución. |
|
2 Diseñar soluciones concurrentes y distribuidas |
2.1 Algoritmos paralelos |
Diferencia con algoritmos seriales. Análisis espaciotemporal de algoritmos paralelos. |
2.2 Técnicas de descomposición |
Descomposición recursiva, de datos, exploratoria, especulativa y otras. |
|
2.3 Mapeo de tareas a procesos |
Características de tareas e interacciones. Técnicas de mapeo para balanceo de carga. Técnicas para reducir la sobrecarga debida a la interacción de tareas. |
|
2.4 Modelos de programas paralelos |
Paralelismo de datos, grafo de tareas, work-pool y otros. |
|
3. Resolver problemas |
3.1 Problemas de paralelización de datos y tareas |
Resolver problemas como: consumidor-productor, filósofos comensales, problema de los fumadores, problema de la barbería, problema de Santa Claus, formar agua, y el problema de Modus Hall. |
4, 8 Construir programas concurrentes con recursos compartidos |
4.1 Concurrencia por hilos |
Concepto de hilo de ejecución. Espacio de direcciones. Interfaces de programación por hilos (como Pthreads y OpenMP). Rastreo de memoria y procesamiento de hilos de ejecución. |
4.2 Integridad de hilos |
Condiciones de carrera (regiones críticas). Código reentrante. Código thread-safe. |
|
4.3 Mecanismos de sincronización |
Espera activa. Mecanismos de sincronización provistos por el API (como mutex, semáforos, candados de lectura-escritura, variables de condición, barreras, reducciones). |
|
5, 8 Construir programas concurrentes con recursos distribuidos |
5.1 Concurrencia por procesos |
Concepto de proceso. Memoria distribuida. Interfaces de programación por procesos (como MPI). Rastreo de memoria y procesamiento de procesos. |
5.2 Entrada y salida |
Entrada y salida mediante procesos paralelos. |
|
5.3 Comunicación |
Comunicación punto a punto y comunicación colectiva entre procesos. |
|
6 Probar |
6.1 Pruebas de software |
Pruebas de correctitud en programas concurrentes y distribuidos (como caja negra y caja blanca). |
7 Evaluar y comparar |
7.1 Métricas |
Ley de Amdahl. Métricas de aceleración (speedup), eficiencia, y escalabilidad. |
7.2 Desempeño |
Medición del tiempo de pared. Gráficos de desempeño. |
Metodología
Metodología pedagógica o didáctica. Ver artículo 14 del Reglamento de Régimen Académico Estudiantil.
Evaluación
Indicar aspectos a evaluar en el curso y su ponderación (no incluir el rubro de “concepto”). Especificar normas o reglas de evaluación particulares, si hubiera. Ver artículo 14 del Reglamento de Régimen Académico Estudiantil.
Cronograma
Incluir al menos fechas de exámenes y de elementos de evaluación cuyo puntaje singular sea significativo.
- Bibliografía
- Pacheco, Peter S. “An introduction to parallel programming”. Morgan Kaufmann Pub, 2011.
- Rauber, Thomas y Rünger, Gudula. “Parallel Programming (for multicore and cluster systems)”. Springer-Verlag Berlin Heigelberg, 2010.
- Grama, Ananth et.al. “Introduction to Parallel Computing”. Addison-Wesley, 2003.
- Quinn, Michael J. “Parallel Programming in C with MPI and OpenMP”. McGraw-Hill Education, 2003.
- Chandra, Rohit et.al. “Parallel Programming in OpenMP”. Morgan Kaufmann Pub, 2001.
- Downey, Allen B. Little Book of Semaphores.
Disponible en https://greenteapress.com/wp/semaphores
Recursos estudiantiles
Para información sobre recursos estudiantiles disponibles en la UCR, incluyendo el Sistema de bibliotecas y la normativa universitaria vigente, favor visitar la página: https://www.ecci.ucr.ac.cr/vida-estudiantil/servicios-institucionales-para-estudiantes/guia-de-recursos-estudiantiles-de-la-ucr
Este no es un documento oficial. Documentos oficiales se entregan en la secretaría de la escuela.