Atributos
Sigla: 
CI-0117
Créditos: 
4
Horas: 
5
Clasificación: 
Curso propio
Énfasis y ciclo: 
Tronco común 2.II
Descripción: 

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.

Objetivo general: 

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.

Objetivos específicos: 

Durante el curso el estudiante desarrollará habilidades para:

  1. 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.
  2. Diseñar soluciones concurrentes y distribuidas correctas.
  3. Resolver problemas por paralelización de datos y paralelización de tareas.
  4. Construir programas concurrentes para resolver problemas mediante hilos de ejecución y recursos compartidos.
  5. Construir programas distribuidos para resolver problemas mediante procesos y recursos distribuidos.
  6. Probar programas concurrentes y distribuidos para asegurar su efectividad y calidad mediante el uso de pruebas de software.
  7. 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.
  8. Explicar el modelo de ejecución concurrente y distribuido (máquina nocional) para implementar programas de forma correcta.
Contenidos: 

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: 
  1. Bibliografía
  2. Pacheco, Peter S. “An introduction to parallel programming”. Morgan Kaufmann Pub, 2011.
  3. Rauber, Thomas y Rünger, Gudula.  “Parallel Programming (for multicore and cluster systems)”. Springer-Verlag Berlin Heigelberg, 2010.
  4. Grama, Ananth et.al. “Introduction to Parallel Computing”. Addison-Wesley, 2003.
  5. Quinn, Michael J. “Parallel Programming in C with MPI and OpenMP”. McGraw-Hill Education, 2003.
  6. Chandra, Rohit et.al. “Parallel Programming in OpenMP”. Morgan Kaufmann Pub, 2001.
  7. 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

LIberación de responsabilidad: 

Este no es un documento oficial. Documentos oficiales se entregan en la secretaría de la escuela.