main(int argc, char** argv) { int my_rank; /* rank do processo atual */ int p; /* numero de processos */ float a; /* intervalo esquerdo */ float b; /* intervalo direito */ int n; /* numero de trapezios */ float h; /* largura da base do trapezio */ float local_a; /*intervalo esquerdo local*/ float local_b; /* intervalo direito local*/ int local_n; /* numero de trapezios local*/ float integral; /* resultado da integral do processo */ float total; /* resultado final da integral */ int source; /* processo que esta enviando o resultado*/ int dest = 0; /* o destino das msgs sera o processo 0*/ int tag = 0; MPI_Status status; float Trap(float local_a, float local_b, int local_n, float h); /* Calcula a integral local */ MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); MPI_Comm_size(MPI_COMM_WORLD, &p); Get_data1(&a, &b, &n, my_rank, p); h = (b-a)/n; local_n = n/p; local_a = a + my_rank*local_n*h; local_b = local_a + local_n*h; integral = Trap(local_a, local_b, local_n, h); if (my_rank == 0) { total = integral; for (source = 1; source < p; source++) { MPI_Recv(&integral, 1, MPI_FLOAT, source, tag, MPI_COMM_WORLD, &status); total = total + integral; } } else { MPI_Send(&integral, 1, MPI_FLOAT, dest, tag, MPI_COMM_WORLD); } if (my_rank == 0) { printf("With n = %d trapezoids, our estimate\n", n); printf("of the integral from %f to %f = %f\n", a, b, total); } MPI_Finalize(); } /* main */
int main(int argc, char** argv){ int my_rank; int p; float a = 0.0; float b = 1.0; int n = 1024; float h; float local_a; float local_b; int local_n; float integral; float total; int source = 0; int dest = 0; int tag = 0; int f; MPI_Status status; float (*functions[2]) (float x); float Trap(float local_a, float local_b, int local_n, float h, float (*f)(float)); functions[0] = square; functions[1] = cube; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); MPI_Comm_size(MPI_COMM_WORLD, &p); if ( my_rank == 0){ printf("Integrate 0. Squared - 1.Cubed\n"); scanf("%d",&f); for(dest = 1;dest <p; dest++) MPI_Send( &f, 1, MPI_FLOAT, dest, tag, MPI_COMM_WORLD); } else{ MPI_Recv( &f, 1, MPI_FLOAT, 0, tag, MPI_COMM_WORLD, &status); } #if TREE_COMMUNICATE Get_data1( &a, &b,&n, my_rank, p); #elif BROADCAST Get_data2( &a, &b,&n, my_rank); #else Get_data( &a, &b,&n, my_rank, p); #endif h = (b-a)/n; local_n = n/p; local_a = a + my_rank*local_n*h; local_b = local_a + local_n*h; integral = Trap(local_a, local_b, local_n, h, functions[f]); #if REDUCE MPI_Reduce(&integral, &total, 1, MPI_FLOAT, MPI_SUM, 0, MPI_COMM_WORLD); #else if( my_rank == 0){ total = integral; for ( source = 1; source < p; source ++){ MPI_Recv(&integral,1, MPI_FLOAT, source, tag, MPI_COMM_WORLD, &status); total = total + integral; } } else{ MPI_Send(&integral, 1, MPI_FLOAT,dest, tag, MPI_COMM_WORLD); } #endif if (my_rank == 0){ printf("With n == %d trapezoids, our estimate \n",n); printf("of the integral from %f to %f == %f \n",a,b,total); } MPI_Finalize(); return 0; }