INTRODUCCION A M(ESSAGE) P(ASSING) I(NTERFACE)
Trans-mensajes
Paradigma de Transferencia de Mensajes
Cada procesador corre un programa
Todas las variables son privadas
La comunicación se realiza a través de subrutinas especiales
¿Qué es MPI?
 Es una implementación de un estándar del modelo de paso de
mensajes
 Atiende a una estructura SPMD (Single Program/Multiple Data)
 Imágenes del programa en cada máquina
 Datos locales a cada maquina
 Todos los procesadores trabajan con el mismo programa,
pueden ser diferentes.
 Como asignar tareas diversas con datos diversos?
pero los datos
 Los datos se comparten por medio del paso de mensajes
 Consiste en una serie de librerías C
¿Qué es MPI?
MPI (Message Passing Interface)
 Una colección de rutinas adecuadas para facilitar la
comunicación (intercambio de datos y sincronización de
tareas) entre distintos procesadores.
MPI : 1994 / MPI 2 : 1997
Existen bibliotecas para C y Fortran (C++ y F90).
Características:
 Es estándar (por consenso, no por normativa)
 Portable
 Flexible (~ 125 rutinas) y expandible
 Simple (con las 6 rutinas básicas se puede hacer mucho!)
Características de MPI
 Principalmente dirigido a proveer portabilidad del código fuente. No esta
totalmente alcanzado todavía
 Ofrece gran funcionalidad
 Diferentes tipos de comunicaciones
 Soporta gran cantidad de tipo de datos
 Soporta datos definidos por el usuario
 Manejo de diferentes topologías
 MPI se escribió con algunos puntos un poco perdidos
 En teoría las aplicaciones MPI se pueden compilar con cualquier implementación MPI
existente, pero es posible que el comportamiento sea ligeramente diferente
 Necesidad de recursos que no estén garantizados por la implementación MPI
 NO ES PORTABLE TOTALMENTE
Portabilidad de los programas
 Aspectos a considerar debido a la variedad de
implementaciones MPI
 Suponer buffering. No asumir que el envío de datos es tipo
buffer
 Suponer sincronización de barrera para llamadas colectivas. En
MPI, la comunicación colectiva es bloqueante, pero el programa
no debe depender del tipo de sincronización (en este caso
barrera)
 Ambigüedades en la comunicación. Los mensajes enviados son
los que se espera recibir
Local Area Multiprocesor (LAM)
 Entorno y sistema de desarrollo para procesamiento en
paralelo que trabaja sobre redes formadas por
procesadores independientes
 Utiliza programación estándar de paso de mensajes
(MPI)
 LAM proporciona al usuario una librería API para el paso
de mensajes entre diferentes nodos que colaboran para
la realización de una aplicación paralela
 Funciona en una gran cantidad de plataformas UNIX y
permite trabajar con diferentes tipos de maquinas
mezclados
Local Area Multiprocesor (LAM)
 Las diferentes máquinas pueden conectarse a través de
una red de área local o a través de Internet
 Características:
 Completa implementación del estándar MPI
 Existen diversas herramientas de desarrollo
 Posibilidad de mezclar diferentes tipos de maquinas en una
misma red
 Es posible activar o desactivar nodos dentro de la red
 Si un nodo cae se detecta y es posible recuperarlo cuando
vuelva a funcionar
 Existen librerías adicionales MPI para la programación LAM
MPICH y MPICH2
MPICH2 es una implementación (bastante) portable de alta
performance del standart MPI (-1 y -2)
Principales logros:
1) provee una implementación MPI soportada en una gran variedad
de plataformas HETEROGENEAS. Con gran variedad de redes
(10Gigabits, Infiniband, Myrinet, Quadrics ) y tiene algunas cosas
interesantes para su mejor funcionamiento en sistemas propietarios
como BlueGene, Cray, etc
2) Es fácil de utilizar en otros entornos derivados lo que permite
ampliar sus capacidades enormemente. Por ejemplo crear nuestra
librería, o Petsc, o scalapack
Como funcionan?
 Se debe compilar con las librerias adecuadas.
mpicc -o s.exe sistema.c -lm
 Se debe ejecutar con las instrucciones adecuadas. En
general en maquinas grandes, ese problema no es
nuestro problema
source /opt/Modules/3.2.6/init/bash
module add mvapich2
Mpirun/mpiexec --comm=pmi -np $NP S.exe
Como funciona MPI?
El primer paso será invocar a la biblioteca
adecuada (C: mpi.h, F: mpif.h)
p.e.: #include “mpi.h”
En FORTRAN será vía el llamado a subrutinas:
call MPI_ROUTINE (ARGUMENTOS, IERROR)
En C el uso será de la forma:
MPI_Xxxxxx(argumentos)
Todo programa MPI tiene que ser inicializado y finalizado
(para liberar correctamente los recursos).
Un programa MPI: el esquema básico
Versión C
Prog.Basico
#include “mpi.h”
Versión Fortran
/* Headers */
PROGRAM simple
main(int argc, char **argv)
include ’mpif.h’
{
integer errcode
/* Inicializar MPI */
! Inicializar MPI
MPI_Init (&argc, &argv);
call MPI_INIT (errcode)
/* Parte principal del Prog..... */
! Parte Principal del Prog...
/* Terminar MPI */
! Terminar MPI
MPI_Finalize ();
call MPI_FINALIZE (errcode)
exit (0);
end
}
Como funciona MPI?
Los siguientes pasos son definir un comunicador, indicar el
número total de procesadores en el sistema y el rango de cada
uno dentro del conjunto.
El comunicador típico es MPI_COMM_WORLD (definido
en mpi.h/mpif.h): son todos los nodos requeridos al sistema.
Comunicador
(Pueden definirse otros comunicadores si es necesario)
Comunicadores
 A cada proceso se le asigna un numero (rank)
consecutivo empezando desde 0
 Un mismo procesador puede pertenecer a varios
comunicadores diferentes, y su ‘rank’ sera diferente en
cada uno de ellos
 MPI_COMM_WORLD es un comunicador que engloba a
todos los procesos
 Los mensajes se marcan con una etiqueta o tag que
sirve para distinguir entre diferentes tipos
Comunicadores
 Para recibir un mensaje no siempre es necesario
especificar el ‘rank’ de la fuente aunque si lo es para
enviarlo
 ‘context’ sirve para evitar conflictos entre el codigo de
diferentes programadores. Se añade automaticamente
 MPI_COMM_SELF es un comunicador que solo engloba a
un solo miembro
 MPI_COMM_PARENT engloba los grupos de un proceso y
de su proceso padre
Clases de llamadas MPI
 Inicializar, dirigir y finalizar comunicación
 Iniciar y finalizar comunicación
 Identificar número de procesos, qué proceso corre en cada
procesador y crear subgrupos de procesadores
 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
Comunicación punto a punto
 Un procesador envía y otro recibe
 Comunicación elemental en MPI
 Dos modos de comunicación
 Bloqueante: La rutina de enviar o recibir no termina hasta que la operación se ha
completado. Asegura que los datos llegan al receptor sin error.
 No bloqueante: La función envía o recibe inmediatamente. El procesador puede
hacer otras tareas durante el envío
 Cuatro procedimientos para transmitir mensajes
 standard – no hay garantía de que el recv se inicio
 synchronous – se completa cuando el recv comenzó.
 buffered – Se completa cuando el dato se copio al buffer local. (No implica que
se recibió bien)
 ready – El usuario dice cuando se completo la recepción
Los recv son mas sencillos: Se completan cuando el data esta listo para usarse
Comunicación punto a punto
MPI_Send (void *buf, int count, MPI Datatype dtype, int dest,
int tag, MPI_Comm comm);
MPI_Recv (void *buf, int count, MPI_Datatype dtype, int source,
int tag, MPI_Comm comm, MPI_status *status);







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
status: código de retorno de la operación de recepción
Comunicación colectiva
 Comunicaciones de un procesador a varios y de varios
procesadores a uno
 Se reduce la posibilidad de error
 Una llamada a una rutina colectiva reemplaza a varias
llamadas a rutinas punto a punto
 Código fuente más fácil de leer
 Simplifica depuración y mantenimiento
 Normalmente, la rutina colectiva es más rápida
 Está más optimizada que su equivalente expresada por medio
de rutinas punto a punto
Comunicación colectiva
 Operación broadcast: Un único proceso envía copia de
los mismos datos a todos los procesos de un grupo
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
 Operación reduction: Un único proceso recoge datos de todos los
procesos de un grupo y los combina según una operación
aritmética
MPI_Reduce (void *sendbuf, void *recvbuf, int count,
MPI_Datatype dtype, MPI_Op op, int root, MPI_Comm com);







sendbuf: localización en memoria de los datos
recvbuf: buffer donde se combinan los datos recibidos
count: número de datos del tipo indicado recibidos
dtype: tipo de datos recibidos
op: operación aritmética que se aplica a los datos recibidos
root: procesador destino
com: comunicador de recepción
Comunicación colectiva
 Operación scatter: Los datos de un procesador se
dividen en N bloques (N nº de procesos), y se envían a
cada proceso según orden de rank
MPI_Scatter (void *sendbuf, int sendcount, MPI_Datatype
sendtype, void *recvbuf, int recvcount, MPI_Datatype
recvtype, int root, MPI_Comm comm);
 Operación gather: Paso inverso, se agrupan los datos
de todos los procesos y se envían a uno solo
MPI_Gather (void *sendbuf, int sendcount, MPI_Datatype
sendtype, void *recvbuf, int recvcount, MPI_Datatype
recvtype, int root, MPI_Comm comm);
“Hola Mundo” en C con MPI
#include “mpi.h”
Hola Mundo C
#include <stdio.h>
int main(int argc, char **argv)
{ int rank, size;
MPI_Init (&argc, &argv);
MPI_Comm_rank (MPI_COMM_WORLD, &rank);
MPI_Comm_size (MPI_COMM_WORLD, &size);
printf( “Hola Mundo! Soy el proceso %d de %d\n”, rank,size);
MPI_Finalize ();
exit (0);
}
DEFINES
#define CONMPI
#ifdef CONMPI
#include "mpi.h"
#endif
main(int argc, char *argv[])
{
int nprocs=1,rank=0;
#ifdef CONMPI
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&nprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
// printf("proceso %i de %i \n",rank,nprocs);
#endif
DEFINES
#ifdef CONMPI
//Broadcasteo la info
MPI_Bcast(&k,uno, MPI_DOUBLE,cero,MPI_COMM_WORLD);
MPI_Bcast(&v,uno, MPI_DOUBLE,cero, MPI_COMM_WORLD);
.
.
.
#endif
DEFINES
#ifdef CONMPI
if(rank==cero) {
Temptot=(double*)malloc(sizeof(double)*nprocs*Neq);
curtot=(double*)malloc(sizeof(double)*nprocs*Neq);
#endif
/*Abro archivos donde guardo los datos (en p=cero)*/
fp1=fopen("Mag.dat","a+");
fp2=fopen("Prom.dat","a+");
#ifdef CONMPI
}
#endif
DEFINES
#ifdef CONMPI
if(rank==cero) {
start=MPI_Wtime();
#else
start=clock();
#endif
#ifdef CONMPI
}
#endif
Barrier: MPI_Barrier(MPI_COMM_WORLD);
Mido tiempos, imprimo en rank cero, libero memoria en rank cero y finalizo
#ifdef CONMPI
if(rank==cero) {
end=MPI_Wtime();
#else
end=clock();
#endif
FINALIZE
#ifdef CONMPI
MPI_Finalize();
#endif
Mediciones de eficiencia y escalabilidad
 Speed Up
Tiempo Paralelo/(Tiempo Serie)
teórico: recta!
Eficiencia
P*Tiempo Paralelo/(Tiempo Serial)
teórico: Unidad
Mediciones
Referencias
 Bibliografia en la pagina de la materia
 The MPI Forum, http://www.mpi-forum.org.
 http://www-unix.mcs.anl.gov/mpi/www/www3
Descargar

mpi - Bienvenido al sitio Web del Departamento de