Esquemas de comunicación

Anuncio
Esquemas de comunicación
tipos de comunicación
Maestro-esclavo o comunicación global
Esquema SPMD o comunicación local
Maestro-esclavo o comunicación
global
Consiste en la implementación de un componente
principal llamado maestro que se encarga de
recolectar la información procesada por cada
esclavo (componente secundario) y de distribuirla
en su totalidad a cada uno de ellos.
Permite el procesamiento en paralelo, pues cada
esclavo trabaja independientemente de los demás.
También, se le conoce como comunicación global,
porque la información se concentra en un
procesador (maestro).
Maestro-esclavo o comunicación
global
Esquema SPMD o comunicación local
Este esquema utiliza el modelo Single Program
Multiple Data (Programas Simples Múltiples Datos).
Se escribe únicamente un programa y todos los
procesadores ejecutarán el mismo programa.
Múltiples datos (MD) se refiere a que los datos se
dividen en pedazos, y se le asigna un pedazo a
cada procesador.
A diferencia de la comunicación global, al aplicarse
este esquema a las estrategias de particionamiento,
no existe un proceso maestro.
Esquema SPMD o comunicación local
La comunicación del procesador N es sólo
con sus vecinos más cercanos, es decir, con
el N - 1 y el N + 1 si no es el procesador 0 o
el último.
Si es el procesador 0 éste sólo se comunica
con el procesador 1 y el último procesador
sólo se comunica con el anterior.
Esquema SPMD o comunicación local
Una de las características principales para la
aplicación eficientemente del paralelismo es
que no deben existir dependencias de datos
entre los procesadores, de lo contrario se
tendría que usar sincronización para que la
evaluación del problema sea correcto.
Por lo tanto, se requiere tener una buena
orquestación del problema a paralelizar.
Alcances de las comunicaciones
Punto a punto
Involucra dos tareas, donde una tarea actúa como el
transmisor/productor de datos y el otro actúa como el
recibidor/consumidor.
Colectiva
Involucra compartir datos entre más de dos tareas, las
cuales se especifican como miembros de un grupo común
o colectivo.
Broadcast
Scatter
Gather
Reduction
Etc.
MPI_Bcast (Broadcast)
Difunde un mensaje desde el proceso root a todos
los otros procesos en el grupo (incluyendo root).
Sintaxis:
#include <mpi.h>
int MPI_Bcast(void *buffer, int count, MPI_Datatype
datatype, int root, MPI_Comm comm)
Parámetros
buffer : Dirección de inicio del buffer.
Count: Numero de entradas en el buffer.
Datatype: Tipo de datos del buffer.
Root: Rank of broadcast root (integer).
Comm: Comunicador.
Ejemplo
Broadcast 100 enteros desde el proceso 0 a
cada proceso en el grupo.
MPI_Comm comm;
int array[100];
int root=0;
...
MPI_Bcast( array, 100, MPI_INT, root, comm);
MPI_Gather
Reúne los valores desde un grupo de procesos.
Sintaxis:
#include <mpi.h>
int MPI_Gather(const void *sendbuf, int sendcount,
MPI_Datatype sendtype, void *recvbuf, int recvcount,
MPI_Datatype recvtype, int root, MPI_Comm comm)
Parámetros
Sendbuf: Dirección de inicio del buffer a enviar.
Sendcount: Numero de elementos en el buffer de envío.
Sendtype: Tipo de datos del buffer de elementos de envío.
Recvcount: Numero de elementos para el recibo.
Recvtype: Tipo de datos del buffer de elementos.
Root: Rank del proceso que recibe.
Comm: Comunicador.
Ejemplo
Reúne 100 enteros desde cada proceso en el grupo al raíz.
MPI_Comm comm;
int gsize,sendarray[100];
int root, *rbuf;
...
MPI_Comm_size( comm, &gsize);
rbuf = (int *)malloc(gsize*100*sizeof(int));
MPI_Gather( sendarray, 100, MPI_INT, rbuf, 100, MPI_INT, root,
comm);
MPI_Scatter
Envía datos desde una tarea a todas las tareas en un grupo.
Sintaxis:
#include <mpi.h>
int MPI_Scatter(const void *sendbuf, int sendcount,
MPI_Datatype sendtype, void *recvbuf, int recvcount,
MPI_Datatype recvtype, int root, MPI_Comm comm)
Parámetros
sendbuf : Dirección del buffer de envío.
Sendcount : Numero de elementos de envío a cada proceso.
sendtype : Tipo de datos del buffer de elementos de envío.
recvcount : Numero de elementos del buffer de recibo.
recvtype : Tipo de datos del buffer de recibo.
root : Rank del proceso de envío.
Comm : Comunicador.
Ejemplo
Lo contrario del ejemplo de MPI_Gather. Dispersión
de conjuntos de 100 enteros desde la raíz a cada
proceso en el grupo.
MPI_Comm comm;
int gsize,*sendbuf;
int root, rbuf[100];
...
MPI_Comm_size(comm, &gsize);
sendbuf = (int *)malloc(gsize*100*sizeof(int));
...
MPI_Scatter(sendbuf, 100, MPI_INT, rbuf, 100,
MPI_INT, root, comm);
MPI_Reduce
Reduce los valores de todos los procesos dentro de un grupo.
Sintaxis:
#include <mpi.h>
int MPI_Reduce(const void *sendbuf, void *recvbuf, int count,
MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm)
Parámetros
sendbuf : Dirección del buffer de envio.
count : Numero de elementos en el buffer de envío.
Datatype : Tipo de dato de los elementos del buffer de envio.
op : Operación de reducción.
root : Rank del proceso raíz.
comm : Comunicador.
Operaciones
MPI_MAX máximo
MPI_MIN mínimo
MPI_SUM suma
MPI_PROD producto
MPI_LAND and lógico
MPI_LOR or lógico
MPI_LXOR xor lógico
Programas paralelos
Problema:
Problema: producto de matrices
Referencias
http://www.open-mpi.org/doc/v1.8/
http://wwwusers.cs.umn.edu/~karypis/parbook/
https://computing.llnl.gov/tutorials/parallel_co
mp/#Designing
https://computing.llnl.gov/tutorials/parallel_co
mp/
Descargar