Anda di halaman 1dari 31

INTRODUCCION A M(ESSAGE) P(ASSING) I(NTERFACE)

Paradigma de Transferencia de Mensajes


Cada procesador corre un programa
Todas las variables son privadas
La comunicacin se realiza a travs de subrutinas especiales
Trans-mensajes
Qu es MPI?
Es una implementacin de un estndar del modelo de paso de
mensajes

Atiende a una estructura SPMD (Single Program/Multiple Data)
Imgenes del programa en cada mquina
Datos locales a cada maquina
Todos los procesadores trabajan con el mismo programa, pero los datos
pueden ser diferentes.
Como asignar tareas diversas con datos diversos?


Los datos se comparten por medio del paso de mensajes

Consiste en una serie de libreras C


MPI (Message Passing Interface)
Una coleccin de rutinas adecuadas para facilitar la
comunicacin (intercambio de datos y sincronizacin de
tareas) entre distintos procesadores.
MPI : 1994 / MPI 2 : 1997
Existen bibliotecas para C y Fortran (C++ y F90).
Caractersticas:
Es estndar (por consenso, no por normativa)
Portable
Flexible (~ 125 rutinas) y expandible
Simple (con las 6 rutinas bsicas se puede hacer mucho!)
Qu es MPI?
Caractersticas de MPI
Principalmente dirigido a proveer portabilidad del cdigo fuente. No esta
totalmente alcanzado todava

Ofrece gran funcionalidad
Diferentes tipos de comunicaciones
Soporta gran cantidad de tipo de datos
Soporta datos definidos por el usuario

Manejo de diferentes topologas
MPI se escribi con algunos puntos un poco perdidos

En teora las aplicaciones MPI se pueden compilar con cualquier implementacin MPI
existente, pero es posible que el comportamiento sea ligeramente diferente

Necesidad de recursos que no estn garantizados por la implementacin 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 envo de datos es tipo
buffer

Suponer sincronizacin de barrera para llamadas colectivas. En
MPI, la comunicacin colectiva es bloqueante, pero el programa
no debe depender del tipo de sincronizacin (en este caso
barrera)

Ambigedades en la comunicacin. 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 programacin estndar de paso de mensajes
(MPI)
LAM proporciona al usuario una librera API para el paso
de mensajes entre diferentes nodos que colaboran para
la realizacin de una aplicacin paralela
Funciona en una gran cantidad de plataformas UNIX y
permite trabajar con diferentes tipos de maquinas
mezclados
Las diferentes mquinas pueden conectarse a travs de
una red de rea local o a travs de Internet

Caractersticas:
Completa implementacin del estndar 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 libreras adicionales MPI para la programacin LAM
Local Area Multiprocesor (LAM)
MPICH y MPICH2
MPICH2 es una implementacin (bastante) portable de alta
performance del standart MPI (-1 y -2)
Principales logros:
1) provee una implementacin 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 fcil de utilizar en otros entornos derivados lo que permite
ampliar sus capacidades enormemente. Por ejemplo crear nuestra
librera, 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?
En FORTRAN ser va el llamado a subrutinas:
call MPI_ROUTINE (ARGUMENTOS, IERROR)

En C el uso ser de la forma:
MPI_Xxxxxx(argumentos)
El primer paso ser invocar a la biblioteca
adecuada (C: mpi.h, F: mpif.h)
p.e.: #include mpi.h
Todo programa MPI tiene que ser inicializado y finalizado
(para liberar correctamente los recursos).
Versin Fortran
PROGRAM simple
include mpif.h
integer errcode
! Inicializar MPI
call MPI_INIT (errcode)
! Parte Principal del Prog...
! Terminar MPI
call MPI_FINALIZE (errcode)
end
Versin C
#include mpi.h
/* Headers */
main(int argc, char **argv)
{
/* Inicializar MPI */
MPI_Init (&argc, &argv);
/* Parte principal del Prog..... */
/* Terminar MPI */
MPI_Finalize ();
exit (0);
}
Un programa MPI: el esquema bsico
Prog.Basico
Como funciona MPI?
Los siguientes pasos son definir un comunicador, indicar el
nmero total de procesadores en el sistema y el rango de cada
uno dentro del conjunto.
El comunicador tpico es MPI_COMM_WORLD (definido
en mpi.h/mpif.h): son todos los nodos requeridos al sistema.
(Pueden definirse otros comunicadores si es necesario)
Comunicador
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 aade 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
Inicializar, dirigir y finalizar comunicacin
Iniciar y finalizar comunicacin
Identificar nmero de procesos, qu proceso corre en cada
procesador y crear subgrupos de procesadores
MPI_Init, MPI_Finalice
Comunicacin punto a punto
MPI_Send, MPI_Recv
Comunicacin colectiva
MPI_Bcast, MPI_Scatter, MPI_Gather, MPI_Reduce
Creacin de tipos de datos
MPI_Type_struct
Clases de llamadas MPI
Un procesador enva y otro recibe
Comunicacin elemental en MPI
Dos modos de comunicacin
Bloqueante: La rutina de enviar o recibir no termina hasta que la operacin se ha
completado. Asegura que los datos llegan al receptor sin error.
No bloqueante: La funcin enva o recibe inmediatamente. El procesador puede
hacer otras tareas durante el envo
Cuatro procedimientos para transmitir mensajes
standard no hay garanta 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 recepcin

Los recv son mas sencillos: Se completan cuando el data esta listo para usarse
Comunicacin 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: localizacin en memoria de los datos
count: Nmero de datos del tipo indicado enviados o recibidos
dtype: tipo de datos enviados o recibidos
dest/source: procesador destino/fuente
tag: etiqueta de comunicacin
comm: comunicador de envo o recepcin
status: cdigo de retorno de la operacin de recepcin
Comunicacin punto a punto
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
Cdigo fuente ms fcil de leer
Simplifica depuracin y mantenimiento
Normalmente, la rutina colectiva es ms rpida
Est ms optimizada que su equivalente expresada por medio
de rutinas punto a punto
Comunicacin colectiva
Operacin broadcast: Un nico proceso enva 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: localizacin en memoria de los datos
count: Nmero de datos del tipo indicado enviados
dtype: tipo de datos enviados
root: procesador fuente
comm: comunicador de envo
Comunicacin colectiva
Operacin reduction: Un nico proceso recoge datos de todos los
procesos de un grupo y los combina segn una operacin
aritmtica

MPI_Reduce (void *sendbuf, void *recvbuf, int count,
MPI_Datatype dtype, MPI_Op op, int root, MPI_Comm com);

sendbuf: localizacin en memoria de los datos
recvbuf: buffer donde se combinan los datos recibidos
count: nmero de datos del tipo indicado recibidos
dtype: tipo de datos recibidos
op: operacin aritmtica que se aplica a los datos recibidos
root: procesador destino
com: comunicador de recepcin
Comunicacin colectiva
Operacin scatter: Los datos de un procesador se
dividen en N bloques (N n de procesos), y se envan a
cada proceso segn orden de rank

MPI_Scatter (void *sendbuf, int sendcount, MPI_Datatype
sendtype, void *recvbuf, int recvcount, MPI_Datatype
recvtype, int root, MPI_Comm comm);
Operacin gather: Paso inverso, se agrupan los datos
de todos los procesos y se envan a uno solo

MPI_Gather (void *sendbuf, int sendcount, MPI_Datatype
sendtype, void *recvbuf, int recvcount, MPI_Datatype
recvtype, int root, MPI_Comm comm);
Comunicacin colectiva
Hola Mundo en C con MPI
#include mpi.h
#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);
}
Hola Mundo C
#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
DEFINES
Barrier: MPI_Barrier(MPI_COMM_WORLD);
#ifdef CONMPI
if(rank==cero) {
end=MPI_Wtime();
#else
end=clock();
#endif

FINALIZE
#ifdef CONMPI
MPI_Finalize();
#endif
Mido tiempos, imprimo en rank cero, libero memoria en rank cero y finalizo
Mediciones de eficiencia y escalabilidad
Speed Up
Tiempo Paralelo/(Tiempo Serie)
terico: recta!

Eficiencia
P*Tiempo Paralelo/(Tiempo Serial)
terico: 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

Anda mungkin juga menyukai