Hace algún tiempo empezamos a escribir en Somos Binarios sobre la programación paralela, explicando algunos mecanismos para lograrla y los conceptos básicos. Un seguidor nos comentó que sería bueno hablar de MPI como máximo exponente de la programación paralela y por ello tenemos este artículo.
Tabla de contenidos
Programación paralela de altas prestaciones con MPI
MPI es una biblioteca pensada para la realización de programas altamente paralelizables en una única máquina o en un entorno formado por varias máquinas conectadas a través de una red.
Aunque hay muchas implementaciones de MPI básicamente es usado en programas en C o C++ que son los que realmente explotan al máximo los recursos que tenemos. En nuestro ejemplo vamos a usar C.
Instalando MPI
Lo primero que debemos hacer es instalar esta librería ya que posee un conjunto de funciones propias y para usarlas es necesario utilizar su compilador y su modulo de ejecución.
En Linux lo podemos instalar facilmente con:
sudo apt-get install libcr-dev mpich2 mpich2-doc
Si vemos lo que nos instala, podemos comprobar que hay un compilador de c (mpicc), uno de c++ (mpic++) y el módulo de ejecución (mpirun).
Nuestro primer programa con MPI
El código de nuestro primer programa podría ser así:
#include <mpi.h>
#include <stdio.h>
int main (int argc, char* argv[])
{
int miProceso, procesosTotales;
MPI_Init (&argc, &argv);
MPI_Comm_rank (MPI_COMM_WORLD, &miProceso);
MPI_Comm_size (MPI_COMM_WORLD, &procesosTotales);
printf( "Soy el proceso %d de %d\n", miProceso, procesosTotales );
MPI_Finalize();
return 0;
}
Aquí podemos ver varias funciones básicas de MPI:
- MPI_Init que nos va a permitir definir que parte del programa va a usar funciones de MPI.
- MPI_Finalize que nos va a permitir cuando va a finalizar el bloque de código que usará MPI
MPI_comm_rank que nos va a permitir ver cual es nuestro identificador de proceso respecto al total.
- MPI_comm_size que nos va a permitir saber cuantos procesos hay
Un ejemplo de la compilación y ejecución de este código se puede ver en la siguiente imagen:
Segundo ejemplo
Utilizando las funciones de MPI se pueden realizar cosas bastante más complejas. El siguiente código es un ejemplo de cómo varios procesos realizan un cálculo y cuando acaban se devuelve el resultado al proceso principal que lo muestra por pantalla:
#include <mpi.h>
#include <stdio.h>
int main (int argc, char* argv[])
{
int miProceso;
int miValor;
int total;
MPI_Init (&argc, &argv);
MPI_Comm_rank (MPI_COMM_WORLD, &miProceso);
if(miProceso==0){
miValor = 5;
}
else{
miValor = miProceso*2;
}
MPI_Reduce(&miValor,&total,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
if(miProceso==0){
printf("Soy el proceso 0 y el total es %d\n",total);
}
MPI_Finalize();
return 0;
}
Espero que os haya gustado esta entrada y si tenéis alguna duda o comentario no dudéis en escribirla.