You are on page 1of 5

Prctica 4.

Introduccin a la programacin con MPI: Send, Receive. Lo primero de todo es iniciarnos en el entorno Open MPI que es una implementacin concreta de las especificaciones de MPI (Message-Passing Interface). En la pgina: www.open-mpi.org http://www.cs.usfca.edu/mpi/ se puede encontrar mucha documentacin sobre Open-MPI y MPI en general.

Compilar y Ejecutar Programas


Para compilar programas generaremos un fichero makefile, similar al que se entrega con la documentacin de esta prctica y que tendr la siguiente estructura: CC = mpicc PROGRAM = hello # name of the binary SRCS = hello.c # source file OBJS = $(SRCS:.c=.o) # object file # Targets default: all all: $(PROGRAM) $(PROGRAM): $(OBJS) $(CC) $(OBJS) -o $(PROGRAM) $(LDFLAGS) clean: /bin/rm -f $(OBJS) $(PROGRAM) Y luego utilizaremos el siguiente comando: $> make -f makefile Para ejecutar el programa se utilizar el siguiente comando $> mpirun -np #procesos nombre_programa [argumentos]

Ejercicio 1
P1) Compila el programa hola.c y ejectalo de manera que aparezca en pantalla 5 veces el mensaje Hola Mundo Qu comando has utilizado? El comando utilizado ha sido: mpirun -np 5 hello. P2) Busca informacin y explica para qu sirven las funciones MPI_Init y MPI_Finalize. Qu sucede si no utilizamos estas funciones en el programa hola.c? Razona la respuesta. MPI_Init: Inicializa la estructura de comunicacin de MPI entre los procesos. Ninguna funcin de comunicacin MPI funcionar sin esta instruccin al inicio exceptuando MPI_Initialized. Esta funcin inicializa todas las estructuras de datos necesarias para permitir la comunicacin entre procesos basados en el envo de mensajes MPI. Reserva el canal de comunicacin, asigna un valor a la constante MPI_COMM_WORLD Esta rutina, o MPI_Init_thead, debe ser llamada antes que cualquier otra rutina de MPI. Todos los programas MPI deben tener siempre una llamada a esta funcin. Los argumentos que recibe no son modificados. Si no se utiliza MPI_Init no sabe reconocer los distintos procesos como parte de uno principal.

MPI_Finalize: Finaliza la comunicacin paralela entre los procesos. Tras esto no se pueden enviar mensajes entre ellos sin esta instruccin al inicio. Se debera elegir un nico proceso para que contine la ejecucin del programa. MPI no asegura lo que hacen las hebras tras el MPI_Finalize con lo que lo ms seguro es encerrar el resto del cdigo tras la ejecucin con una condicin que asegure que solo un proceso lo ejecute. Es altamente recomendable proteger la zona de cdigo que sigue al MPI_Finalize.

Ejercicio 2
P1) Compila el programa greetings.c y ejectalo con 2 o ms procesos y explica con pocas palabras qu hace el programa. Qu pasa si lo ejecutamos con un solo proceso? Por qu? Utilizando el comando:mpirun -np 1 greetings no obtenemos nada. Utilizando el comando:mpirun -np 2 greetings obtenemos: Greetings from process 1! Utilizando el comando:mpirun -np 3 greetings obtenemos: Greetings from process 1! Greetings from process 2! Utilizando el comando:mpirun -np 5 greetings obtenemos: Greetings from process 1! Greetings from process 2! Greetings from process 3! Greetings from process 4! Cada hilo del proceso distinto del hilo 0 enva un mensaje al hilo 0. ste escribe por pantalla un mensaje de agradecimiento. Al ejecutar el programa con 2 o ms hilos se muestra por pantalla el mensaje de cada uno por encima del proceso 0. Si ejecutamos el programa con un solo proceso no muestra ningn mensaje por la pantalla. Esto se debe a que, al no recibir ningn mensaje, no muestra nada por pantalla. P2) Averigua para qu sirven las funciones MPI_Comm_rank y MPI_Comm_size. MPI_Comm_rank : Determina el rango (identificador) del proceso que lo llama dentro del comunicador seleccionado. MPI_Comm_size: Determina el tamao del comunicador seleccionado, es decir, el nmero de procesos que estn actualmente asociados a este. P3) Averigua para qu sirven los diferentes parmetros de las funciones MPI_send y MPI_Recv. MPI_send: Realiza el envo de un mensaje de un proceso fuente a otro destino. MPI_Recv: Rutina de recibimiento de un mensaje desde un proceso. P4) Modifica el programa anterior para que, adems de los mensajes anteriores, los procesos tambin reciban y escriban en pantalla un mensaje proveniente del nodo 0 que diga Welcome process x; donde x corresponda al rango (rank) de cada proceso distinto del 0.

Para realizar este cambio lo nico que hay que hacer es que 0 mande un mensaje a cada uno que no sea l, y que cada uno con rango distinto de 0 esperar del proceso de rango 0 un mensaje y mostrarlo por pantalla. Al teclear el comando:mpirun -np 5 eje2p4 obtenemos el siguiente resultado: Greetings from process 1! Welcome process 1! Welcome process 3! Greetings from process 2! Greetings from process 3! Welcome process 2! Greetings from process 4! Welcome process 4! Programa en el archivo ZIP.

Ejercicio 3
Escribe un programa paralelo que calcule la suma de elementos de un vector de 20 enteros. El proceso 0 se encargar de pedir por el teclado los nmeros y repartirlos entre los diferentes procesos (incluido el mismo) de manera que cada proceso calcule la suma parcial de una parte del vector. El proceso 0 se encarga de reunir todas las sumas parciales (incluida la suya) para dar el resultado final en pantalla. Los procesos tambin indicarn en pantalla su rango, los elementos del vector que formaban su parte de trabajo y la suma parcial obtenida. Procura que el trabajo se reparta lo ms equitativamente posible entre los procesos (lo que se conoce como reparto balanceado de carga). El programa ha de funcionar independientemente del nmero de procesos (mximo 20). Programa en el archivo ZIP.

Entrega final
Un fichero comprimido (.zip o .z) con: - Documento Word con las respuestas a los ejercicios. - Programa del ejercicio 2 (fichero de texto). - Programa del ejercicio 3 (fichero de texto).

You might also like