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
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.
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).
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_comm_rank que nos va a permitir ver cual es nuestro identificador de proceso respecto al total.
Un ejemplo de la compilación y ejecución de este código se puede ver en la siguiente imagen:
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.
Hoy queremos hablaros de Docker un proyecto que cada día es más usado, porque permite…
Cada vez estamos más acostumbrados a usar código para generar la infraestructura (IaC), documentar nuestro…
Uno de los problemas que se presentan con una mayor frecuencia hoy en día, es…
Uno de los problemas que solemos tener los programadores, es que nos gusta estar a…
Docker es una de las herramientas más usadas por los desarrolladores, sin embargo, usarlo en…
Como seguramente sabrás el uso de JavaScript ha crecido exponencialmente en los últimos tiempos, sin…