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.º 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; }
Compartir