Que tal amigos el dia de hoy vengo a hablarles un poco sobre el paradigma de programacion paralela de memoria distribuida con MPI. Si estas leyendo este post es por que por lo menos has programado, pienso que no necesitas ser todo un Lord en la programación, para entender por lo menos las ideas basicas de lo que se planteará a continuación.
Recuerda que si existe la posibilidad de que algunas cosas no las entiendas en este momento, pero si quieres puedes consultar con San Google y el te respondera tus peticiones.
MPI
The Message Passing Interface, o MPI por sus siglas, es una interfaz de paso de mensajes entre procesadores, es uno
de los protocolos de comunicación en paralelo más utilizados y principalmente se usa para la programacion paralela con memoria distribuida, aunque también se puede utilizar para programación paralela de memoria compartida.
MPI, es un conjunto de subrutinas y librerias que pueden ser llamadas desde FORTRAN o C/C++.
Para dar inicio a tu primer código con MPI, deberas incluir la libreria
Y siempre para que MPI se inicie deberas hacer solo una llamada a la rutina MPI_Init. Esta rutina de MPI debe ser llamada antes que cualquier otra y para terminar el procesamiento de MPI, este se termina con una llamada a MPI_Finalize.MPI, es un conjunto de subrutinas y librerias que pueden ser llamadas desde FORTRAN o C/C++.
Nota: ojo no es un lenguaje.El programador puede realizar su codigo e incluir las llamadas a la libreria de MPI y cuando éste se compile, ya sea con el compilador de FORTRAN o el de C/C++, este hará los vinculos correspondientes con la libreria.
Para dar inicio a tu primer código con MPI, deberas incluir la libreria
#include <mpi.h> /*para C/C++*/
Ademas de estas dos importantes rutinas básicas, existen otras dos que nunca deben faltar:
MPI_Comm_size(comm, size) MPI_Comm_rank(comm, rank)La primera regresa el número de procesadores y se almacena en la variable size así como un comunicador por default, comm=MPI_WORLD_COMM, el cual indica el conjunto de todos los procesadores asignados a la ejecución del programa. Posteriormente, el usuario puede definir otros comunicadores para designar subconjuntos de procesadores.
La segunda regresa el número lógico que corresponde a cada procesador. Este valor se almacena en la variable rank y siempre empieza en cero y alcanza un valor máximo igual al número de procesadores menos uno. Este es un esquema de un programa con MPI.
#include <mpi.h>
#include <stdio.h>
int main (int argc,char *argv[])
{int rank,size;
...
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
...
MPI_Finalize();
return 0;
Para compilar y ejecutar es bastante sencillo, solo debes
mpicc -o programa programa.c
mpirun -np N programa
donde \[N\] es el número de procesadores.
Si tu codigo esta en c++, deberas
mpic++ -o programa programa.cpp
mpirun -np N programa
donde \[N\] es el número de procesadores.
Ejemplo: HolaMundo.cpp
#include <mpi.h>
#include <iostream>
#include <stdio.h>
using namespace std;
int main (int argc,char *argv[])
{int rank,size;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
printf("Hola Mundo desde procesador %d\n",rank);
MPI_Finalize();
return 0;
}
Compilamos y ejecutamos
mpic++ -o Hola HolaMundo.cpp
mpirun -np 4 Hola
Salida
Hola Mundo desde procesador 1 Hola Mundo desde procesador 3 Hola Mundo desde procesador 2 Hola Mundo desde procesador 0Una cosa debemos tener claro y es que MPI ejecuta el mismo programa en todos los procesadores, es responsabilidad del programador decidir que procesador hara alguna tarea respectiva. Bueno amigos, os dejo hasta aqui, hasta un nuevo post, posiblemente estare explicando algunas funciones basicas osbre MPI.