Universidad de Costa Rica |
Prof. Jeisson Hidalgo-Céspedes |
Recurso | Peso | Descripción |
---|---|---|
— |
Programa del curso y acuerdos |
|
— |
Ejemplos de programas realizados durante las lecciones |
|
— |
Material de referencia |
|
— |
En Mediación Virtual |
|
Quices |
25% |
En el aula virtual |
25% |
Factorización prima y problemas de sincronización |
|
30% |
Servidor web concurrente y distribuido (imperativo, patrón productor-consumidor) |
|
20% |
Simulación de transferencia de calor (concurrencia y distribución declarativa) |
- Introducción
- Concurrencia multihilo imperativa (Pthreads)
- Ejemplo hello. Conjunto de herramientas
- Concepto de hilo de ejecución
- Indeterminismo (hello_w)
- Memoria privada y compartida
- Espera activa. Condición de carrera
- Exclusión mutua (mutex). Semáforo (parte1)
- Semáforo (parte 2). Seguridad condicional
- Productor-consumidor de buffer acotado
- Productor-consumidor de buffer no acotado (diseño)
- Productor-consumidor de buffer no acotado (implementación)
- Patrón productor-consumidor (parte 1)
- Patrón productor-consumidor (parte 2)
- Paralelismo de datos (parte 1)
- Concurrencia de tareas (parte 1)
- Distribución simétrica (MPI)
- Concurrencia de tareas (parte 2)
- Paralelismo de datos (parte 2)
Introducción
Material de referencia
Taller de C++ a C
-
Filosofía de la computación. Paradigmas de programación: procedimental
-
Archivo encabezado (lo público), fuente (privado). Registro opaco (atributos privados)
-
Comparación de textos en C. Múltiples puntos de retorno de subrutina. Imprimir ayuda
-
Preguntas de estudiantes. Análisis del argumento -b (binario)
-
Trabajar tanto con archivos como la entrada estándar y en binario
Resolución de problemas
L16-ago | Gr01 | Gr03 |
---|---|---|
Presentación del curso y carta al estudiante |
||
Proceso de resolución de problemas |
||
Paradigmas de programación |
Paradigma de programación concurrente
J19-ago | Gr01 | Gr03 |
---|---|---|
Paradigmas de programación (cont.) |
||
Serial vs concurrente vs paralelo |
||
Concurrencia basada en eventos |
||
Concurrencia multihilo |
||
Distribución simétrica. Clústers |
||
Distribución asimétrica. Mallas. Comparación con simétrica. |
||
Concurrencia heterogénea. Aceleración por hardware |
||
Incremento del desempeño (paralelismo de datos). Separación de asuntos (concurrencia de tareas) |
Concurrencia multihilo imperativa (Pthreads)
Ejemplo hello. Conjunto de herramientas
L23-ago | Gr01 | Gr03 |
---|---|---|
Crear repositorio personal. IDE. Plugin para pseudocódigo |
||
Ejemplo Hello: Diseño en pseudocódigo |
||
Anuncio: Tarea01 |
||
Notación de pseudocódigo (ocho tipos de instrucciones) |
||
Creación de threads en pseudocódigo |
||
Ptheads = POSIX threads |
||
Convertir pseudocódigo en comentarios usando expresiones regulares |
||
Implementación del hola Pthread. pthread_create(). Error estándar |
||
Compilar el código. Compilador, preprocesador, enlazador |
||
Tool1: El compilador. Habilitar warnings |
||
Tool2: Linter (cpplint). Análisis estático de código. |
||
Tool3: Memcheck de Valgrind: errores de memoria (fugas, accesos inválidos…) |
||
Makefiles |
||
Tool4: Helgrind de Valgrind: errores de concurrencia (condiciones de carrera…) |
||
Tool5: Address Sanitizer (ASan) de Google para fugas y accesos inválidos |
||
Tool6: Memory Sanitizer (MSan) de Google para memoria no inicializada |
||
Tool7: Thread Sanitizer (TSan) de Google para errores de concurrencia |
||
Tool8: Undefined Behavior Sanitizer (UBSan) de Google para comportamientos inesperados |
||
Corregir el thread leak. |
Concepto de hilo de ejecución
J26-ago | Gr01 | Gr03 |
---|---|---|
Indeterminismo. |
||
Rastreo de memoria. Cargado del proceso. Segmento de código. Segmento de datos |
||
Creación del hilo principal. El ambiente de ejecución del lenguaje (crt0) |
||
Invocación de |
||
Crear un nuevo hilo. Start routine. Stack pointer |
||
Estado ready y estado running de un hilo de ejecución |
||
Colas de espera. Reanudar la ejecución |
||
Estado terminated. |
||
Definición de hilo de ejecución. Metáfora de hilo |
Indeterminismo (hello_w)
30-ago | Gr03 |
---|---|
Actividad hello_w. Copiar hello/ a hello_w/. Archivo .gitignore. |
|
Variables y funciones en Makefile |
|
Solución en pseudocódigo de hello_w. |
|
Argumentos en línea de comandos. Espacios e interpolación en argumentos. |
|
Implementación de pseudocódigo. Conversión texto a número con |
|
Corregir vulnerabilidad índice fuera de rango. Programación defensiva. |
|
Desborde de pila por arreglo variable automático (vulnerabilidad). Memoria dinámica. |
|
Corregir fuga de memoria. |
|
Serialización por join |
|
Concepto de indeterminismo |
|
Correr herramientas de validación. Falsos positivos de helgrind |
|
Linter. Enteros de tamaño fijo. Filtrar reglas del linter |
|
Obtener la cantidad de CPUs disponibles con |
Memoria privada y compartida
J02-set | Gr03 |
---|---|
Modularización del ejemplo |
|
Makefile para uso de los ejemplos, tareas, y proyectos del curso |
|
Diferencia entre la concurrencia de tareas y el paralelismo de datos en pseudocódigo |
|
Implementación de memoria privada (parte 1): Thread team. Registros de memoria. |
|
Implementación de memoria privada (parte 2): |
|
Validar código. Ejercicio para la casa: |
|
Ejemplo |
|
Memoria compartida en pseudocódigo. La declaración |
|
Implementación de la memoria compartida en Pthreads |
Espera activa. Condición de carrera
L06-set | Gr03 |
---|---|
Medir tiempo de pared. CPU time. SO de tiempo real. División entera |
|
Espera activa (busy waiting). Pseudocódigo de hello_order_busywait |
|
Implementación y ejecución de espera activa con Pthreads |
|
Explicación del efecto en tiempo de ejecución de la espera activa |
|
Ejemplo |
|
Ejemplo |
|
Definición de condición de carrera (data race o race condition) |
|
Exclusión mutua (mutex o candado). Región crítica. Metáfora del puente angosto |
Exclusión mutua (mutex). Semáforo (parte1)
J09-set | Gr03 |
---|---|
Repaso de la lección previa: exclusión mutua |
|
Implementación de mutex en Pthreads. Imprimir en la región crítica |
|
Liberar el mutex ( |
|
Mutex debe proteger todos los accesos a la variable, no sólo escritura |
|
Múltiples regiones críticas |
|
Olvidar liberar un mutex ("el proceso bello durmiente") |
|
Definición original de semáforo (Dijkstra) |
|
Metáfora de semáforo |
|
Usar un arreglo de semáforos para imponer orden |
Semáforo (parte 2). Seguridad condicional
L13-set (reposición) | Video |
---|---|
Repaso: mutex, semáforo. Futex (fast userspace mutex) |
|
Ejemplo |
|
Semáforos en POSIX. Semáforos de memoria. Semáforos nombrados |
|
|
|
Corrección de errores en |
|
Seguridad condicional (conditionally safe) |
|
|
|
|
Productor-consumidor de buffer acotado
J16-set | Gr01 |
---|---|
Análisis del problema del productor-consumidor de buffer acotado |
|
Ejecutar el código dado |
|
Comprensión del pseudcódigo dado |
|
Idear una solución con dos semáforos |
|
Solución en pseudocódigo |
|
Comprensión del código en C dado |
|
Implementación y ejecución de la solución con Pthreads |
Productor-consumidor de buffer no acotado (diseño)
L20-set | Gr03 |
---|---|
Poblema del Productor-consumidor de buffer acotado. Archivos dados. Makefile v2.2.2 |
|
Comprender el pseudocódigo dado |
|
Rastreo de procesamiento. Encontrar las condiciones de carrera |
|
Hacer la cola thread-safe usando exclusión mutua |
|
Corregir productores usando variables contadoras (variante 0) |
|
Corregir productores usando ciclo infinito (variante 1) |
|
Corregir consumidores usando variables contadoras y ciclo infinito (variante 1) |
|
Evitar que los consumidores extraigan de la cola si está vacía |
|
Rastreo rápido de procesamiento de los consumidores con variables contadoras (variante 1) |
|
Consumidores con variables contadoras y espera activa (variante -2) |
|
Detener consumidores cuando la cola está vacía y los productores terminaron (variante 2) |
Productor-consumidor de buffer no acotado (implementación)
J23-set | Gr01 |
---|---|
Repaso. Numerar las variantes de productor y consumidor |
|
Detener consumidores usando un valor centinela (variante 3) |
|
Comprender el código C dado |
|
Implementación de la cola thread-safe: |
|
Cola thread-safe: |
|
Cola thread-safe: |
|
Cola thread-safe: |
|
Cola thread-safe: |
|
Cola thread-safe: ¿Debería |
Patrón productor-consumidor (parte 1)
L27-set | Gr03 |
---|---|
Corrección de errores en |
|
Implementación de la variante 1 de los productores en Pthreads |
|
Implementación de la variante 1 de los consumidores en Pthreads |
|
Patrón productor-consumidor. Ejecución de la simulación de red |
|
Principio del patrón productor-consumidor. Flow-based programming paradigm |
|
Repaso del patrón modelo-vista-controlador (MVC) |
|
Controlador de la simulación de red |
Patrón productor-consumidor (parte 2)
J30-set | Gr03 |
---|---|
Controlador de la simulación de red (repaso) |
|
Clase abstracta genérica |
|
Clase abstracta |
|
Plantilla |
|
Clase abstracta genérica |
|
Clase abstracta genérica |
|
Clase abstracta genérica |
|
Motivación al paralelismo de datos |
|
Optimización. Método sugerido para optimizar |
Paralelismo de datos (parte 1)
Descomposición, mapeo, métricas
L04-oct | Gr03 |
---|---|
Repaso de optimización |
|
Descomposición: concepto y técnicas: recursiva, de datos, exploratoria, especulativa |
|
Mapeo: concepto. Mapeo estático. Mapeo dinámico |
|
Actividad de mapeo manual en una hoja de cálculo |
|
Mapeo estático por bloque no balanceado |
|
Modelo matemático del mapeo estático por bloque balanceado |
|
Mapeo dinámico en la actividad de la hoja de cálculo |
|
Mapeo estático cíclico. Metáfora de la baraja de naipes |
|
Mapeo estático cíclico con bloques |
|
Mapeo dinámico |
|
Métrica del incremento de velocidad (speedup) |
|
Métrica de eficiencia (efficiency). Gráficos combinados |
|
Mapeos estáticos para los casos 2 y 3 en la hoja de cálculo |
|
Mapeo dinámico para los casos 2 y 3 en la hoja de cálculo |
|
Comparación de los tipos de mapeo |
|
Ejercicio de la simulación de mapeo. Algoritmos de posibles implementaciones de los mapeos |
Ley de Amdahl. Profiling. Clúster de Arenal
J07-oct | Gr03 |
---|---|
Mapeo dinámico aleatorio |
|
Eficiencia ideal (1.0) |
|
Ley de Amdahl. Máximo speedup teórico. Usarla para estimar recursos |
|
Análisis estático y dinámico de código |
|
Problema de ejemplo: marcar la cerca |
|
Callgrind: herramienta de profiling para invocaciones y procesamiento |
|
Concepto de visualización. Procesos en segundo plano en el shell |
|
Kcachegrind: herramienta de visualización. Encontrar regiones de código que más consumen CPU |
|
Clúster de Arenal. Nodo máster y esclavos |
|
Determinar cantidad de CPUs ( |
|
Correr procesos en el clúster. Monitorear procesos ( |
Concurrencia de tareas (parte 1)
Proyecto 1.1 (inducción)
J07-oct | Video |
---|---|
Objetivo del proyecto. Estructura del código dado. Correr el servidor web |
|
Servidor web vs aplicación web. Interfaz de un servidor |
|
El servidor web (clase |
|
Iniciar el servidor (método |
|
Establecimiento de la conexión |
|
Mensaje de solicitud y de respuesta. Ciclo de atención de solicitudes. Lista de to-do |
|
Metáfora del food court. Tomador de órdenes ( |
|
Avances del proyecto 1 explicados en la cadena de producción |
|
Enrutamiento web. HTML. Solicitud HTTP. Respuesta HTTP |
|
La aplicación web de factorización de números |
Primitivas
L18-oct | Gr03 |
---|---|
Concurrencia de tareas. El pequeño libro de los semáforos |
|
Notaciones de pseudocódigo concurrente |
|
Rutas de ejecución concurrente |
|
Redes de Petri. Modelado de sistemas concurrentes y distribuidos. |
|
Ejemplo de las rutas de ejecución en red de Petri. Lugares, transiciones y arcos |
|
Ejemplo |
|
Ejemplo |
Patrones básicos
J21-oct | Gr03 |
---|---|
Ejemplo |
|
Encuentro (rendezvous): solución 1 en pseudocódigo [err] |
|
Encuentro (rendezvous): solución 2 en pseudocódigo [err] |
|
Encuentro (rendezvous): Bloqueo mutuo (deadlock) |
|
Encuentro (rendezvous): red de Petri |
|
Exclusión mutua con semáforos (sem_mutex): pseudocódigo |
|
Exclusión mutua con semáforos (sem_mutex): red de Petri |
|
Exclusión mutua simétrica (sem_mutex_sym): pseudocódigo |
|
Concurrencia acotada (multiplex): pseudocódigo |
Barreras
L25-oct | Gr03 |
---|---|
Repaso de patrones básicos en redes de Petri |
|
Exclusión mutua simétrica ( |
|
Concurrencia acotada ( |
|
Barrera con semáforos ( |
|
Barrera con semáforos ( |
|
Barrera con semáforos ( |
|
Metáfora de barrera: aguja de paso vehicular |
|
Problema de la barrera reusable ( |
|
Barrera diseñada con un torniquete (turnstile) |
|
Barrera reusable en un ciclo con dos torniquetes (turnstiles) |
|
Interfaz en pseudocódigo concurrente para crear barreras |
|
Carrera de relevos ( |
|
Carrera de relevos ( |
|
Carrera de relevos ( |
|
Barreras en Pthreads |
Concurrencia declarativa (OpenMP)
J28-oct | Gr01 |
---|---|
Carrera de relevos ( |
|
Concurrencia de tareas declarativa: OpenMP |
|
Hola mundo en OpenMP. Directivas del preprocesador. Instrumentalización de código con OpenMP |
|
Región paralela. Bloque estructurado |
|
Invocación de subrutinas en la región paralela |
|
Indeterminismo en la salida por los operadores de flujo de C++. Región crítica (mutex) |
|
OpenMP con Google Sanitizers y Valgrind |
|
Ejemplo |
|
Ejemplo de un bloque no estructurado |
L01-nov | Gr03 |
---|---|
Repaso. Potencial concurrencia de tareas en OpenMP |
|
Ejemplo |
|
Restricciones: ciclo por contador y bloque estructurado |
|
Pasar valores a los hilos: |
|
Enunciado de reutilizar hilos ( |
|
Reutilizar hilos. Diferencia entre |
|
Barreras ( |
|
Anuncio: Ejercicio de ordenamiento par-impar. Comandos |
|
Descomposición (iteraciones) y mapeo (scheduling) en OpenMP. Mapeo estático por bloque |
|
Mapeo dinámico y mapeo guiado en OpenMP |
J04-nov | Gr03 |
---|---|
Mapeo guiado (guided scheduling). Diferencias entre GCC y Clang |
|
Parámetro tamaño de bloque en los mapeos de OpenMP. Mapeo cíclico |
|
Mapeo en tiempo de ejecución ( |
|
Ejemplo de calcular el promedio ( |
|
|
|
|
|
|
|
|
|
Paradigma de programación distribuida |
|
Pregunta: Cómo se detiene el ciclo de lectura con el operador de flujo |
Distribución simétrica (MPI)
L08-nov | Gr03 |
---|---|
Repaso de distribución |
|
Especificación MPI. Implementaciones: MPICH, Open MPI. Instalación de Open MPI |
|
Correr comandos con |
|
Ejemplo |
|
Documentación de MPI. |
|
Process rank (número de proceso). Tamaño del mundo (cantidad de procesos). Nombre del procesador (nombre de la máquina) |
|
Reusar |
|
Correr localmente el ejemplo de hola mundo. Errores de Sanitizers y Valgrind. |
|
Pregunta: Depuración y análisis de código distribuido. Bitácoras. Monitoreo. Visualización |
|
Correr el ejemplo de hola mundo en el clúster con MPICH. Mapeo cíclico con bloques (slots) de procesos a nodos |
|
Correr el ejemplo de hola mundo en el clúster con Open MPI. Mapeo por bloque (slots) de procesos a nodos |
|
Editar archivos remotamente: |
|
Ejemlo |
Comunicación punto a punto (send-receive)
J11-nov | Gr03 |
---|---|
Modelo de ejecución de MPI (ssh, nfs) |
|
Rastreo de procesos e hilos. Mecanismos de intercomunicación de procesos (IPC) |
|
|
|
|
|
|
|
|
|
|
|
Comunicación punto a punto. Primitivas send y receive. Entrada y salida blocking o sincrónica |
|
|
|
|
L15-nov | Gr03 |
---|---|
Repaso ejemplo |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Tipos de send y receive en MPI: blocking, non-blocking (I), buffered (B) y ready (R) |
|
|
|
|
|
|
|
|
Comunicación colectiva (broadcast)
J18-nov | Gr03 |
---|---|
|
|
Solución con metáforas visuales. Modelos centralizados y descentralizados |
|
Solución en pseudocódigo: subrutina |
|
Pseudocódigo de los corredores de las etapas 1 y 2. Barreras en MPI ( |
|
Pseudocódigo del árbitro |
|
Implementación con MPI. Tiempo transcurrido desde el punto de vista del árbitro |
|
|
|
|
Comunicación colectiva: reducciones
L22-nov | Gr03 |
---|---|
|
|
|
|
|
|
|
|
Cómo funciona la reducción en MPI. Árbol binario de reducción. Usar número de proceso en la semilla de números aleatorios. |
|
|
|
|
|
Otros temas de MPI: scatter, gather, soporte multi-hilos, paralelización de archivos. |
Concurrencia de tareas (parte 2)
Variable de condición. Filósofos comensales
L22-nov | Gr03 |
---|---|
|
|
|
|
Concepto de variable de condición. Metáfora del oficial de tránsito y el intercomunicador. Variables de condición en Pthreads |
|
|
|
Filósofos comensales: Enunciado del problema ( |
|
Filósofos comensales: análisis del psedocódigo inicial |
|
Filósofos comensales: solución 1: lateralidad (zurdos y diestros) |
|
Filósofos comensales: solución 2: cuota (capacidad de comensales concrrentes en la mesa) |
Lectores y escritores. Candados de lectura y escritura
J25-nov | Gr03 |
---|---|
Filósofos comensales: Otras soluciones: con contadores, distribuida centralizada (mesero), y distribuida descentralizada. |
|
Filósofos comensales: solución en red de Petri (con inanición) |
|
Lectores y escritores: Enunciado del problema |
|
Lectores y escritores: Solución en pseudocódigo |
|
|
|
Candado de lectura y escritura. Metáfora del puente levadizo. |
|
Ejercicios de candados de lectura y escritura. Comparación de rendimiento entre |
|
|
|
|
Paralelismo de datos (parte 2)
Falso compartido (false sharing)
J02-dic | Gr03 |
---|---|
|
|
|
|
Arquitectura de la jerarquía de caché |
|
Rastreo de caché. Fallo de caché. Principio de localidad. Dirty bit. Coherencia de caché |
|
Falso compartido (false sharing). Modificación de memoria cercana y distante |
|
Análisis dinámico de fallos de caché (profiling). |
|
Relación entre los tipos de mapeo y el falso compartido |
|
|
|
Subrutinas reentrantes vs thread-safe |