Para poder sacar el máximo partido a los nuevos microprocesadores de doble o cuádruple núcleo debemos paralelizar nuestros programas. Esto consiste en convertir nuestro programa en varios programas que realizan cada uno una parte del cálculo. La coordinación de cada uno de estos subprogramas requiere que se puedan comunicar entre sí sin afectar a la posibilidad de ejecutarse de forma independiente y evitando problemas de concurrencia.
La interfaz MPI (Message Passing Interface) propone un conjunto de funciones que ayudan realizar esta tarea de coordinación. Su uso en nuestros programas es bastante sencillo. En Windows la implementación de mpi más cómoda es MPICH2. En Linux hay otra un poco más extendida que es OpenMPI.
Después de instalar MPICH2 en nuestro ordenador solo tenemos que linkar nuestro programa con la librería “C:Program FilesMPICH2libmpi.lib” y usar el directorio de inclusión “C:Program FilesMPICH2include”. Hecho esto probamos un programa de ejemplo como el que podemos encontrar en wikipedia (http://es.wikipedia.org/wiki/MPI). Vemos que este programa es genérico para cualquier distribución de mpi.
El programa usa pocas funciones principales
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
La primera función inicializa MPI la segunda nos devuelve el rango que es un identificador del proceso y la tercera nos devuelve el numero de instancias que se han lanzado. Después se usan dos funciones que son las encargadas de enviar y recibir mensajes. Estas funciones son bloqueantes y permiten la sincronización de los procesos.
MPI_Send(&num, 1, MPI_INT, next, tag, MPI_COMM_WORLD);
MPI_Recv(&num, 1, MPI_INT, from, tag, MPI_COMM_WORLD, &status);
Para ejecutar el programa usamos el siguiente comando en una términal
mpiexec -n 4 -localonly ./bin/Debug/mpisample.exe
Este comando indica que se ejecutarán 4 instancias del programa (-n 4) en modo local (-localonly). Mpich instala un servicio de Windows que permite que se puedan lanzar procesos coordinados en varias máquinas conectadas por red, como es el caso de los grandes clusters de computación.

resultado mpi