PDF de programación - Programación Paralela en MPI

Imágen de pdf Programación Paralela en MPI

Programación Paralela en MPIgráfica de visualizaciones

Actualizado el 21 de Marzo del 2018 (Publicado el 29 de Diciembre del 2017)
889 visualizaciones desde el 29 de Diciembre del 2017
104,0 KB
44 paginas
Creado hace 20a (29/10/2003)
Programaci´on Paralela en MPI

Xavier Andrade V.

Introducci´on

A pesar del aumento exponencial de la capacidad de los pro-
cesadores, esta no es suficiente para el estudio de muchos
sistemas.

Es necesario entonces usar varios procesadores para realizar
una sola tarea.

Aparece un factor importante, la comunicaci´on entre proce-
sos.

La computaci´on paralela es un ´area actual de estudio tanto
en el desarrollo de sistemas como en la programaci´on.

1

Sistemas Paralelos

Existen distintas maneras de interconectar varios procesadores en
un sistema.

2

Sistemas de Memoria Compartida

Est´an compuestos de procesadores y m´odulos de memoria
interconectados.

Existe un direccionamiento de memoria com´un para todos
los procesadores.

La comunicaci´on entre procesos es muy r´apida.

Escalan a un m´aximo del orden 100 procesadores por proble-
mas de rendimiento y costo.

3

Sistemas de Memoria Distribuida

Cada procesador tiene su propia memoria.

Un sistema de interconexi´on permite acceder la memoria de
los otros procesadores.

Escalan a miles de procesadores.

4

Programaci´on en Paralelo

Existen distintas formas de programar aplicaciones que corran en
varios procesadores, estas se diferencian en complejidad y esca-
labilidad.

5

OpenMP

Es el compilador el que paraleliza el c´odigo.

Debe ser asistido por directivas dadas por el programador.

Es poco eficiente y solo capaz de generar c´odigo para siste-
mas de memoria distribuida.

6

Memoria Compartida y Threads

Los distintos procesos comparten un ´area de memoria que
usan para compartir informaci´on.

Se adapta bien a sistemas de memoria compartida.

Complicada e ineficiente de implementar en sistemas de me-
moria distribuida.

7

Paso de Mensajes

La comunicaci´on se hace expl´ıcitamente mediante mensajes
que contienen informaci´on.

Permite un fino control de la comunicaci´on, la parte m´as
costosa del c´alculo en paralelo.

La programaci´on resulta m´as compleja.

8

MPI

MPI es un est´andar de programaci´on en paralelo mediante paso
de mensajes que permite crear programas portables y eficientes

9

Introducci´on a MPI

MPI fue creado en 1993 como un est´andar abierto por fabri-
cantes y usuarios de sistemas paralelos.

Cada proveedor de un sistema paralelo implementa MPI para
su sistema.

Existen implementaciones de fuente abierta, que permitieron
el desarrollo de sistemas paralelos de bajo costo basados en
software libre.

MPI-2 apunta a ampliarse a otras ´areas de programaci´on
distribuida.

10

Caracter´ısticas de MPI

Interfaz gen´erica que permite una implementaci´on optimiza-
da en cualquier sistema paralelo.

Es una biblioteca que incluye interfaces para FORTRAN, C
y C++.

Define varias formas de comunicaci´on lo que permite progra-
mar de manera natural cualquier algoritmo en paralelo.

Est´a pensado para crear bibliotecas paralelas.

11

Programaci´on B´asica en MPI

La programaci´on usando MPI no es compleja, pero es relativa-
mente distinta a la programaci´on de un c´odigo serial y existen
factores nuevos que tener en cuenta.

12

Estructura de un Programa MPI

Se debe incluir el encabezado <mpi.h>

Se debe inicializar y terminar MPI con las funciones MPI Init
y MPI Finalize respectivamente.

El c´odigo entre estas llamadas ser´a ejecutado simult´anea-
mente por todos los procesadores.

Fuera de ese lapso no est´a definido el comportamiento del
programa (depende de la implementaci´on de MPI ).

13

Referencia: Inicializaci´on y Finalizaci´on de MPI

C

C++

int MPI Init(int * pargv, char *** pargv)
int MPI Finalize(void)

void MPI::Init(int & argv,char & ** argv)
void MPI::Init()
void MPI::Finalize()

14

Comunicadores

Un comunicador corresponde a un grupo de procesos sobre
el que se realiza la comunicaci´on.

Dentro de un comunicador cada proceso tiene un rango que
lo identifica.

Existe un comunicador b´asico MPI COMM WORLD que contiene a
todos los procesos.

Existen funciones que nos permiten saber el rango y el n´ume-
ro de procesos dentro de un comunicador.

15

Referencia: Comunicadores y sus Funciones B´asicas

C

C++

MPI Comm MPI COMM WORLD
int MPI Comm size(MPI Comm comm, int *psize)
int MPI Comm rank(MPI Comm comm, int *prank)

MPI::Intracomm MPI::COMM WORLD
int MPI::Intracomm::Get size()
int MPI::Intracomm::Get rank()

16

Funciones B´asicas de Comunicaci´on

La forma de comunicaci´on en MPI es a trav´es de mensajes
que contienen datos.

La forma m´as simple es la comunicaci´on punto a punto,
donde se env´ıa un mensaje de un proceso a otro.

Esto se realiza usando las funciones MPI Send y MPI Recv.

17

Referencia: Funciones B´asicas de Comunicaci´on en C

int MPI Send(void *buf, int count, MPI Datatype dtype,
int dest,int tag, MPI Comm comm)
int MPI Recv(void *buf, int count, MPI Datatype dtype,
int src,int tag, MPI Comm comm,
MPI Status *stat)

18

Referencia: Funciones B´asicas de Comunicaci´on en C++

void MPI::Intracomm::Send(void *buf, int count,

MPI::Datatype dtype,
int dest,int tag)
MPI::Status MPI::Intracomm::Recv(void *buf, int count,
MPI Datatype dtype,
int src,int tag)

19

Referencia: Funciones B´asicas de Comunicaci´on, Argumentos

Buffer de env´ıo o recepci´on
n´umero de datos

void * buf
int count
MPI Datatype dtype tipo de datos
int dest/src
int tag

MPI Comm comm

MPI Status * stat

rango del nodo al que se env´ıa/recibe
etiqueta que diferencia al mensaje
para ignorarla en MPI Recv
se puede pasar MPI ANY TAG
comunicador
(en C++ corresponde a this)
status de la recepci´on (solo MPI Recv)
para ignorarlo pasar MPI STATUS IGNORE
(en C++ es devuelto por la funcion)

20

Tipos de Datos

Al enviar un dato es necesario especificar el tipo de este.

Cada tipo tiene una equivalencia con un instancia del tipo
MPI Datatype.

Esto permite el uso de MPI en ambientes heterog´eneos.

Es posible generar tipos de datos m´as complejos, caracter´ısti-
ca que trataremos m´as adelante.

21

Referencia: Tipos de Datos

Tipo

Tipo de dato en C Tipo de dato en C++

MPI Datatype

MPI::Datatype

MPI CHAR

MPI INT

char
bool
int
unsigned int MPI UNSIGNED
float
double
long double

MPI FLOAT
MPI DOUBLE
MPI LONG DOUBLE
MPI BYTE

MPI::CHAR
MPI::BOOL
MPI::INT
MPI::UNSIGNED
MPI::FLOAT
MPI::DOUBLE
MPI::LONG DOUBLE
MPI::BYTE

22

C´odigo B´asico en C
#include <mpi.h>
#include <stdio.h>
int main(int argc,char **argv){

int rank,size;

MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);

printf("Hola mundo, Este es el rango %d de %d\n",rank,size);

if(rank==1){

double data=3.14;
MPI_Send(&data,1,MPI_DOUBLE,0,27,MPI_COMM_WORLD);

}
if(rank==0){

double data;
MPI_Recv(&data,1,MPI_DOUBLE,1,MPI_ANY_TAG,

MPI_COMM_WORLD,MPI_STATUS_IGNORE);

printf("El rango 0 dice %g\n",data);

}

MPI_Finalize();
return 0;

}

23

C´odigo B´asico en C++
#include <mpi.h>
#include <iostream>
using namespace std;

int main(int argc,char **argv){

MPI::Init(argc,argv);
const int size=MPI::COMM_WORLD.Get_size();
const int rank=MPI::COMM_WORLD.Get_rank();

cout << "Hola mundo, este es el rango " << rank

<< " de " << size << endl;

if(rank==1){

double data=3.14;
MPI::COMM_WORLD.Send(&data,1,MPI::DOUBLE,0,27);

}
if(rank==0){

double data;
MPI::COMM_WORLD.Recv(&data,1,MPI::DOUBLE,1,MPI::ANY_TAG);
cout << "El rango 0 dice " << data << endl;

}

MPI::Finalize();
return 0;

}

24

Comportamiento del Env´ıo de Mensajes

Los env´ıos de datos en MPI est´an dise˜nados para lograr el
m´aximo rendimiento posible.

La funci´on de env´ıo MPI Send tiene 2 comportamientos posi-
bles, dependiendo del tama˜no del mensaje.
• Guardar el mensaje en un buffer y retornar inmediatamen-

te.

• Esperar a que el proceso de destino empieze a recibir.

El tama˜no de mensaje para el cual esto ocurre depende de
la implementaci´on y es muy variable.

25

Deadlocks

Un deadlock ocurre cuando un proceso queda esperando un
mensaje que nunca recibir´a.

Un caso t´ıpico se puede observar en el c´odigo siguiente, que
debido al comportamiento ambiguo de MPI Send puede o no
producir un deadlock.

if(rank==0) {

MPI_COMM_WORLD.Send(vec1,vecsize,MPI::DOUBLE,1,0);
MPI_COMM_WORLD.Recv(vec2,vecsize,MPI::DOUBLE,1,MPI::ANY_TAG);

}
if(rank==1) {

MPI_COMM_WORLD.Send(vec3,vecsize,MPI::DOUBLE,0,0);
MPI_COMM_WORLD.Recv(vec4,vecsize,MPI::DOUBLE,0,MPI::ANY_TAG);

}

26

Comunicaci´on Colectiva

En ocasiones es necesario transmitir informaci´on entre un
grupo de procesadores.

Para esto MPI provee varias rutinas de comunicaci´on colec-
tiva.

Estas se basan en un comunicador y deben ser llamadas por
todos los miembros de este.

27

Comunicaci´on Colectiva: MPI Barrier

La rutina MPI Barrier se bloquea hasta ser llamada por todos
los procesos de un grupo.

Permite sincronizar la ejecuci´on de algunas tareas.

int MPI Barrier(MPI Comm comm)
void MPI::Intracomm::Barrier()

28

Comunicaci´on Colectiva: MPI Bcast

MPI Bcast copia los valores en un arreglo del nodo root al
arreglo en todo el resto de los nodos.

int MPI Bcast(void * buf, int count, MPI Datatype dtype,
int root, MPI Comm comm)
int root, MPI Comm comm)

void MPI::Intracomm::Bcast(void * buf, int count,

MPI Datatype dtype,
int root)

29

Comunicaci´on Colectiva: MPI Gather y MPI Scatter

MPI Scatter toma un arreglo de datos en el nodo root y los
distribuye a los nodos.

MPI Gather realiza la acci´on inversa, trayendo la informaci´on
de los nodos a un arreglo en el nodo root.

Existen variantes m´as sofisticadas de estas funciones.

30

Esquema de comunicaci´on de MPI Scatter

31

nodo 0nodo 3nodo 2nodo 1 Referencia: MPI Scatter y MPI Gather en C

int MPI Gather(void *sbuf, int scount, MPI Datatype sdtype,

void *rbuf, int rcount, MPI Datatype rdtype,
int root, MPI Comm comm)
int MPI Scatter(void *sbuf, int scount, MPI Datatype sdtype,
void *rbuf, int rcount, MPI Datatype rdtype,
int root, MPI Comm comm)

32

Referencia: MPI::Scatter y MPI::Gather en C++

void MPI::Intracomm::Gather(void *sbuf, int scount,

MPI Datatype sdtype,
void *rbuf, int rcount,
MPI Datatype rdtype,
int root)
void MPI::Intrac
  • Links de descarga
http://lwp-l.com/pdf8069

Comentarios de: Programación Paralela en MPI (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad