Programación paralela con MPI

por:

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.

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).

Resultado de la instalación de MPI en un ordenador

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:

Ejemplo de la ejecución de código MPI

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;
}

Ejemplo más complejo de MPI

Espero que os haya gustado esta entrada y si tenéis alguna duda o comentario no dudéis en escribirla.

Deja una Respuesta