Está en la página 1de 10

Instituto Politécnico Nacional

Escuela Superior de Cómputo

Alumnos:
Strevel Pérez Oliver Carlos
Reyes Hernández Juan Alfredo

Grupo: 5CV6
Profesor: José Alfredo Jiménez Benítez

Proyecto: Practica 19 (MPI)


Introducción
MPI (Message Passing Interface) o Interfaz de Paso de Mensajes
Es un estándar que define la sintaxis y la semántica de las funciones contenidas en una
biblioteca de paso de mensajes diseñada para ser usada en programas que exploten la
existencia de múltiples procesadores.

El paso de mensajes es una técnica empleada en programación concurrente para


aportar sincronización entre procesos y permitir la exclusión mutua, de manera similar
a como se hace con los semáforos, monitores, etc.

Su principal característica es que no precisa de memoria compartida, por lo que es


muy importante en la programación de sistemas distribuidos.

Los elementos principales que intervienen en el paso de mensajes son el proceso que
envía, el que recibe y el mensaje.

Dependiendo de si el proceso que envía el mensaje espera a que el mensaje sea


recibido, se puede hablar de paso de mensajes síncrono o asíncrono.

Asíncrono.- El proceso que envía, no espera a que el mensaje sea recibido,


y continúa su ejecución, siendo posible que vuelva a generar un nuevo mensaje
y a enviarlo antes de que se haya recibido el anterior. Por este motivo se suelen
emplear buzones, en los que se almacenan los mensajes a espera de que un
proceso los reciba. Generalmente empleando este sistema, el proceso que
envía mensajes sólo se bloquea o para, cuando finaliza su ejecución, o si el
buzón está lleno.
Síncrono.- El proceso que envía el mensaje espera a que un proceso lo
reciba para continuar su ejecución. Por esto se suele llamar a esta técnica
encuentro o rendezvous. Dentro del paso de mensajes síncrono se engloba a la
llamada a procedimiento remoto, muy popular en las arquitecturas
cliente/servidor.

El estándar final por el MPI fue presentado en la conferencia de Supercómputo en


noviembre de 1993, constituyéndose así el foro para el MPI.
Desarrollo de la Práctica
La práctica consiste en probar e implementar el código más básico en cualquier
lenguaje de programación, el famoso “Hola Mundo” o “Hola a Todos”, sabemos que
MPI puede ser implementado en C, C++, Fortran y Ada, así que utilizaremos el código
en lenguaje C.

El cual es el siguiente:

El cual será explicado con detalle a continuación:

Las líneas 1 y 2, son los archivos cabecera utilizados en el programa, utilizaremos la


stdio.h (Cabecera de entrada y salida estándar) y necesitamos la cabecera para poder
utilizar MPI la cual es mpi.h.

La línea 4 es el comienzo de la función principal main, a la cual se le deben pasar


ciertos parámetros los cuales son argc (Numero de argumentos), y argv (Arreglo de
apuntadores, los cuales apuntan a los argumentos).

En la línea 6 declaramos dos variables de tipo entero, las cuales son el rango y el
tamaño, el rango nos servirá para especificar el identificador de un proceso, y el
tamaño para especificar el número de nodos o procesadores involucrados.

Cualquier programa paralelo con MPI puede implementarse con tan sólo 6 funciones,
aunque hay muchas más funciones para aspectos avanzados. Todas ellas empiezan por
MPI_ y obligan a que todos los programas escritos en MPI contengan la mpi.h.
Ahora antes de llamar a cualquier otra función se debe hacer la llamada a la función
MPI_Init (), solo debe ser invocada una sola vez, sus argumentos son punteros a los
parámetros de la función main (argc y argv) ante mencionados.

Lo que hace esta función es inicializar el ambiente MPI además de que permite al
sistema hacer todas las configuraciones necesarias para que la biblioteca MPI pueda
ser utilizada.

Las líneas 9 y 10 invocan a las funciones:

La primera MPI_Comm_rank, devuelve el identificador de un proceso en su segundo


argumento, en nuestro caso la variable rango.

La segunda función MPI_Comm_size, devuelve el número de procesos que estará


involucrados en la tarea, cabe mencionar que ambas funciones requieren un
Comunicador MPI_Comm, el cual en este caso esta de esta forma:

MPI_COMM_WORLD, está definida en mpi.h y consiste en todos los procesos que se


ejecutan cuando el programa comienza.

En la línea 12 simplemente mandamos a imprimir los valores generados por las


funciones anteriores, esta línea la ejecutara cada proceso involucrado, cada uno de
ellos enviado su identificador.

Línea 14: la función MPI_Finalize () sirve para finalizar el servicio de MPI, es obligatorio
terminar el servicio MPI.

Las últimas líneas solo es el valor de retorno del programa.


Compilación del Programa:
Para compilar un programa en MPI se utiliza el comando:

El nombre ejecutable es el nombre que queremos que tenga el programa ejecutable, el


nombre del programa es el nombre del archivo donde tenemos guardado el código (se
debe poner con todo y extensión), la opción ‘-o’ sirve para generar directamente el
programa ejecutable.

Cabe mencionar que lo hicimos en Linux Ubuntu o Mint:

Para poder utilizar el compilador y todas las librerías de mpi, si no las tenemos nos
saldrá un mensaje como el siguiente:

El cual nos dice que el programa mpicc puede encontrarse en los siguientes paquetes,
y nos da una lista, y a continuación como instalarlos, en nuestro caso instalamos el
número 1, que siempre es el más probable o el que contiene todos los demás:

Procedemos a instalar el paquete lam4-dev:

Nos dice los paquetes que serán instalados, simplemente esperamos a que la
instalación termine.

Tal vez a algunos les pida una contraseña, esto es porque su usuario tiene contraseña,
simplemente tiene que ponerla.

Más adelante pedirá una confirmación a lo cual diremos que sí.


Es mejor instalar todos los paquetes que aparezcan para tener el paquete completo de
MPI, después de instalar ahora tenemos todas las librerías y programas para utilizar
MPI, si llegara a necesitar algún otro repita los pasos anteriores escribiendo el nombre
del paquete, y escribiendo la contraseña en caso de que se requiera.

Ahora el programa compilara perfectamente para ellos usamos el comando antes


mencionado: mpicc.

Ejecución del Programa


Después de compilar el programa tendremos que ejecutar nuestra aplicación MPI, la
cual no se ejecuta de la manera convencional : ./nombre_programa_ejecutable, si no
que requiere de un comando llamado mpirun, el cual se usa de la siguiente manera:

La opción –np es una opción para el comando mpirun, el numero 4 significa el numero
de procesos que queremos utilizar.

Pasos necesarios en caso de que no pueda ejecutar.


Antes de ejecutar el programa hay que mencionar algunos detalles:

LAM O LAMD

Si al ejecutar el programa nos saliera el siguiente mensaje:

LAM o lamd es un entorno de desarrollo y programación para sistemas de paso de


mensajes en paralelo constituido con computadoras heterogéneas UNIX, este es un
servicio necesario que hay que inicializar para poder utilizar MPI, en algunos casos este
servicio inicia automáticamente, si no es necesario inicializarlo manualmente así:
Y con esto el lamd habrá sido inicializado en nuestra computadora.

MPD

Habrá casos en que ya tenemos inicializado el entorno lam, pero al momento de


ejecutar nos salga el siguiente mensaje:

El error dice lo siguiente:

No se puede conectar al demonio local mpd, probablemente se deba a:

1. Ningún demonio MPD esta ejecutándose en la computadora.


2. Un MPD esta ejecutándose pero no fue iniciado con la opción –n.

En el primer caso podemos iniciar el demonio con el comando: mpd &, y será capaz de
ejecutar programas de multiprocesamiento en esta computadora.

Pero ¿Qué es MPD? (MultiProcessing Demon)

Como antes se menciono MPI es un estándar de un conjunto de funciones para el


envío de mensajes entre procesos y existen muchas implementaciones de este
estándar, el más utilizado es una llamada MPICH, MPICH se presenta en muchas
variedades que se pueden utilizar en diferentes tipos de computadora.

Si utilizamos MPICH es conveniente ejecutar en cada computadora un demonio de


multiprocesamiento, este demonio sirve como una especia de maquina virtual en la
cual ya pueden ejecutarse programas MPI.

Cuando ejecutamos una aplicación MPI bajo MPICH las solicitudes se envían a los
demonios MPD que ya se están ejecutando en cada computadora para poner en
marcha las copias del programa.

Una vez que una copia del programa se ha iniciado se puede usar MPI para
comunicarse con otras copias del mismo programa que se ejecutan en cada máquina
virtual respectivamente.

Todo lo anterior explicado nos hace deducir que en cada computadora que queramos
comunicar necesitara el demonio MPD ejecutándose en ella.
Instalación de MPD

Si intentamos inicializar mpd con el comando mpd &, y si no tenemos instaladas las
librerías adecuadas, no podremos iniciarlo, la consola nos dice que librerías puede que
contengan a mpd:

Instalemos mpich2, la cual ya contiene mpd:

Después de la instalación tenemos que configurar el archivo de configuración de mpd,


ya que de lo contrario saldrá la siguiente información:

El cual dice que un archivo llamado ‘.mpd.conf’ debe existir en la carpeta de usuario
‘/etc/mpd.conf’) con permisos de lectura y escritura para el usuario y que al menos
debe contener una línea como la siguiente MPD_SECRETWORD = <contraseña>.

Una manera segura para crear este archivo es utilizando los siguientes comandos:

Y nos da 3 comandos:

cd $HOME touch .mpd.conf chmod 600 .mpd.conf


cd $HOME : Es para ir a la carpeta de del usuario

touch .mpd.conf : Cambia el acceso y fecha de modificación del archivo .mpd.conf

chmod : Es para dar los permisos de escritura y lectura a ese archivo.

Ejecutamos los comandos:

Ahora si podemos iniciar el demonio mpd sin ningún problema:

Listo el demonio MPD esta inicializado en nuestra computadora, este proceso puede
repetirse en cada una de las computadoras que se requieran.

El comando cd $HOME nos posiciono en la carpeta de usuario, por lo que hay que
trasladarnos a la carpeta donde tengamos el programa, de lo contrarios saldrá este
error:

Ya que tenemos el entorno lam y el demonio MPD (con su archivo de configuración


con los permisos adecuados) ejecutándose en nuestra computadora, ahora si podemos
ejecutar nuestro programa mpi así:

Cada proceso ejecuta la línea printf cada uno poniendo su identificador y el numero de
procesos que especificamos (4).

Cabe mencionar que todo esto lo hicimos para Linux Mint y como está basado en
Ubuntu, en Ubuntu funciona igual, tal vez para otras distribuciones Linux sean
comandos diferentes o las librerías se llamen diferente, pero en esencia este es el
proceso básico.
Conclusiones
Al principio de esta práctica tuvimos diferentes problemas al ejecutar
la practica ya que el profesor únicamente nos había dado los
comandos mpicc y mpirun, y creímos que a la primera funcionaria
pero grata fue la sorpresa al ver que no era así, tuvimos que realizar
muchas pruebas instalar varias cosas, hasta que conseguimos
compilar y ejecutar la aplicación MPI, de ahí la guía anterior, la cual
realizamos en base a nuestras pruebas, por otra parte las
aplicaciones MPI hacen que el computo en paralelo y el paso de
mensajes entre maquinas diferentes que tengan procesos distintos o
hardware o sistemas operativos distintos sea más fácil.

Este estándar es muy fácil de usar y las aplicaciones tienen una gran
potencia.

También podría gustarte