MPI inicial - Facultad Regional Bahía Blanca

Anuncio
Procesamiento Paralelo
Introducción a MPI
Javier Iparraguirre
Universidad Tecnológica Nacional, Facultad Regional Bahía Blanca
11 de Abril 461, Bahía Blanca, Argentina
[email protected]
http://www.frbb.utn.edu.ar/hpc/
8 de junio de 2016
¿Que es MPI?
Generalidades
• MPI = Message Passing Interface
• MPI es una de las APIs más antiguas
• Muy usada y portable
• Demanda poco desde el punto de vista del hardware
• Paralelización explícita
Modelo de programación
Historia
• 1994: MPI-1.0
• 1998: MPI-2.0
• 2012: MPI-3.0 fue aprobado como estándar
Modos de funcionamiento
Modos de funcionamiento
• Asincrónico
• Comportamiento no-determinístico
• Sincronización suelta
• Hay sincronización para realizar intercambio
• Es viable una secuencia lógica
• SPMD Single Program Multiple Data
• El mismo programa corre en todos los nodos
• Simple de escalar
• Puede haber sincronización suelta o completamente
sincrónico
Bloqueo sin buffer
Bloqueo con buffer
Sin bloqueo sin buffer
Cuadro de protocolos
Programando
Hola Mundo!
# i n c l u d e < s t d i o . h>
# i n c l u d e " mpi . h "
i n t main ( argc , argv )
i n t argc ;
char ∗∗ argv ;
{
i n t rank , s i z e ;
M P I _ I n i t ( &argc , &argv ) ;
MPI_Comm_size ( MPI_COMM_WORLD, &s i z e ) ;
MPI_Comm_rank ( MPI_COMM_WORLD, &rank ) ;
p r i n t f ( " H e l l o w o r l d from process %d o f %d \ n " ,
rank , s i z e ) ;
MPI_Finalize ( ) ;
return 0;
}
Salida
Hello
Hello
Hello
Hello
world
world
world
world
from
from
from
from
process
process
process
process
0
2
3
1
of
of
of
of
4
4
4
4
Funciones
• 125 funciones
• 6 son las mas usadas
Comunicaciones MPI
Tipos de datos
Ejemplos
Ejemplo 1
# i n c l u d e < s t d i o . h>
# i n c l u d e " mpi . h "
i n t main ( argc , argv )
i n t argc ;
char ∗∗ argv ;
{
i n t rank , s i z e ;
M P I _ I n i t ( &argc , &argv ) ;
MPI_Comm_size ( MPI_COMM_WORLD, &s i z e ) ;
MPI_Comm_rank ( MPI_COMM_WORLD, &rank ) ;
p r i n t f ( " H e l l o w o r l d from process %d o f %d \ n " ,
rank , s i z e ) ;
MPI_Finalize ( ) ;
return 0;
}
Salida ejemplo 1
% mpicc −o h e l l o w o r l d h e l l o w o r l d . c
% mpirun −np 4 h e l l o w o r l d
H e l l o w o r l d from process 0 o f 4
H e l l o w o r l d from process 3 o f 4
H e l l o w o r l d from process 1 o f 4
H e l l o w o r l d from process 2 o f 4
%
Ejemplo 2
# i n c l u d e < s t d i o . h>
# i n c l u d e " mpi . h "
i n t main ( argc , argv )
i n t argc ;
char ∗∗argv ;
{
i n t rank , v a l u e ;
M P I _ I n i t ( &argc , &argv ) ;
MPI_Comm_rank ( MPI_COMM_WORLD, &rank ) ;
do {
i f ( rank == 0 )
s c a n f ( " %d " , &v a l u e ) ;
MPI_Bcast ( &value , 1 , MPI_INT , 0 , MPI_COMM_WORLD ) ;
p r i n t f ( " Process %d g o t %d \ n " , rank , v a l u e ) ;
} w h i l e ( v a l u e >= 0 ) ;
MPI_Finalize ( ) ;
return 0;
}
Salida ejemplo 2
% mpicc −o b c a s t b c a s t . c
% mpirun −np 4 b c a s t
10
Process 0 g o t 10
22
Process 0 g o t 22
−1
Process 0 g o t −1
Process 1 g o t 10
Process 1 g o t 22
Process 1 g o t −1
Process 2 g o t 10
Process 2 g o t 22
Process 2 g o t −1
Process 3 g o t 10
Process 3 g o t 22
Process 3 g o t −1
Ejemplo 3
# i n c l u d e < s t d i o . h>
# i n c l u d e " mpi . h "
i n t main ( argc , argv )
i n t argc ;
char ∗∗argv ;
{
i n t rank , value , s i z e ;
MPI_Status s t a t u s ;
M P I _ I n i t ( &argc , &argv ) ;
MPI_Comm_rank ( MPI_COMM_WORLD, &rank ) ;
MPI_Comm_size ( MPI_COMM_WORLD, &s i z e ) ;
do {
i f ( rank == 0 ) {
s c a n f ( " %d " , &v a l u e ) ;
MPI_Send ( &value , 1 , MPI_INT , rank + 1 , 0 , MPI_COMM_WORLD ) ;
}
else {
MPI_Recv ( &value , 1 , MPI_INT , rank − 1 , 0 , MPI_COMM_WORLD,
&s t a t u s ) ;
i f ( rank < s i z e − 1 )
MPI_Send ( &value , 1 , MPI_INT , rank + 1 , 0 , MPI_COMM_WORLD ) ;
}
p r i n t f ( " Process %d g o t %d \ n " , rank , v a l u e ) ;
} w h i l e ( v a l u e >= 0 ) ;
MPI_Finalize ( ) ;
return 0;
}
Salida ejemplo 3
% mpicc −o r i n g r i n g . c
% mpirun −np 4 r i n g
10
Process 0 g o t 10
22
Process 0 g o t 22
−1
Process 0 g o t −1
Process 3 g o t 10
Process 3 g o t 22
Process 3 g o t −1
Process 2 g o t 10
Process 2 g o t 22
Process 2 g o t −1
Process 1 g o t 10
Process 1 g o t 22
Process 1 g o t −1
%
Instalando en máquina personal
OpenMPI en Ubuntu
aptitude install openmpi-bin openmpi-doc libopenmpi-dev
Compilando
mpicc −o b i n a r i o 01−example . c
Ejecutando
mpirun −np 8 b i n a r i o
Ejecutando en un cluster
Cluster remoto
• Se dispone de un cluster remoto.
• Se define la lista de nodos en un archivo (my_hostfile)
Corriendo remoto: lista archivos
compile . sh
main . c
my_hostfile
run . sh
Corriendo remoto: fuente
# i n c l u d e <mpi . h>
# i n c l u d e < s t d i o . h>
i n t main ( i n t argc , char ∗ argv [ ] ) {
i n t myrank , s i z e ;
M P I _ I n i t (& argc , &argv ) ;
MPI_Comm_rank (MPI_COMM_WORLD, &myrank ) ;
MPI_Comm_size (MPI_COMM_WORLD, &s i z e ) ;
p r i n t f ( " Hola desde e l proceso %d de %d \ n " ,
myrank , s i z e ) ;
MPI_Finalize ( ) ;
return 0;
}
Corriendo remoto: compilando
mpicc −o b i n a r i o main . c
Corriendo remoto: nodos en my_hostfile
c5n04
c5n05
c5n06
c5n07
c5n08
s l o t s =2
s l o t s =2
s l o t s =2
s l o t s =2
s l o t s =2
Corriendo remoto: ejecutando
mpirun − h o s t f i l e m y _ h o s t f i l e −np 4 b i n a r i o
Corriendo remoto: salida
Hola
Hola
Hola
Hola
desde
desde
desde
desde
el
el
el
el
proceso
proceso
proceso
proceso
0
1
2
3
de
de
de
de
4
4
4
4
¡Muchas gracias!
¿Preguntas?
[email protected]
Referencias
• G. Ananth, G. Anshul, K. George, and K. Vipin.
Introduction to parallel computing, 2003.
• MPI Tutorial, Blaise Barney, Lawrence Livermore National
Laboratory
https://computing.llnl.gov/tutorials/mpi/
• ANL MPI Tutotial http:
//www.mcs.anl.gov/research/projects/mpi/tutorial/
Descargar