MPI 2 - Departamento de Computación

Anuncio
Sistemas Complejos en Máquinas Paralelas
MPI 2
Francisco Garcı́a Eijó
Departamento de Computación - FCEyN
UBA
24 de Septiembre del 2013
Clases de llamadas MPI
Inicializar, dirigir y finalizar comunicación (MPI Init,
MPI Finalice)
Comunicación punto a punto (MPI Send, MPI Recv)
Comunicación colectiva (MPI Bcast, MPI Scatter,
MPI Gather, MPI Reduce)
Creación de tipos de datos (MPI Type struct)
Non-blocking Send/Recv
MPI_Send (void *buf, int count, MPI Datatype dtype, int dest, int tag,
MPI_Comm comm, MPI_Request *request);
MPI_Recv (void *buf, int count, MPI_Datatype dtype, int source, int tag,
MPI_Comm comm, MPI_Request *request);
buf: localización en memoria de los datos
count: Número de datos del tipo indicado enviados o recibidos
dtype: tipo de datos enviados o recibidos
dest/source: procesador destino/fuente
tag: etiqueta de comunicación
comm: comunicador de envı́o o recepción
request: manejador utilizado para seguir el estado de la comunicación y
esperar para que se complete.
El usuario no puede sobrescribir el buffer de envı́o hasta
que se complete la operación.
Completando la operación No Bloqueante
MPI_Wait (request, status);
Retorna cuando la operación se completo.
MPI_Test (request, flag, status);
Similar a MPI\_Wait retorna inmmediatamente con flag true si la operacion
se completo.
Operación No Bloqueante - Ejemplo
i f (rank == 0) {
MPI_Irecv ( b ,100 ,MPI REAL,1 ,19 ,MPI COMM WORLD,& request ) ;
MPI_Send ( a ,100 ,MPI REAL,1 ,17 ,MPI COMMWORLD) ;
MPI_Wait ( &request ,& s tatus ) ;}
else if (rank == 1) {
MPI_Irecv ( b ,100 ,MPI REAL,0 ,17 ,MPI COMM WORLD,& request ) ;
MPI_Send ( a ,100 ,MPI REAL,0 ,19 ,MPI COMMWORLD) ;
MPI_Wait ( &request ,& status ) ;
}
Comunicación colectiva: Barrier
Una subrutina muy simple que permite bloquear los procesos hasta
que todos la llamen.
MPI_BARRIER (MPI_Comm comm);
Retorna cuando todos los miembros del comunicador la llamaron.
Comunicación colectiva: Broadcast
Envı́a un mensaje broadcast a todos los miembros de comm.
MPI_Bcast (void *buf, int count, MPI_Datatype dtype, int root, MPI_Comm comm);
buf: localización en memoria de los datos
count: Número de datos del tipo indicado enviados
dtype: tipo de datos enviados
root: procesador fuente
comm: comunicador de envı́o
Comunicación colectiva: Scatter
Un proceso raı́z divide un mensaje en partes iguales y los envı́a
individualmente al resto de procesos y a sı́ mismo.
Comunicación colectiva: Scatter
Un proceso raı́z divide un mensaje en partes iguales y los envı́a
individualmente al resto de procesos y a sı́ mismo.
int MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype,
void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
sendbuf: Dirección inicial del buffer de salida, solo útil para el proceso
raı́z, el resto de procesos ignoran este parámetro.
sendcount: Número de elementos que se envı́a a cada proceso del comunicador
(entero que sólo tiene sentido en el raı́z).
sendtype: Tipo de dato que se va a enviar, solo lo tendrá en cuenta la raı́z.
recvcount: Número de elementos que espera recibir cada proceso (int).
recvtype: Tipo de datos de los elementos a recibir (Como por ejemplo MPI_INT).
root: Rango (rank) del proceso raı́z (el que realizará el envı́o).
comm: Comunicador por el que realizar la comunicación.
Comunicación colectiva: Gather
Recoge una serie de datos de varios procesos en un único proceso
raı́z (operación en la cual interviene también el propio proceso
raı́z).
Comunicación colectiva: Gather
Recoge una serie de datos de varios procesos en un único proceso
raı́z (operación en la cual interviene también el propio proceso
raı́z).
int MPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
sendbuf: Dirección inicial del buffer de envı́o.
sendcount: Número de elementos que va a enviar cada proceso individualmente, en
general, el número de elementos del buffer de envı́o (int).
sendtype: Tipo de dato de cada elemento del buffer de envı́o.
recvcount: Número de elementos que se espera recibir de cada uno de los
procesos (solo el proceso raı́z tendrá este parámetro en cuenta) (int).
Nótese que este valor es igual que sendcount siempre y cuando los tipos de
envı́o y recepción sean los mismos.
recvtype: Tipo de dato que se espera recibir en el buffer de entrada
(útil únicamente para el proceso raı́z).
root: Rango del proceso raı́z (el proceso receptor) (int).
comm: Comunicador por el que se realiza la transferencia de datos.
Comunicación colectiva: Reduce
Reduce un valor de un grupo de procesos en un único proceso raı́z.
Comunicación colectiva: Reduce
Reduce un valor de un grupo de procesos en un único proceso raı́z.
int MPI_Reduce(void *sendbuf, void *recvbuf, int count,
MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm)
sendbuf: Dirección inicial del buffer en envı́o.
count: Número de elementos que se va a enviar del buffer de envı́o.
datatype: Tipo de datos de los elementos del buffer de envı́o.
op: Operación de reducción, constante definida por MPI.
(MPI_MAX, MPI_MIN, MPI_SUM, MPI_PROD, etc)
root: Rango del proceso raı́z, el proceso receptor (int).
comm: Comunicador por el que se realiza la comunicación.
Preguntas?
Descargar