Logo Studenta

guia 03

¡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.º 03 
 
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 de cálculos geométricos 
usando el MPI_Bcast, MPI_Reduce y el MPI_RecuAll en el IDE Eclipse for 
Parallel Aplication Developers . 
 
 
2. EJERCICIOS: 
 
Se implementará códigos de cálculos geométricos usando el MPI_Bcast, 
MPI_Reduce y el MPI_RecuAll en el IDE Eclipse for Parallel Aplication 
Developers: 
 
Ejercicio 01: 
 
/* 
Realizar un programa que calcule de PI en forma secuencial 
*/ 
 
 
#include <math.h> 
#include <cstdlib> // Incluido para el uso de atoi 
#include <iostream> 
using namespace std; 
 
 
 
 
int main(int argc, char *argv[]) { 
 
 
 int n; 
 cout << "introduce la precision del calculo (n > 0): "; 
 cin >> n; 
 double PI25DT = 3.141592653589793238462643; 
 double h = 1.0 / (double) n; 
 double sum = 0.0; 
 for (int i = 1; i <= n; i++) { 
 double x = h * ((double) i - 0.5); 
 sum += (4.0 / (1.0 + x * x)); 
 cout<<endl<<x; 
 } 
 double pi = sum * h; 
 cout << "El valor aproximado de PI es: " << pi << ", con un error de " 
 << fabs(pi - PI25DT) << endl; 
 return 0; 
 
} 
 
Ejercicio 02: 
 
/* 
Description : Paralelizar el cálculo de la aproximación del número PI indicando un factor 
de precisión. El numero PI se define como la integral 0 a 1 de 4/(1+x*x), es decir, el área 
que forma. La aproximación de una integral mediante la suma de Riemann permite 
dividir el trabajo en unidades independientes, siendo un factor de precisión el número de 
divisiones. El factor de precisión puede pedirlo el proceso 0 y repartirlo a los otros 
procesos mediante MPI_Bcast. Despues de que cada proceso calcule su parte se han de 
reunir todas las partes en el proceso 0 para mostrar el resultado con MPI_Reduce. 
 
Compile Command: 
 $ mpiCC -g -Wall -o <CodeName> <CodeName.cpp> 
 $ mpiexec ./<CodeName> 
 $ mpiexec -n 10 ./<CodeName> 
*/ 
 
#include <math.h> 
#include "mpi.h" 
#include <cstdlib> 
#include <iostream> 
using namespace std; 
 
 
 
 
int main(int argc, char *argv[]) 
{ 
 int n, 
rank, 
 size 
 double PI25DT = 3.141592653589793238462643; 
 double mypi, 
 pi, 
 h, 
 sum; 
 
 MPI_Init(&argc, &argv); 
 MPI_Comm_size(MPI_COMM_WORLD, &size); 
 MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
 
 if (rank == 0) { 
 cout<<"introduce la precision del calculo (n > 0): "; 
 cin>>n; 
 } 
 
 MPI_Bcast(&n, 
 1 
 MPI_INT, 
 0, 
 MPI_COMM_WORLD); 
 if (n <= 0){ 
 MPI_Finalize(); 
 exit(0); 
 }else { 
 
 h = 1.0 / (double) n; 
 sum = 0.0; 
 for (int i = rank + 1; i <= n; i += size) { 
 double x = h * ((double)i - 0.5); 
 sum += (4.0 / (1.0 + x*x)); 
 cout<<endl<<x; 
 } 
 mypi = h * sum; 
 
 MPI_Reduce(&mypi, 
 &pi, 
 1, 
 MPI_DOUBLE, 
 MPI_SUM, 
 0, 
 MPI_COMM_WORLD); 
 
 if (rank == 0) 
 cout << "El valor aproximado de PI es: " << pi 
 << ", con un error de " << fabs(pi - PI25DT) 
 << endl; 
 } 
 
 
 MPI_Finalize(); 
 return 0; 
}

Continuar navegando