Categorías: Programacion

Programación paralela con MPI

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

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.

Jorge Durán

Entusiasta de la tecnología desde los 10 años, desarrollador y creador de varios proyectos de software y autodidacta por naturaleza. Ingeniero Informático por la USAL y .Net backend developer en idealista.

Share
Publicado por
Jorge Durán

Recent Posts

Docker: conceptos principales y tutorial paso a paso

Hoy queremos hablaros de Docker un proyecto que cada día es más usado, porque permite…

3 años hace

Crea diagramas rápidamente usando código

Cada vez estamos más acostumbrados a usar código para generar la infraestructura (IaC), documentar nuestro…

3 años hace

Procesamiento del lenguaje natural con ElasticSearch

Uno de los problemas que se presentan con una mayor frecuencia hoy en día, es…

4 años hace

Elige tecnología clásica y aburrida

Uno de los problemas que solemos tener los programadores, es que nos gusta estar a…

4 años hace

Cómo usar Docker en Windows

Docker es una de las herramientas más usadas por los desarrolladores, sin embargo, usarlo en…

4 años hace

Analiza el coste del uso de JavaScript

Como seguramente sabrás el uso de JavaScript ha crecido exponencialmente en los últimos tiempos, sin…

5 años hace