Publicado el 22 de Diciembre del 2020
658 visualizaciones desde el 22 de Diciembre del 2020
2,1 MB
56 paginas
Creado hace 15a (17/03/2010)
Curso de Computación Científica en Clusters
Curso de Computación Científica en Clusters
Programación de Plataformas Paralelas II:
Programación de Plataformas Paralelas II:
MPIMPI
Javier Cuenca
Universidad de Murcia
Introducción
Introducción
Previamente PVM: Parallel Virtual Machine
MPI: Message Passing Interface
Una especificación para paso de mensajes
La primera librería de paso de mensajes estándar y portable
Por consenso MPI Forum. Participantes de unas 40 organizaciones
Acabado y publicado en mayo 1994. Actualizado en junio 1995
MPI2, HeteroMPI, FT-MPI
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
22
Introducción.
Introducción.
¿Qué ofrece?
¿Qué ofrece?
Estandarización
Portabilidad: multiprocesadores, multicomputadores, redes, heterogéneos, ...
Buenas prestaciones, ..., si están disponibles para el sistema
Amplia funcionalidad
Implementaciones libres (mpich, lam, ...)
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
33
Introducción.
Introducción.
Procesos
Procesos
Programa MPI: conjunto de procesos autónomos
Cada proceso puede ejecutar codigo diferente
Procesos comunican vía primitivas MPI
Proceso: secuencial o multithreads
MPI no proveé mecanismos para situar procesos en procesadores. Eso es misión de
cada implementación en cada plataforma
MPI 2.0:
Es posible la creación/borrado de procesos dinámicamente durante ejecución
Es posible el acceso a memoria remota
Es posible la entrada/salida paralela
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
44
Introducción.
Introducción.
Ejemplo: hello.c
Ejemplo: hello.c
#include <stdio.h>
#include <string.h>
#include "mpi.h"
main(int argc, char*argv[]) {
int name, p, source, dest, tag = 0;
char message[100];
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&name)
;
MPI_Comm_size(MPI_COMM_WORLD,&p);
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
55
Introducción.
Introducción.
Ejemplo: hello.c
Ejemplo: hello.c
#include <stdio.h>
if (name != 0)
#include <string.h>
{
#include "mpi.h"
main(int argc, char*argv[]) {
printf("Processor %d of %d\n",name, p);
sprintf(message,"greetings from process %d!", name);
dest = 0;
MPI_Send(message, strlen(message)+1, MPI_CHAR, dest, tag,
int name, p, source, dest, tag = 0;
char message[100];
MPI_Status status;
MPI_COMM_WORLD);
}
else
{
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&name)
;
MPI_Comm_size(MPI_COMM_WORLD,&p);
printf("processor 0, p = %d \n",p);
for(source=1; source < p; source++)
{
MPI_Recv(message,100, MPI_CHAR, source, tag, MPI_COMM_WORLD,
&status);
printf("%s\n",message);
}
}
MPI_Finalize();
}
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
66
Introducción.
Introducción.
Ejemplo de uso
Ejemplo de uso
Compilación
mpicc -o ejemplo ejemplo.c -lm -lmpi
Ejecución
mpirun –np 4 ejemplo
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
77
Introducción.
Introducción.
Ejemplo de uso
Ejemplo de uso
Fichero cabecera:
#include <mpi.h>
Formato de las funciones:
error=MPI_nombre(parámetros ...)
Inicialización:
int MPI_Init ( int *argc , char **argv )
Comunicador: Conjunto de procesos en que se hacen comunicaciones
MPI_COMM_WORD , el mundo de los procesos MPI
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
88
Introducción.
Introducción.
Ejemplo de uso
Ejemplo de uso
Identificación de procesos:
MPI_Comm_rank ( MPI_Comm comm , int *rank)
Procesos en el comunicador:
MPI_Comm_size ( MPI_Comm comm , int *size)
Finalización:
int MPI_Finalize ( )
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
99
Introducción.
Introducción.
Ejemplo de uso
Ejemplo de uso
MENSAJE: Formado por un cierto número de elementos de un tipo MPI
Tipos MPI Básicos:
MPI_CHAR
MPI_SHORT
MPI_INT
MPI_LONG
MPI_UNSIGNED_CHAR
MPI_UNSIGNED_SHOT
MPI_UNSIGNED
MPI_UNSIGNED_LONG
MPI_FLOAT
MPI_DOUBLE
MPI_LONG_DOUBLE
MPI_BYTE
MPI_PACKED
signed char
signed short int
signed int
signed long int
unsigned
unsigned
unsigned int
unsigned
float
double
long double
char
short int
long int
Tipos MPI Derivados: los construye el programador
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
1010
Introducción.
Introducción.
Ejemplo de uso
Ejemplo de uso
Envío:
int MPI_Send ( void *buffer , int contador , MPI_Datatype
tipo , int destino , int tag , MPI_Comm comunicador )
Recepción:
int MPI_Recv ( void *buffer , int contador , MPI_Datatype
tipo , int origen , int tag , MPI_Comm comunicador ,
MPI_Status *estado)
MPI_ANY_TAG
MPI_ANY_SOURCE
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
1111
Tipos de comunicación
Tipos de comunicación
Envío:
Envío síncrono: MPI_Ssend
Acaba cuando la recepción empieza
Envío con buffer: MPI_Bsend
Acaba siempre, independiente del receptor
Envío estándar: MPI_Send
Síncrono o con buffer
Envío “ready”: MPI_Rsend
Acaba independiente de que acabe la recepción
Recepción: MPI_Recv
Acaba cuando se ha recibido un mensaje.
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
1212
Comunicación asíncrona (nonblocking)
Comunicación asíncrona (nonblocking)
MPI_Isend(buf, count, datatype, dest, tag, comm, request)
MPI_Irecv(buf, count, datatype, source, tag, comm, request)
Parámetro request para saber si la operación ha acabado
MPI_Wait( )
vuelve si la operación se ha completado. Espera hasta que se completa
MPI_Test( )
devuelve un flag diciendo si la operación se ha completado
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
1313
Comunicación asíncrona (nonblocking).
Comunicación asíncrona (nonblocking).
Ejemplo: hello_nonblocking.c (1/2)
Ejemplo: hello_nonblocking.c (1/2)
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&name);
MPI_Comm_size(MPI_COMM_WORLD,&p);
p_requests = (MPI_Request *) malloc ( p * sizeof(MPI_Request) );
if (name != 0)
{
sprintf(message,"greetings from process %d!",name);
dest = 0;
MPI_Isend(message, strlen(message)+1, MPI_CHAR, dest, tag,
MPI_COMM_WORLD, &request);
printf("Procesador %d ya ha hecho el ISEND al procesador
0\n",name);
/* …. Código por aquí enmedio …*/
MPI_Wait(&request,&status);
printf("Procesador
envio\n",name);
pasado
tras
%d
ya
ha
el
WAIT
}
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
1414
Comunicación asíncrona (nonblocking).
Comunicación asíncrona (nonblocking).
Ejemplo: hello_nonblocking.c (2/2)
Ejemplo: hello_nonblocking.c (2/2)
else
{
for(source=1; source < p; source++)
{
MPI_Irecv(messages[source],100,MPI_CHAR,MPI_ANY_SOURCE,tag,
MPI_COMM_WORLD, &p_requests[source]);
printf("Proc.
0 ya ha hecho IRECV para recibir de
source=%d\n\n",source);
}
/* …. Código por aquí enmedio …*/
for(source=1; source < p; source++)
{
MPI_Wait(&p_requests[source],&status);
printf("Tras el Wait del Receive: %s\n",messages[source]);
}
}
free(p_requests);
MPI_Finalize();
}
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
Comentarios de: Programación de Plataformas Paralelas II - Curso de Computación Científica en Clusters (0)
No hay comentarios