Logo Studenta

guia 02

¡Estudia con miles de materiales!

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 */

Continuar navegando

Materiales relacionados

58 pag.
Ejercicios básicos de programación

IPN

User badge image

Andrés Palma Martín

14 pag.
ExamExtraordSSOOjun2010v240610

User badge image

Materiales Generales

122 pag.
02-C

User badge image

Aprenda aquí