Unidad 9: MPI#
Contenido de la unidad#
![](_static/images/contenidoU9.png)
Introducción a MPI4PY#
Definición de MPI4PY#
MPI es un estándar de comunicación entre procesos para sistemas distribuidos y paralelos.
MPI4PY proporciona una interfaz para MPI (Message Passing Interface) en Python.
Permite a los desarrolladores de Python crear programas paralelos y distribuidos.
Ofrece una amplia gama de funciones y utilidades para la comunicación entre procesos.
Proporciona soporte para diferentes implementaciones de MPI.
Comparando a MPI4PY con Multiprocessing#
Ventajas de MPI4PY
Estándar de comunicación para sistemas distribuidos y paralelos.
Ofrece una amplia gama de funciones y utilidades para la comunicación entre procesos.
Proporciona soporte para diferentes implementaciones de MPI.
Desventajas de MPI4PY
Requiere conocimiento de MPI para utilizarlo de manera efectiva.
La implementación y configuración puede ser más compleja que con otras bibliotecas.
No viene incluido por defecto en la biblioteca estándar de Python.
Ventajas de Multiprocessing
Incluido en la biblioteca estándar de Python.
Ofrece una interfaz de programación sencilla y coherente.
Es fácil de utilizar para problemas sencillos de paralelización.
Desventajas de Multiprocessing
No está diseñado específicamente para sistemas distribuidos.
No proporciona la misma funcionalidad para la comunicación entre procesos que MPI4PY.
No es tan escalable como MPI4PY para aplicaciones de alta demanda computacional.
Instalación de MPI4PY#
![](_static/images/U9_1.png)
Descargar el instalador desde: https://www.microsoft.com/en-us/download/details.aspx?id=100593
Seleccionar .exe
Instalar en la ruta por defecto: C:\Program Files\Microsoft MPI\
Agregar en las variables de usuario: C:\Program Files\Microsoft MPI\Bin
Ya en su ambiente de anaconda, instalar la librería: pip install mpi4py
Verificar si está funcionando, ejecutando en la terminal del ambiente donde se instaló:
mpiexec -n 4 python -c "from mpi4py import MPI; comm = MPI.COMM_WORLD; print('Hola desde el proceso', comm.rank)"
Salida esperada:
Programación con MPI4PY#
Hola Mundo#
Comunicación entre procesos en MPI.COMM_WORLD
![](_static/images/U9_3.png)
En MPI, los procesos se identifican por una secuencia de enteros positivos llamados rangos.
La función “Get_rank()” de MPI devuelve el rango del proceso que la llamó.
El argumento “comm” en “Get_rank()” es un comunicador que define su propio conjunto de procesos que pueden comunicarse entre sí.
El código muestra cómo obtener e imprimir el rango del proceso actual.
Cada proceso en la ejecución de MPI corre el mismo binario compilado y recibe las mismas instrucciones.
Tip
Ver el archivo de Python:
1-HolaMundoConMPI.py
Compilar usando:
mpiexec -n 5 python .\1-HolaMundoConMPI.py
Comunicación punto a punto#
El protocolo de transmisión de envío/recepción
![](_static/images/U9_4.png)
MPI4py es una biblioteca que permite la comunicación entre procesos en programación paralela mediante MPI.
Esta comunicación se realiza a través de un comunicador (Comm) que agrupa los procesos participantes.
Cada proceso posee un identificador único llamado “rank”.
Para enviar datos, se utiliza la función comm.send(), especificando el dato y el proceso receptor. Para recibir datos, se usa la función comm.recv(), indicando el proceso emisor.
Tip
Ver el archivo de Python:
2-ComunicacionPuntoAPunto.py
Compilar usando:
mpiexec -n 9 python .\2-ComunicacionPuntoAPunto.py
Evitar Problemas De Punto Muerto#
Métodos de Comunicación: comm.send() y comm.recv() son funciones bloqueantes en mpi4py.
Problema de Deadlock: si dos procesos llaman a comm.recv() antes que comm.send(), pueden bloquearse mutuamente causando un deadlock.
Solución Efectiva: hacer las funciones de envío y recepción asimétricas o utilizar la función comm.sendrecv().
Función Sendrecv: unifica el envío y recepción de mensajes en una única llamada, evitando el interbloqueo.
Tip
Ver el archivo de Python:
3-EvitarProblemasDePuntoMuerto.py
Compilar usando:
mpiexec -n 9 python .\3-EvitarProblemasDePuntoMuerto.py
Ver el archivo de Python:
4-EvitarProblemasDePuntoMuertoOp2.py
Compilar usando:
mpiexec -n 9 python .\4-EvitarProblemasDePuntoMuertoOp2.py
Comunicación colectiva usando broadcast#
![](_static/images/U9_5.png)
Tip
Ver el archivo de Python:
5-ComunicacionColectivaBroadcast.py
Compilar usando:
mpiexec -n 9 python .\5-ComunicacionColectivaBroadcast.py
Comunicación colectiva mediante dispersión (scatter)#
![](_static/images/U9_6.png)
Tip
Ver el archivo de Python:
6-ComunicacionColectivaScatter.py
Compilar usando:
mpiexec -n 10 python .\6-ComunicacionColectivaScatter.py
Comunicación colectiva utilizando reunir (gather)#
![](_static/images/U9_7.png)
Tip
Ver el archivo de Python:
7-ComunicacionColectivaGather.py
Compilar usando:
mpiexec -n 5 python .\7-ComunicacionColectivaGather.py
Comunicación colectiva usando Alltoall#
![](_static/images/U9_8.png)
Tip
Ver el archivo de Python:
8-ComunicacionColectivaAllToAll.py
Compilar usando:
mpiexec -n 5 python .\8-ComunicacionColectivaAllToAll.py
Multiplicación de matrices#
Entendiendo la multiplicación de matrices: Objetivo#
Se desea multiplicar las matrices A y B, lo cual debería generar una matriz nueva C
Entendiendo la multiplicación de matrices: Broadcast#
Desde el proceso 0 se transmite la matriz B a todos los procesos
Entendiendo la multiplicación de matrices: Scatter#
Cada proceso recibe una subsección de A (100x500)
Comunicación colectiva mediante dispersión (scatter)
Entendiendo la multiplicación de matrices: Multiplicando#
![](_static/images/U9_12.png)
![](_static/images/U9_13.png)
![](_static/images/U9_14.png)
Entendiendo la multiplicación de matrices Gather (reuniendo)#
Se recogen en el proceso 0 los resultados de la multiplicación de todos los procesos
Programando la multiplicación de matrices#
Multiplicación de matrices
Tip
Ver el archivo de Python:
9-MultiplicaciónDeMatrices.py
Compilar usando:
mpiexec -n 4 python .\9-MultiplicaciónDeMatrices.py
Ver el archivo de Python:
9-MultiplicaciónDeMatrices2.py
Compilar usando:
mpiexec -n 4 python .\9-MultiplicaciónDeMatrices2.py
Ver el archivo de Python:
9-MultiplicaciónDeMatrices3.py
Compilar usando:
mpiexec -n 4 python .\9-MultiplicaciónDeMatrices3.py
Ver el archivo de Python:
9-MultiplicaciónDeMatrices4.py
Compilar usando:
mpiexec -n 5 python .\9-MultiplicaciónDeMatrices4.py
Vista del procesamiento en paralelo en acción#
Ver administrador de tareas
Ver temperatura del procesador - Ventilador
Recursos#
![](_static/images/U9_16.png)
Ver el Chapter 3: Process-based Parallelism. Páginas de la 97 a la 126.
Taller y Quiz#
Tip
Ver la subsección Evaluemos lo aprendido!!