Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Contenido
Introducción ........................................................................................................................................ 3
MPI ...................................................................................................................................................... 4
Características ..................................................................................................................................... 4
Modelo de programación.................................................................................................................... 5
C / C ++ - Ejemplo....................................................................................................................... 6
Características de la programación con MPI ....................................................................................... 7
Funciones básicas de MPI ................................................................................................................... 7
Fichero cabecera ............................................................................................................................. 7
Formato de las funciones ................................................................................................................ 7
Inicialización .................................................................................................................................... 7
Comunicador ................................................................................................................................... 8
Identificación de procesos .............................................................................................................. 8
Procesos en el comunicador ........................................................................................................... 8
Finalización ...................................................................................................................................... 8
Mensajes ......................................................................................................................................... 8
Tipos MPI básicos ............................................................................................................................ 8
Tipos MPI derivados ........................................................................................................................ 9
Rutinas de tipo de datos derivados................................................................................................. 9
Contiguos..................................................................................................................................... 9
1
Cómputo De Alto Desempeño - MPI
2
Cómputo De Alto Desempeño - MPI
Introducción
Escribir aplicaciones paralelas para diferentes arquitecturas informáticas solía ser una tarea difícil
y tediosa. En esos momentos, muchas bibliotecas podían facilitar la creación de aplicaciones
paralelas, pero no había una forma estándar aceptada de hacerlo.
Durante este tiempo, la mayoría de las aplicaciones paralelas fueron en los dominios de la ciencia
y la investigación. El modelo más comúnmente adoptado por las bibliotecas era el mensaje que
pasaba el modelo, esto significa que una aplicación pasa mensajes entre procesos para realizar
una tarea. Este modelo funciona bastante bien en la práctica para aplicaciones paralelas, puesto
que la mayoría de las bibliotecas en este momento utilizaban el mismo modelo de paso de
mensajes con solo diferencias de características menores entre ellas, los autores de las bibliotecas
y otros se unieron en la conferencia de Supercomputing 1992 para definir una interfaz estándar
para realizar el paso de mensajes: la interfaz de paso de mensajes.
En 1994, se definió una interfaz y un estándar completos (MPI-1), teniendo en cuenta que MPI
es sólo una definición para una interfaz. sólo tomó otro año para que las implementaciones
completas de MPI estén disponibles. Después de que se crearon sus primeras implementaciones,
EL MPI fue ampliamente adoptado y sigue siendo el método de facto de escribir aplicaciones que
pasan mensajes.
3
Cómputo De Alto Desempeño - MPI
MPI
MPI (iniciales de Message Passing Interface)
MPI es una especificación para programación de paso de mensajes, que proporciona una librería
de funciones para C, C++ o Fortran que son empleadas en los programas para comunicar datos
entre procesos. Por sí mismo, NO es una biblioteca, sino la especificación de lo que debe ser una
biblioteca de este tipo.
✓ Práctico
✓ Portátil
✓ Eficiente
✓ Flexible
MPI es la primera librería de paso de mensajes estándar y portable, especificada por consenso
por el MPI Forum, con unas 40 organizaciones participantes, como modelo que permita
desarrollar programas que puedan ser migrados a diferentes computadores paralelos.
Las implementaciones reales de la biblioteca MPI difieren en qué versión y características del
estándar MPI que admiten. Los desarrolladores/usuarios tendrán que ser conscientes de esto.
Características
✓ Estandarización.
✓ Portabilidad: multiprocesadores, multicomputadores, redes, heterogéneos, ...
✓ Buenas prestaciones.
✓ Amplia funcionalidad.
✓ Existencia de implementaciones libres (mpich, LAM-MPI, ...)
4
Cómputo De Alto Desempeño - MPI
Modelo de programación
Originalmente, MPI fue diseñado para arquitecturas de memoria distribuida, que se estaban
volviendo cada vez más populares en ese momento (1980 - principios de 1990).
A medida que cambiaron las tendencias de la arquitectura, los SMP de memoria compartida se
combinaron en redes creando sistemas híbridos de memoria distribuida.
Los implementadores de MPI adaptaron sus bibliotecas para manejar ambos tipos de
arquitecturas de memoria subyacentes sin problemas. También adaptaron formas de manejar
diferentes interconexiones y protocolos.
o Memoria distribuida
o Memoria compartida
o Híbrido
5
Cómputo De Alto Desempeño - MPI
MPI está pensado principalmente para utilizar el modelo SPMD (single program multiple data).
Al arrancar una aplicación se lanzan en paralelo n copias del mismo programa(procesos), facilita
legibilidad y mantenimiento. Distinción del código a ejecutar porcada uno: mediante el id del
proceso.
C / C ++ - Ejemplo
#include <stdio.h>
#include <mpi.h>
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Finalize();
return 0;
}
6
Cómputo De Alto Desempeño - MPI
Los programas MPI deben ser obligatoriamente inicializados y finalizados en MPI (MPI_Init,
MPI_Finalize).
Los procesos en ejecución pueden saber cuántos procesos MPI forman parte de un grupo de
procesos -communicator en la terminología MPI- (MPI_Comm_size) y qué número de orden -
empezando por 0- tiene en ese grupo de procesos (MPI_Comm_rank).
Los mensajes punto a punto deben ser enviados explícitamente por el emisor y recibidos
explícitamente por el para lo cual pueden emplearse dos funciones básicas (MPI_Send y
MPI_Recv).
Fichero cabecera
#include <mpi.h>
Inicialización
int MPI_Init ( int *argc , char ***argv )
7
Cómputo De Alto Desempeño - MPI
Comunicador
Conjunto de procesos que se intercomunican. Por defecto podemos utilizar:
MPI_COMM_WORD
En cuyo caso el grupo de procesos es el conjunto de procesos lanzados conjuntamente para
resolver un problema
Identificación de procesos
MPI_Comm_rank ( MPI_Comm comm , int *rank)
Procesos en el comunicador
MPI_Comm_size ( MPI_Comm comm , int *size)
Finalización
int MPI_Finalize ( )
Mensajes
Un mensaje estará formado por un cierto número de elementos de un mismo tipo MPI.
8
Cómputo De Alto Desempeño - MPI
Los tipos de datos primitivos son contiguos. Los tipos de datos derivados le permiten especificar
datos no contiguos de manera conveniente y tratarlos como si fueran contiguos.
✓ Contiguo
✓ Vector
✓ Indexado
✓ Estructura
MPI_Type_contiguous
El constructor más simple. Produce un nuevo tipo de datos haciendo copias de conteo de un
tipo de datos existente.
MPI_Status stat ;
MPI_Datatype rowtype ; // variable requerida
9
Cómputo De Alto Desempeño - MPI
if (numtasks == SIZE) {
// la tarea 0 envía un elemento de tipo de fila a todas las tareas
if (rango == 0) {
para (i = 0; i <tareas numéricas; i ++)
MPI_Send (& a [i] [0], 1, tipo de fila, i, etiqueta, MPI_COMM_WORLD);
}
Vector
MPI_Type_vector
MPI_Type_hvector
10
Cómputo De Alto Desempeño - MPI
MPI_Status stat ;
MPI_Datatype columnntype ; // variable requerida
if (numtasks == SIZE) {
// la tarea 0 envía un elemento de tipo de columna a todas las tareas
if (rango == 0) {
para (i = 0; i <tareas numéricas; i ++)
MPI_Send (& a [0] [i], 1, columnntype, i, tag, MPI_COMM_WORLD);
}
11
Cómputo De Alto Desempeño - MPI
Indexado
MPI_Type_indexed
MPI_Type_hindexed
Se proporciona una matriz de desplazamientos del tipo de datos de entrada como el mapa para
el nuevo tipo de datos. MPI_Type_hindexed es idéntico a MPI_Type_indexed, excepto que las
compensaciones se especifican en bytes.
MPI_Status stat ;
MPI_Datatype indextype ; // variable requerida
if (rango == 0) {
12
Cómputo De Alto Desempeño - MPI
Estructura
MPI_Type_struct
El nuevo tipo de datos se forma de acuerdo con un mapa completamente definido de los tipos
de datos componentes.
NOTA: Esta función está en desuso en MPI-2.0 y se reemplaza por MPI_Type_create_struct en
MPI-3.0
MPI_Type_struct (count, blocklens [], offsets [], old_types & newtype)
MPI_TYPE_STRUCT (count, blocklens (), offsets (), old_types, newtype, ierr)
typedef struct {
flotador x, y, z;
velocidad de flotación;
int n, tipo;
} Partícula;
Partícula p [NELEM], partículas [NELEM];
MPI_Datatype tipo de partícula, oldtypes [2] ; // variables requeridas
int blockcounts [2];
13
Cómputo De Alto Desempeño - MPI
MPI_Status stat ;
printf ("rango =% d% 3.2f% 3.2f% 3.2f% 3.2f% d% d \ n", rango, p [3] .x,
14
Cómputo De Alto Desempeño - MPI
p [3] .y, p [3] .z, p [3] .velocity, p [3] .n, p [3] .type);
Un comunicador abarca un grupo de procesos que pueden comunicarse entre sí. Todos los
mensajes MPI deben especificar un comunicador. En el sentido más simple, el comunicador es
una "etiqueta" adicional que debe incluirse con las llamadas MPI. Al igual que los grupos, los
comunicadores se representan en la memoria del sistema como objetos y el programador solo
puede acceder a ellos mediante "identificadores". Por ejemplo, el identificador para el
comunicador que comprende todas las tareas es MPI_COMM_WORLD.
Desde la perspectiva del programador, un grupo y un comunicador son uno. Las rutinas grupales
se usan principalmente para especificar qué procesos deben usarse para construir un
comunicador.
15
Cómputo De Alto Desempeño - MPI
Uso típico:
16
Cómputo De Alto Desempeño - MPI
Grupo1 Grupo2
Comunicador1 Comunicador2
Comunicaciones
if (numtasks! = NPROCS) {
printf ("Debe especificar MP_PROCS =% d. Terminando. \ n", NPROCS);
MPI_Finalize ();
salida (0);
}
17
Cómputo De Alto Desempeño - MPI
sendbuf = rango;
MPI_Finalize ();
}
18
Cómputo De Alto Desempeño - MPI
Bibliografía
Blaise Barney, L. (2020). Message Passing Interface (MPI). Obtenido el 28 May 2020, de
https://computing.llnl.gov/tutorials/mpi/
Cámara Nebreda, J. M., Represa Pérez, C., & Sánchez Ortega, P. L. (2015). Introducción a la
programación en MPI.
Gropp, W., Gropp, W. D., Lusk, E., Skjellum, A., & Lusk, A. D. F. E. E. (1999). Using MPI: portable
parallel programming with the message-passing interface (Vol. 1). MIT press.
Kendall, W. (2019). MPI Tutorial Introduction · MPI Tutorial. Obtenido el 28 May 2020, de
https://mpitutorial.com/tutorials/mpi-introduction/
19