Práctica: Calculo con Open2

Utilizando una versión similar al programa C presentado en la sección 3.14.1 que calcula una parte de la suma de la integral

$\displaystyle \int_{0}^{1} \frac{4}{(1+x^2)} dx = 4 \arctan(x) \vert _{0}^{1} = 4 ( \frac{\pi}{4} - 0) = \pi $    

y usando comunicaciones bidireccionales usando manejadores abiertos con open2 escriba una nueva versión distribuida del cálculo de $ \pi $ . Una posible versión en C++ es la siguiente:

#include <iostream>

using namespace std;

int main(){
  int id, numInt, numProc, i;
  double suma;
  cin >> id >> numInt >> numProc;
  suma = 0;
  for (i = id; i < numInt; i += numProc){
    suma += (4 / ((1 + (((i + 0.5)/numInt)*((i + 0.5)/numInt)))));
  }
  suma = suma / numInt;
  //Haciendo que cada uno dure distintos tiempos
  //srand(time(NULL));
  //int espera = 1+(int) (10.0*rand()/(RAND_MAX+1.0)) + id;
  //sleep(espera);
  cout.precision(10);
  cout  << suma << endl << flush;
}
El proceso padre enviará los datos de la tarea a los hijos y recibirá los resultados usando los manejadores proveídos por open2. El número de tareas $ t$ y el número de intervalos $ N$ se enviarán a través del manejador al programa.

Use comunicaciones sin buffers y sin bloqueo. Utilice IO::Select en el procesador 0 para determinar que canales están listos para recibir. Perturbe artificialmente los tiempos de espera de cada proceso con sleep y observe que sucede.

Casiano Rodríguez León
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19