Paso de mensajes
con Python
El paso de mensajes es una técnica empleada en
programación concurrente para aportar sincronización entre procesos y permitir
la exclusión mutua. Define la sintaxis y la semántica de las funciones
contenidas en una biblioteca de paso de mensajes diseñada para ser usada en
programas que exploten la existencia de múltiples procesadores.
Los elementos principales que
intervienen en el paso de mensajes son el proceso que envía, el que recibe y el
mensaje.
MPI
para Python
MPI , [-MPI
utilizando] [MPI-ref] la Message
Passing Interface, es un sistema de paso de mensajes estandarizados y
portátil diseñado para funcionar en una amplia variedad de computadoras
paralelas. La norma define la sintaxis y la semántica de las rutinas de
biblioteca y permite a los usuarios escribir programas portables en los
principales lenguajes de programación científica (Fortran,Python, C o C ++).
Desde su lanzamiento, la
especificación MPI [MPI-STD1] [MPI-STD2] se
ha convertido en el principal estándar para las bibliotecas de paso de mensajes
para computadoras paralelas. Implementaciones están disponibles de vendedores
de ordenadores de alto rendimiento y de proyectos de código abierto bien
conocidos como MPICH [MPI-mpich] , abierto MPI [MPI-openmpi] o LAM [MPI-lammpi] .
Para programar aplicaciones con MPI, se utiliza un runtime llamado OpenMPI, el cual es la versión libre y que además funciona con el lenguaje de programación C, en entorno Unix únicamente. Aunque existe un binding entre Python y MPI, llamado PyMPI, con el cual podemos utilizar las bondades de un lenguaje dinámico en conjunto con la programación de aplicaciones en paralelo.
Hay por lo menos cinco intentos conocidos de aplicar MPI para Python: mpi4py, PyPar, PyMPI, MYMPI, y en el submódulo ScientificPython MPI.
PyMPI es notable porque se trata de una variante de python intérprete multi-nodo de la aplicación de la propia intérprete, más que el código se ejecuta el intérprete. Implementa la mayor parte de la especificación MPI y trabaja automáticamente con el código compilado que necesita para hacer llamadas MPI.
PyPar, MYMPI, y el módulo ScientificPython están diseñados para trabajar como un típico módulo realizando una declaración de importación.
Hacen el trabajo del codificador para decidir cuándo y dónde pertenece la llamada a MPI_Init.
Ejemplos de CODIGO
Spawn ()
Send ()
from mpi4py
import MPI
import numpy
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
# passing MPI datatypes explicitly
if rank == 0:
data = numpy.arange(1000, dtype='i')
comm.Send([data,
MPI.INT], dest=1, tag=77)
elif rank == 1:
data = numpy.empty(1000, dtype='i')
comm.Recv([data, MPI.INT],
source=0,
tag=77)
# automatic MPI datatype discovery if
rank == 0:
data = numpy.arange(100, dtype=numpy.float64)
comm.Send(data, dest=1, tag=13)
elif rank == 1:
data = numpy.empty(100, dtype=numpy.float64)
comm.Recv(data,
source=0,
tag=13)
Recv()
from mpi4py
import MPI
import numpy
comm = MPI.COMM_WORLD
rank =
comm.Get_rank()
# passing MPI datatypes explicitly
if rank == 0:
data = numpy.arange(1000, dtype='i')
comm.Send([data,
MPI.INT], dest=1, tag=77)
elif rank == 1:
data = numpy.empty(1000, dtype='i')
comm.Recv([data,
MPI.INT], source=0, tag=77)
# automatic MPI datatype discovery if
rank == 0:
data = numpy.arange(100, dtype=numpy.float64)
Broadcast
()
from mpi4py
import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
if rank == 0:
data = {'key1' : [7, 2.72, 2+3j],
'key2' : ( 'abc', 'xyz')}
else:
data = None
data = comm.bcast(data,
root=0)
Scatter ()
from
mpi4py import MPI
comm = MPI.COMM_WORLD size = comm.Get_size()
rank = comm.Get_rank()
if
rank == 0:
data = [(i+1)**2 for i in range(size)]
else:
data = None
data = comm.scatter(data,
root=0) assert data
== (rank+1)**2
Gather ()
from
mpi4py import MPI
comm = MPI.COMM_WORLD size = comm.Get_size()
rank = comm.Get_rank()
data = (rank+1)**2
data = comm.gather(data, root=0) if rank == 0:
for i in range(size):
assert data[i] == (i+1)**2
else:
assert data is None
Fuente
https://pythonhosted.org/mpi4py/usrman/index.html
https://mpi4py.scipy.org/docs/usrman/tutorial.html
http://pythonhosted.org/mpi4py/
No hay comentarios:
Publicar un comentario