Metodología de la Programación Paralela
2015-2016
Facultad Informática, Universidad de Murcia
Programación por Paso de
Mensajes - MPI
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
1 / 40
Contenido
1 Nociones generales de MPI
2 Comunicaciones
3 Ejemplo: integral definida
4 Comunicaciones colectivas
5 Tipos derivados
6 Empaquetamiento
7 Comunicadores
8 Topologías
9
... y más
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
2 / 40
Contenido
1 Nociones generales de MPI
2 Comunicaciones
3 Ejemplo: integral definida
4 Comunicaciones colectivas
5 Tipos derivados
6 Empaquetamiento
7 Comunicadores
8 Topologías
9
... y más
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
3 / 40
¿Qué es MPI?
Previamente PVM: Parallel Virtual Machine (aprox. 1993).
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 del MPI Forum. Participantes de unas 40
organizaciones.
Acabado y publicado en mayo 1994. Actualizado en junio 1995.
Versiones y variantes: MPI2, HMPI, FT-MPI...
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
4 / 40
¿Qué ofrece MPI?
Estandarización.
Portabilidad: multiprocesadores de memoria compartida,
multicomputadores de paso de mensajes, clusters, sistemas
heterogéneos, ...
Buenas prestaciones si está disponible para el sistema con una
implementación eficiente.
Amplia funcionalidad. Del orden de 140 funciones para las
operaciones más comunes de paso de mensajes.
Implementaciones de empresas y libres (mpich, lam/mpi, OpenMPI...)
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
5 / 40
Ejemplo básico: 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);
if (name != 0) {
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,MPI_COMM_WORLD);
} else {
printf("processor 0, p = %d ",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();
}
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
6 / 40
Compilación y Ejecución
Depende de la versión de MPI instalada en el sistema.
En el cluster del laboratorio de CCPP la versión instalada cambia de vez
en cuando (ahora está la OpenMPI), pero los programas deben funcionar
en las distintas versiones, y la única diferencia está en cómo lanzarlos a
ejecución.
Compilación:
mpicc programa.c
Y las opciones de C que se considere.
Si se usa el compilador de Intel puede ser mpiicc, y el de C++ con
mpic++.
Ejecución:
mpirun -np numpro -machinefile fichmaq programa
pone en marcha numpro procesos con el mismo código.
Por defecto se ponen en marcha en el nodo donde se está
ejecutando.
Con la opción -machinefile fichmaq se indica los nodos donde
asignar los procesos dentro del cluster donde se está trabajando.
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
7 / 40
Funciones básicas
Incluir librería con 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 es el mundo de todos los procesos MPI.
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 ( )
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
8 / 40
Contenido
1 Nociones generales de MPI
2 Comunicaciones
3 Ejemplo: integral definida
4 Comunicaciones colectivas
5 Tipos derivados
6 Empaquetamiento
7 Comunicadores
8 Topologías
9
... y más
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
9 / 40
Mensajes en comunicaciones
Un MENSAJE está 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 char
unsigned short int
unsigned int
unsigned long int
float
double
long double
Derivados: los construye el programador.
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
10 / 40
Punto a punto
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)
Para valores generales MPI ANY TAG, MPI ANY SOURCE
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
11 / 40
Comunicación Síncrona
Envío:
Es no bloqueante.
Ready: MPI Rsend
Acaba independiente de que acabe la recepción.
Síncrono: MPI Ssend
Acaba cuando la recepción empieza.
Estándar: MPI Send
Ready o síncrono.
Con buffer: MPI Bsend
Copia mensaje en buffer y lo manda.
Recepción: MPI Recv
Acaba cuando se ha recibido un mensaje: es bloqueante.
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
12 / 40
Comunicación Asíncrona
Envío:
MPI Isend(buf, count, datatype, dest, tag, comm,
request)
Recepción:
MPI Irecv(buf, count, datatype, source, tag, comm,
request)
request se usa 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.
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
13 / 40
Contenido
1 Nociones generales de MPI
2 Comunicaciones
3 Ejemplo: integral definida
4 Comunicaciones colectivas
5 Tipos derivados
6 Empaquetamiento
7 Comunicadores
8 Topologías
9
... y más
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
14 / 40
Condiciones de ejecución
p procesos
se divide el intervalo [a, b] en n subintervalos
cada proceso debe saber:
número total de procesos (MPI Comm size)
identificador de proceso (MPI Comm rank)
intervalo de integración
número de subintervalos
I/0 por el proceso 0
lee datos
los envía al resto de procesos
recibe resultados parciales de los procesos
combina los resultados y produce la salida
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
15 / 40
Código principal
main(int argc,char **argv) {
int my_rank , p , n , local_n , source , dest=0 , tag=50;
float a , b , h , local_a , local_b, integral , total;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
MPI_Comm_size(MPI_COMM_WORLD,&p);
Get_data(my_rank,p,&a,&b,&n);
h=(b-a)/n ; local_n=n/p;
local_a=a+my_rank*local_n*h ; local_b=local_a+local_n*h;
integral=Trap(local_a,local_b,local_n,h);
if(my_rank==0) {
total=integral;
for(source=1;source<p;source++) {
MPI_Recv(&integral,1,MPI_FLOAT,source,tag,MPI_COMM_WORLD,&status);
total+=integral;
};
printf("With n= %d trapezoides\n la estimacion",n);
printf("de la integral entre %f y %f\n es= %f \n",a,b,total);
} else {
MPI_Send(&integral,1,MPI_FLOAT,dest,tag,MPI_COMM_WORLD);
};
MPI_Finalize();
}
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
16 / 40
Funciones de cálculo de la integral
float f(float x)
{
float return_val;
...
return return_val;
}
float Trap(float local_a,float local_b,int local_n,float h)
{
float integral;
float x;
int i;
integral=(f(local_a)+f(local_b))/2.0;
x=local_a;
for(i=1;i<=local_n-1;i++)
{
x+=h;
integral+=f(x);
};
integral*=h;
return integral;
}
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
17 / 40
Envío de datos
void Get_data(int my_rank,int p,float *a_ptr,float *b_ptr,int *n_ptr) {
int source=0 , dest , tag;
MPI_Status status;
if(my_rank==0)
{
printf("Enter a, b, and n\n");
scanf("%f %f %d",a_ptr,b_ptr,n_ptr);
for(dest=1;dest<p;dest++) {
tag=30;
MPI_Send(a_ptr,1,MPI_FLOAT,dest,tag,MPI_COMM_WORLD);
tag=31;
MPI_Send(b_ptr,1,MPI_FLOAT,dest,tag,MPI_COMM_WORLD);
tag=32;
MPI_Send(n_ptr,1,MPI_INT,dest,tag,MPI_COMM_WORLD);
Coste envíos
3(p − 1)(ts + tw )
};
} else {
tag=30;
MPI_Recv(a_ptr,1,MPI_FLOAT,source,tag,MPI_COMM_WORLD,&status);
tag=31;
MPI_Recv(b_ptr,1,MPI_FLOAT,source,tag,MPI_COMM_WORLD,&status);
tag=32;
MPI_Recv(n_ptr,1,MPI_INT,source,tag,MPI_COMM_WORLD,&status);
};
}
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
18 / 40
Contenido
1 Nociones generales de MPI
2 Comunicaciones
3 Ejemplo: integral definida
4 Comunicaciones colectivas
5 Tipos derivados
6 Empaquetamiento
7 Comunicadores
8 Topologías
9
... y más
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
19 / 40
Funciones
MPI Barrier( )
bloquea los procesos hasta que la llaman todos
MPI Bcast( )
broadcast del proceso raíz a todos los demás
MPI Gather( )
recibe valores de un grupo de procesos
MPI Scatter( )
distribuye un buffer en partes a un grupo de procesos
MPI Alltoall( )
envía datos de todos los procesos a todos
MPI Reduce( )
combina valores de todos los procesos
MPI Reduce scatter( )
combina valores de todos los procesos y distribuye
MPI Scan( )
reducción prefija: valor acumulado de posiciones 0, . . . , i − 1 se pone en posición i
... y más
Domingo Giménez (Universidad de Murcia)
Curso 2015-2016
20 / 40
Operaciones en comunicaciones colectivas
MPI Operator Operation
maximum
MPI MAX
minimum
MPI MIN
sum
MPI SUM
product
MPI PROD
logical and
MPI LAND
bitwise and
MPI BAND
logical or
MPI LOR
bitwise or
MPI BOR
logical exclusive or
MPI LXOR
bitwise exclusive or
MP
Comentarios de: Programación por Paso de Mensajes - MPI - Metodología de la Programación Paralela (0)
No hay comentarios