sábado, 16 de abril de 2016

Practica 8

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/