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 jiparraguirre@frbb.utn.edu.ar 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? jiparraguirre@frbb.utn.edu.ar 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/