Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
UNIVERSIDAD NACIONAL DE LA AMAZONIA PERUANA FACULTAD DE INGENIERIA DE SISTEMAS E INFORMATICA GUIA DE PRACTICA N.º 02 ASIGNATURA : Lenguaje de Programación 03 TEMA : Programación en MPI con Eclipse DOCENTE : Ing. Roque F. Pizango Tapullima SEMESTRE : 2020-I 1. OBJETIVOS: El objetivo de esta sesión practica del curso de Lenguaje de Programación 03; es la de crear programas que ejecuten múltiples procesos en paralelo gracias a las librerías de MPI y OMPI que se agregaron al Eclipse TPT. 2. EJERCICIOS: Se implementara códigos de envió de mensajes en el Eclipse TPT : Ejercicio 01: /* ============================================================================ Descripción: En este código de inicio se puede ver el funcionamiento de las funciones de envío y recepción. Lo que hace es que cada proceso se envía a si mismo el mensaje deseado. Compile Command: $ mpiCC -g -Wall -o <CodeName> <CodeName.cpp> $ mpiexec ./<CodeName> $ mpiexec -n 10 ./<CodeName> ============================================================================ */ #include "mpi.h" #include <iostream> using namespace std; int main(int argc, char *argv[]) { int rank, contador; MPI_Status estado; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Send(&rank ,1 ,MPI_INT ,rank ,0 ,MPI_COMM_WORLD); MPI_Recv(&contador ,1 ,MPI_INT ,rank ,0 ,MPI_COMM_WORLD ,&estado); cout<< "Soy el proceso "<<rank<<" y he recibido "<<contador<<endl; MPI_Finalize(); return 0; } Ejercicio 02: /* ============================================================================ Descripción: Obtenido el número de procesos (size) y el rango (rank) el envío del mensaje se realiza al proceso con un rango mayor en una unidad, por tanto, el proceso con ese rango debe indicar que quiere recibir un mensaje del proceso con un rango inferior en una unidad al suyo. En nuestro programa debemos hacer una distinción ya que no todos los procesos hacen lo mismo, el primero no recibirá de nadie y el ultimo no enviará a nadie, esto se puede especificar mediante condiciones que filtren el rango del proceso. Compile Command: $ mpiCC -g -Wall -o <CodeName> <CodeName.cpp> $ mpiexec ./<CodeName> $ mpiexec -n 10 ./<CodeName> ============================================================================ */ #include "mpi.h" #include <iostream> using namespace std; int main(int argc, char *argv[]) { int rank, size, contador; MPI_Status estado; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if(rank == 0){ MPI_Send(&rank ,1 ,MPI_INT ,rank+1 ,0 ,MPI_COMM_WORLD); }else{ MPI_Recv(&contador ,1 ,MPI_INT ,rank-1 ,0 ,MPI_COMM_WORLD ,&estado); cout<<"Soy el proceso "<<rank<<" y he recibido "<<contador<<endl; contador++; if(rank != size-1) MPI_Send(&contador, 1 ,MPI_INT ,rank+1 , 0 ,MPI_COMM_WORLD); } MPI_Finalize(); return 0; } Ejercicio 03: /* ============================================================================ Description : Compile Command: $ mpiCC -g -Wall -o <CodeName> <CodeName.cpp> $ mpiexec ./<CodeName> $ mpiexec -n 10 ./<CodeName> ============================================================================ */ #include "mpi.h" #include <iostream> #include <string> #include <cstring> using namespace std; const int MAX_STRING = 100; int main(int argc, char *argv[]) { int nday; int ndays [7] = {1, 5, 2, 0, 3, 6, 4}; std::string sdays []={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"}; MPI_Status estado; char tradmsg[MAX_STRING]; int comm_sz; int my_rank; MPI_Init(NULL, NULL); MPI_Comm_size(MPI_COMM_WORLD, &comm_sz); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); if (my_rank != 0) { nday = ndays[my_rank-1]; char cstr[sdays[nday].size() + 1]; std::strcpy(cstr, sdays[nday].c_str()); sprintf(tradmsg, "Proc_%d traducio %d en %s", my_rank ,nday ,cstr); MPI_Send(tradmsg, strlen(tradmsg) + 1, MPI_CHAR, 0, 0, MPI_COMM_WORLD); } else { printf("Traducciones hechas por los %d procesadores y recibidas por el proc_%d \n" ,comm_sz ,my_rank); for (int q = 1; q < comm_sz; q++) { MPI_Recv(tradmsg, MAX_STRING, MPI_CHAR, q, 0, MPI_COMM_WORLD, &estado); printf("%s \n", tradmsg); } } MPI_Finalize(); return 0; } /* main */ Ejercicio 04: /* ============================================================================ Description : Compile Command: $ mpiCC -g -Wall -o <CodeName> <CodeName.cpp> $ mpiexec ./<CodeName> $ mpiexec -n 10 ./<CodeName> ============================================================================ */ #include "mpi.h" #include <iostream> #include <string> #include <cstring> using namespace std; const int MAX_STRING = 100; int main(int argc, char *argv[]) { MPI_Status estado; int comm_sz; int my_rank; char smSong[MAX_STRING]; int myGrade; double piValue; float dollarValue; long long longValue; MPI_Init(NULL, NULL); MPI_Comm_size(MPI_COMM_WORLD, &comm_sz); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); if (my_rank != 0) { switch (my_rank){ case 1: sprintf(smSong, "Adelante San Marcos Glorioso, Adelante tu siempre ..."); MPI_Send(smSong, strlen(smSong) + 1, MPI_CHAR, 0, 0, MPI_COMM_WORLD); break; case 2: myGrade = 20; MPI_Send(&myGrade, sizeof(myGrade), MPI_INT, 0, 0, MPI_COMM_WORLD); break; case 3: piValue = 3.141516; MPI_Send(&piValue, sizeof(piValue), MPI_DOUBLE, 0, 0, MPI_COMM_WORLD); break; case 4: dollarValue = 3.32f; MPI_Send(&dollarValue, sizeof(dollarValue), MPI_FLOAT, 0, 0, MPI_COMM_WORLD); break; case 5: longValue = 9223372036854775807; MPI_Send(&longValue, sizeof(longValue), MPI_LONG_LONG, 0, 0, MPI_COMM_WORLD); break; } } else { printf("Mensajes recibidos por el proceso_%d \n", my_rank); MPI_Recv(smSong, MAX_STRING, MPI_CHAR, 1, 0, MPI_COMM_WORLD, &estado); std::cout<<"Proc_1 su mensaje es: "<<smSong<<"\n"; MPI_Recv(&myGrade, sizeof(myGrade), MPI_INT, 2, 0, MPI_COMM_WORLD, &estado); std::cout<<"Proc_2 su mensaje es: "<<myGrade<<"\n"; MPI_Recv(&piValue, sizeof(piValue), MPI_DOUBLE, 3, 0, MPI_COMM_WORLD, &estado); std::cout<<"Proc_3 su mensaje es: "<<piValue<<"\n"; MPI_Recv(&dollarValue, sizeof(dollarValue), MPI_FLOAT, 4, 0, MPI_COMM_WORLD, &estado); std::cout<<"Proc_4 su mensaje es: "<<dollarValue<<"\n"; MPI_Recv(&longValue, sizeof(longValue), MPI_LONG_LONG, 5, 0, MPI_COMM_WORLD, &estado); std::cout<<"Proc_5 su mensaje es: "<<longValue<<"\n"; } MPI_Finalize(); return 0; } /* main */
Compartir