Tengo el siguiente fragmento de código en C++ que básicamente calcula el pi usando la técnica clásica de monte carlo.¿El bloqueo MPI_Reduce (o una barrera natural)?
srand48((unsigned)time(0) + my_rank);
for(int i = 0 ; i < part_points; i++)
{
double x = drand48();
double y = drand48();
if((pow(x,2)+pow(y,2)) < 1){ ++count; }
}
MPI_Reduce(&count, &total_hits, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
if(my_rank == root)
{
pi = 4*(total_hits/(double)total_points);
cout << "Calculated pi: " << pi << " in " << end_time-start_time << endl;
}
Me pregunto si la llamada MPI_Barrier es necesaria. ¿MPI_Reduce se asegura de que el cuerpo de la instrucción if no se ejecutará antes de que la operación de reducción esté completamente terminada? Espero que estuviera claro. Gracias
El estándar MPI permite la salida anticipada de los procesos participantes. La única llamada colectiva que garantiza la sincronización es 'MPI_Barrier'. –