Sistemas Complejos en Máquinas Paralelas Clase 2: MPI 1 Francisco Garcı́a Eijó Departamento de Computación - FCEyN UBA 10 de Septiembre del 2013 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 MPI es una implementación de un estándar del modelo de paso de mensajes. MPI permite descomponer problemas en problemas más pequeños y realizar comunicaciones entre diferentes máquinas, utilizando lo que se conoce como Programación distribuida. Conjunto de librerı́as de funciones que pueden ser utilizadas en diferentes lenguajes (C, C++, Fortran) Cuando utilizar MPI Necesidad de crear aplicaciones que requieren una gran potencia de calculo. Abordar problemas inabordables con un solo procesador. Esquema Básico #include "mpi.h" /* HEADERS */ main(int argc, char* argv[]) { /* INICIALIZAR MPI */ MPI_Init(&argc, &argv); /* PARTE PRINCIPAL */ /* FINALIZACION MPI */ MPI_Finalize(); } Biblioteca El primer paso será invocar a la biblioteca adecuada (C: mpi.h, F: mpif.h) En Fortran el uso será vı́a el llamado a subrutinas. call MPI ROUTINE(Argumentos, IERROR) En C el uso será de la forma: MPI XXXXX(argumentos) Comunicadores 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) qje agrupa todos los procesos activos durante la ejecución de una aplicación. Comunicadores A cada proceso se le asigna un número (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. Clases de llamadas MPI Inicializar, dirigir y finalizar comunicación (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) Tipos MPI MPI CHAR MPI SHORT MPI INT MPI LONG MPI UNSIGNED CHAR MPI UNSIGNED SHORT MPI UNSIGNED INT MPI UNSIGNED LONG MPI FLOAT MPI DOUBLE 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. Creación de tipos de datos (MPI Type struct) 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 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. Normalmente, la rutina colectiva es más rápida ya que está más optimizada. Comunicación colectiva 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 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); } Preguntas?