Departamentos

Matemáticas

Grado y Doble Grado. Curso 2024/2025.

PROGRAMACIÓN PARALELA - 800619

Curso Académico 2024-25

Datos Generales

SINOPSIS

COMPETENCIAS

Generales
CG1, CG2, CG3, CG4
Transversales
CT1, CT2, CT4, CT5
Específicas
CE1, CE3, CE5, CE6, CE7
Otras
CB1, CB2, CB4, CB5

ACTIVIDADES DOCENTES

Clases teóricas
2 horas semanales. Además de las exposiciones teóricas del material del curso, se discuten soluciones a los ejercicios y las prácticas propuestas en clases anteriores.
Laboratorios
2 horas semanales. Se desarrollan en las aulas de informática. En ellas, el alumnado diseña y programa soluciones a ejercicios propuestos. El personal docente está presente para guiar y resolver las dudas que surjan.

Presenciales

6

Semestre

8

Breve descriptor:

¿Por qué la programación secuencial de siempre no es suficiente? ¿La posibilidad de hacer varias cosas a la vez merece un curso entero?

La programación paralela, la concurrente y la distribuida son tres paradigmas relacionados y de límites difusos. Se trata de situaciones en las que hay varios programas ejecutándose a la vez, en uno o en varios procesadores, con un objetivo común. Los procesadores pueden estar todos en la misma máquina o en distintas máquinas separadas pero comunicadas. Disponer de varios procesadores proporciona mayor potencia de cómputo, pero la necesidad de coordinación presenta desafíos adicionales a los de la programación secuencial. Este curso estudia las herramientas y las técnicas para sacar provecho del paralelismo, los nuevos problemas que aparecen y cómo evitarlos. El lenguaje de programación usado a través de todo el curso es Python, enriquecido con módulos para la programación paralela.

Requisitos

Son imprescindibles conocimientos básicos de programación: bucles, condicionales, variables, tipos de datos, funciones, clases. El lenguaje de programación utilizado en el curso es Python, aunque conocimientos equivalentes de un lenguaje distinto (C++, Java) deben ser suficientes.

Objetivos

- comprender la conveniencia de introducir paralelismo en la programación de ordenadores
- comprender los nuevos problemas que el paralelismo introduce en la programación
- entender los conceptos elementales y el vocabulario relacionado con la programación paralela, concurrente y distribuida
- ser capaz de diseñar la solución a un problema según los recursos disponibles (procesadores, infraestructura, comunicaciones)
- entender la utilidad de los métodos formales en el ámbito de la programación paralela
- utilizar Python y algunos de sus módulos para implementar soluciones a problemas usando paralelismo
- apreciar el uso de la programación paralela en situaciones reales
- conocer desarrollos recientes en el campo del paralelismo y la concurrencia, tanto teóricos como prácticos

Contenido

(El curso no necesariamente se desarrollará en este orden, más bien tendrá cierto nivel de paralelismo entre las distintas secciones.)

- motivación, introducción y conceptos básicos
    - clusters, procesadores multinúcleo, sistemas distribuidos
    - uso de pools de procesos para implementar paralelismo de datos
    - concurrencia, paralelismo, sistemas distribuidos
    - memoria compartida y paso de mensajes

- programación paralela
    - paralelismo en Python: módulo multiprocessing para procesos, módulo threading para hebras
    - datos compartidos con las clases Queue y Value
    - primitivas de concurrencia en Python: Lock, Semaphore, Condition
    - implementación de monitores como clases
    - comparar la eficiencia de programas usando procesos y usando hebras

- la concurrencia y sus problemas
    - atomicidad, entrelazado, indeterminismo
    - exclusión mutua, carreras de datos, progreso
    - algoritmos con memoria compartida: algoritmo de Dekker, algoritmo de la panadería
    - primitivas de concurrencia: cerrojos, semáforos, monitores
    - problemas clásicos en concurrencia: lectores-escritores, productor-consumidor, las filósofas hambrientas

- sistemas distribuidos
    - comunicación síncrona y asíncrona
    - paso de mensajes
    - uso de sockets en Python
    - problemas clásicos: protocolos de consenso

- temas adicionales (de los que nunca da tiempo, pero quién sabe)
    - comprobación de modelos, GPU, redes neuronales, futuros, Spark, canalización, transacciones, algoritmos no bloqueantes

Evaluación

Convocatoria ordinaria: 50 % evaluación continua y 50 % examen escrito.
Convocatoria extraordinaria: 30 % evaluación continua y 70 % examen escrito.

La evaluación continua consistirá principalmente en prácticas de programación.
En ambas convocatorias, es necesario un mínimo de 4 en el examen para poder aprobar la asignatura.

Bibliografía

- M. Ben-Ari, Principles of Concurrent and Distributed Programming, Prentice-Hall, 2006.
- N. Lynch, Distributed Algorithms, Morgan Kaufmann, 1996.
- J. Hunt, Advanced guide to Python 3 programming, Springer, 2023 (la parte VIII y, en menor medida, las siguientes).
- J. Guttag, Introduction to Computation and Programming Using Python, MIT Press, 2021 (para Python básico, sin paralelismo).
- documentación oficial de Python: https://docs.python.org/3/, especialmente:
- https://docs.python.org/3/library/threading.html
- https://docs.python.org/3/library/multiprocessing.html

Estructura

MódulosMaterias
CONTENIDOS AVANZADOS DE CIENCIAS DE LA COMPUTACIÓNPARADIGMAS DE PROGRAMACIÓN

Grupos

Clases teóricas
GrupoPeriodosHorariosAulaProfesor
Grupo único20/01/2025 - 09/05/2025LUNES 10:00 - 11:00S-106OSCAR MARTIN SANCHEZ


Clases prácticas
GrupoPeriodosHorariosAulaProfesor
Subgrupo U1 - - -OSCAR MARTIN SANCHEZ
Subgrupo U2 - - -OSCAR MARTIN SANCHEZ