Trans-mensajes
Qu es MPI?
Es una implementacin de un estndar del modelo de paso de mensajes
Los datos se comparten por medio del paso de mensajes Consiste en una serie de libreras C
Caractersticas:
Es estndar (por consenso, no por normativa) Portable Flexible (~ 125 rutinas) y expandible Simple (con las 6 rutinas bsicas se puede hacer mucho!)
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
Ambigedades en la comunicacin. Los mensajes enviados son los que se espera recibir
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
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).
include mpif.h
integer errcode ! Inicializar MPI call MPI_INIT (errcode) ! Parte Principal del Prog... ! Terminar MPI call MPI_FINALIZE (errcode) end
MPI_Finalize ();
exit (0); }
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
Comunicacin colectiva
MPI_Bcast, MPI_Scatter, MPI_Gather, MPI_Reduce
Comunicacin 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
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);
#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
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
#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
Mediciones de eficiencia y escalabilidad Speed Up Tiempo Paralelo/(Tiempo Serie) terico: recta! Eficiencia P*Tiempo Paralelo/(Tiempo Serial) terico: Unidad
Mediciones