Esempio n. 1
0
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;  
}