MPI 1 - Departamento de Computación

Anuncio
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?
Descargar