PR4AIC
PR4AIC
PR4AIC
A continuacin se presentan dos cdigos de ejemplo, uno que corresponde a un programa maestro y otro al esclavo.
maestro.c #include #include #include #include <stdio.h> <stdlib.h> "pvm3.h" <time.h>
#define NUMPROC 8 int main() { int tids[NUMPROC]; int cc, mytid; char buf[100]; int i; long *tiempo_proceso; tiempo_proceso = (long *) calloc (NUMPROC, sizeof(long)); mytid = pvm_mytid(); printf("i'm t%x\n", mytid); cc = pvm_spawn("esclavo", (char**)0, 0, "", NUMPROC, tids); pvm_initsend (PvmDataDefault); pvm_pkint (tids, NUMPROC, 1); pvm_mcast (tids, NUMPROC, 0); if (cc > 1) { for (i=0; i <NUMPROC; i++) { cc = pvm_recv(tids[i], -1); pvm_bufinfo(cc, (int*)0, (int*)0, &tids[i]); pvm_upkstr(buf); printf("de la tarea t%x: %s\n", tids[i], buf); } for (i=0; i<NUMPROC; i++) { pvm_recv(tids[i], 0); pvm_upklong (&tiempo_proceso[i], 1, 1); printf("Tiempo del Proc[%d]=%ld\n", i, tiempo_proceso[i]); } } else printf("No puedo arrancar los esclavos, cc = %d\n", cc); free (tiempo_proceso); pvm_exit(); exit(0); } ////////////////////// Fin MAESTRO
#include "pvm3.h" #define NUMPROC 8 int main() { int mytid; int tids [NUMPROC]; int mi_pid = -1, host; char buf[100]; int i; time_t t_inicial, t_final, t_total, t_aux; t_inicial = t_final = t_total = 0; t_inicial = time (&t_aux); mytid = pvm_mytid(); host = pvm_parent();
pvm_recv (host, 0); pvm_upkint (tids, NUMPROC, 1); for (i=0; i < NUMPROC; i++) { if (mytid == tids [i]) { mi_pid = i; break; } } strcpy(buf, "hola, desde "); gethostname(buf + strlen(buf), 64); pvm_initsend(PvmDataDefault); pvm_pkstr(buf); pvm_send(host, 1); sleep (mi_pid+5); t_final = time(&t_aux); t_total = t_final - t_inicial; pvm_initsend(PvmDataDefault); pvm_pklong(&t_total, 1, 1); pvm_send(host, 0); pvm_exit(); exit(0); } ////////////////////// Fin ESCLAVO
Ejercicios:
a) Utiliza el comando ps a para verificar que se han creado mltiples procesos y que se han distribuido en los diferentes computadores. De igual forma con xpvm observa la comunicacin entre procesos. b) Explica las funciones de librera de PVM que aparecen en los cdigos maestro.c y esclavo.c c) Para qu sirve la funcin pvm_setopt()?Y la funcin pvm_config()? d) Explica de forma grfica, lo ms esquemticamente posible, el funcionamiento de PVM y su uso. e) Crea un programa paralelo mediante PVM, en donde se utilice la estructura de programa paralelo DESCOMPOSICIN DEL DOMINIO. f) Crea un programa paralelo mediante PVM, en donde se utilice la estructura de programa paralelo SEGMENTADO. g) Crea un programa paralelo mediante PVM, en donde se utilice la estructura de programa paralelo DIVIDE Y VENCERS. Nota: Deben ser programas sencillos y que reflejen perfectamente el uso de PVM, por ejemplo resolucin de algn problema matemtico que se preste a su resolucin mediante algn mtodo de paralelizacin. Analiza la ganancia obtenida con respecto a su versin secuencial para distintas cargas de trabajo. Documenta y explica cada uno de los ejercicios. Nota: La versin de PVM instalada en los laboratorios es la 3.4.5. En http://www.csm.ornl.gov/pvm/ y http://www.netlib.org/pvm3/index.html puedes obtener el cdigo y documentacin sobre el entorno PVM. 3. Iniciacin al MPI MPI significa Message Passing Interface y procede del esfuerzo de la comunidad de la computacin paralela (industria y grupos de desarrollo de software libre) por crear un estndar para programacin paralela basada en paso de mensajes. El primer estndar se public en 1994 y, posteriormente, se gener una segunda versin MPI-2 publicada en 1997. A partir de estas definiciones existen implementaciones tanto comerciales como de libre distribucin. La implementacin instalada en los laboratorios es MPICH2 (http://www.mcs.anl.gov/research/projects/mpich2/). En http://www.mpi-forum.org se puede encontrar documentacin sobre el estndar MPI. El primer paso es montar el multicomputador que en el caso de MPI se identifica con un anillo de computadores. Para indicar a MPI los computadores del anillo se utiliza un fichero situado en $HOME que se llamar mpd.hosts. En este
fichero se pueden incorporar tanto direcciones IP como hostnames. A continuacin se tiene que lanzar el demonio mpd en todos los equipos que forman el anillo; para ello se utilizar la orden mpiboot en la que el parmetro -n indica los equipos del anillos (pueden ser menos que los indicados en mpd.hosts); el parmetro f indica el nombre del fichero de hosts; el parmetro r indica que la comunicacin se har mediante rsh (nica posible en el laboratorio). Para que el comando mpiboot funcione es necesario que el mismo usuario haya abierto sesin en todos los equipos que van a formar parte del anillo. Con mpdtrace l se comprueba si el anillo est activo en cada host. Si hay problemas con mpiboot debido a restricciones de permisos (no funciona rsh por algn motivo), se puede activar el anillo manualmente utilizando mpd (hay que tener en cuenta que en las mquinas destino hay que indicar la IP origen y el puerto origen); para cerrar el anillo, en el ltimo equipo habr que lanzar dos veces el demonio mpd, una con los argumentos del equipo origen y otra para cerrar el anillo (argumento n). Para lanzar una aplicacin en el anillo se utiliza el comando mpiexec en el que el argumento n indica el nmero de procesos (por ejemplo: mpiexec n 8 programa) En el siguiente ejemplo, los diferentes procesos hijos le envan al proceso padre (proceso 0) un mensaje y el proceso padre los muestra por pantalla:
ejemplo.c #include "mpi.h" #include <stdio.h> int main( int argc, char *argv[] ) { int idproc, numprocs, namelen, i; char proc_name[MPI_MAX_PROCESSOR_NAME]; char saludo[MPI_MAX_PROCESSOR_NAME+80];
MPI_Status status; MPI_Init (&argc, &argv ); MPI_Comm_rank ( MPI_COMM_WORLD, &idproc ); MPI_Comm_size ( MPI_COMM_WORLD, &numprocs ); MPI_Get_processor_name (proc_name, &namelen ); sprintf(saludo, %s",idproc, "Mensaje del proceso %d de %d procesos en el procesador numprocs, proc_name);
if (idproc == 0) { printf("%s\n",saludo); for (i=1; i<numprocs; i++) { MPI_Recv(greeting, sizeof( greeting ), MPI_CHAR,i, 1, MPI_COMM_WORLD, &status ); printf("%s\n", saludo ); } } else { MPI_Send( greeting, strlen( greeting ) + 1, MPI_CHAR,0, 1, MPI_COMM_WORLD ); } MPI_Finalize(); return 0; }
Ejercicios:
a) Qu diferencias observas con respecto a la programacin con PVM? Indica esquemticamente el funcionamiento de MPI. b) Cmo se lanzaran en un anillo de MPI mltiples ejecutables con diferentes argumentos (utilizando la orden mpiexec)? c) Explica las funciones de librera de MPI que aparecen en el cdigo ejemplo.c d) Para qu sirve la funcin MPI_Barrier()?Y la funcin MPI_Accumulate()?Y MPI_Gather()? e) Paraleliza con MPI los mismos procesos en los ejercicios de PVM. Documntalos de igual forma.
4. Enunciado de la prctica Siguiendo con la misma dinmica que la prctica anterior, el alumno tendr que elegir un problema entre varios propuestos (ms abajo) y proponer otro problema diferente con el objetivo de evaluar el rendimiento de la programacin paralela a nivel de proceso. La resolucin de los dos problemas se har utilizando paralelismo a nivel de proceso. En la resolucin paralela se utilizar PVM para abordar uno de los problemas y MPI para resolver el otro problema. Es importante que se realice una exhaustiva batera de pruebas para analizar los rendimientos y que se expliquen las decisiones tomadas para paralelizar los problemas (argumentando estas decisiones). El anlisis de rendimientos tendr que acompaarse de grficas explicativas, en donde se observe de forma grfica y clara las ganancias obtenidas con respecto a la versin sin paralelizacin, con una batera de pruebas lo suficientemente vlida para obtener resultados significativos. El lmite mximo para comunicar al profesor de prcticas los problemas seleccionados ser la tercera sesin de prcticas. Se valorar la novedad y el inters del problema planteado, siendo el profesor el que apruebe directamente la propuesta hecha por los alumnos. Ejercicios propuestos Dado un conjunto de palabras y un texto de gran tamao, buscar cuntas veces y en qu posiciones se repiten las palabras exactas o cualquier palabra que las contengan. Por ejemplo, ante la palabra casa, tendr que contarse tambin la palabra casas o la palabra casado. Nota: el tamao del texto y el nmero de palabras de bsqueda sern los elementos que condicionarn el coste computacional (por ejemplo, a ms texto, ms se tardar en buscar).
Paraleliza la colocacin de invitados en mesas en una ceremonia en funcin de su grado de afinidad. Ante un conjunto de personas y una relacin de grado de afinidad (A es afn con B en grado 8, A con C en grado 3, B con C en grado 9), donde un nmero mayor indica mayor afinidad, distribuye a las personas en mesas de diferente tamao maximizando la afinidad global de la mesa. Nota: la cantidad de invitados y los tamaos de las mesas controlan el coste computacional.
Dados los datos climatolgicos proporcionados por AEMET (www.aemet.es), obtener datos estadsticos climatolgicos como el lugar con ms precipitaciones, el lugar con menos, la temperatura ms alta, la temperatura ms baja (y dnde y cundo se produjeron), etc.
Observaciones Las prcticas se realizarn bajo Linux. La realizacin de la prctica ser por parejas. La prctica se ir evaluando de forma continuada en el laboratorio de prcticas. La copia de cualquier programa o documentacin ajena supondr un suspenso en la asignatura. Esta prctica se entregar la semana del 4 de abril de 2011 para todos los turnos.