程序不会接受用户的输入来再次循环自身。

时间:2018-07-25 23:11:39

标签: c mpi

我这里有这段代码,它可以进行计算,但是它不需要用户的输入才能再次执行循环并再次为用户计算或取消。函数以if(rank == 0){...}结束。我需要帮助找出我想念的是什么

#include <math.h> //include files
#include <stdio.h>
#include "mpi.h"

void printit()
{
   printf("\n*********************************\n");
   printf("Welcome to the pi calculator!\n");
   printf("Programmer: K. Spry\n");
   printf("You set the number of divisions\n");
   printf("for estimating the integral: \n\tf(x)=4/(1+x^2)");
   printf("\n");
   printf("*********************************\n");
}                      //end printit
                                                          //function prototypes

int main(int argc, char* argv[])
{
   double actual_pi = 3.141592653589793238462643;
                                                                               //for comparison later
   int n, rank, num_proc, i;
   double temp_pi, calc_pi, int_size, part_sum, x;
   char response = 'y';
   MPI_Init(&argc, &argv);
   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
   MPI_Comm_size(MPI_COMM_WORLD, &num_proc);
   if (rank == 0)
   {
        printit();
   }             /* I am root node, print out welcome */

   while (response == 'y')
   {
      if (rank == 0)
      {            /*I am root node*/
         printf("__________________________________\n");
         printf("\nEnter the number of intervals: (0 will exit)\n");
         n = fgetc(stdin);
      }

      else
      {
         int_size = 1.0 / (double) n;                  //calcs interval size
         part_sum = 0.0;

         for (i = rank * n / num_proc; i <= (rank + 1)* n / num_proc; i += 1)
         {                                                         //calcs partial sums
              x = int_size * ((double)i - 0.5);
              part_sum += (4.0 / (1.0 + x*x));
         }
         temp_pi = int_size * part_sum;
                                       //collects all partial sums computes pi

         MPI_Reduce(&temp_pi,&calc_pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
         if (rank == 0)
         {                                                     /*I am server*/
            printf("pi is approximately %f", calc_pi);
            printf(". Error is %f", fabs(calc_pi - actual_pi));
            printf("\n");
            printf("_______________________________________");
            printf("\n");
         }
      }                                                                        //end else
     if (rank == 0)
     { /*I am root node*/
        printf("\nCompute with new intervals? (y/n)\n");
        response = fgetc(stdin);
     }
   } //end while
   MPI_Finalize();                                             //terminate MPI
   return 0;
}

我遇到的问题是在循环内是否if询问用户以新的间隔进行计算,用户将输入Y或N进行响应。问题是当用户进行输入时,它将停止工作并且永不循环。

1 个答案:

答案 0 :(得分:0)

根据您的编码,它的行为应该是:-)。 ptb的评论是您的问题的答案。...但是,让我们:-)。

while (response == 'y')
{
  if (rank == 0)
  {  /*I am root node*/
     printf("__________________________________\n");
     printf("\nEnter the number of intervals: (0 will exit)\n");
     n = fgetc(stdin);
  }
  /* here we have to: broadcast to all processes the value of response
     in fact all processes have to wait that root get the new value and then
     get this value from the root. Fortunately MPI_Broadcast is a blocking
     opperation, so no MPI_Barrier are needed...*/
  MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);

  /* then your computation is done by every processes (in fact in your interval
     boundaries you indeed take that process 0 has the first interval... i am not 
     sure your math a correct, I did not check them) */

  int_size = 1.0 / (double) n;                  //calcs interval size
  part_sum = 0.0;

  for (i = rank * n / num_proc; i <= (rank + 1)* n / num_proc; i += 1)
  {                                                         //calcs partial sums
    x = int_size * ((double)i - 0.5);
    part_sum += (4.0 / (1.0 + x*x));
  }
  temp_pi = int_size * part_sum;
  //collects all partial sums computes pi
  MPI_Reduce(&temp_pi,&calc_pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

  if (rank == 0)
  {                                                     /*I am server*/
     printf("pi is approximately %f", calc_pi);
     printf(". Error is %f", fabs(calc_pi - actual_pi));
     printf("\n");
     printf("_______________________________________");
     printf("\n");
  }

  if (rank == 0)
  { /*I am root node*/
    printf("\nCompute with new intervals? (y/n)\n");
    response = fgetc(stdin);
  }
  /* here we have to: broadcast to all processes the value of response
     in fact all processes have to wait that root get the new value and then
     get this value from the root. Fortunately MPI_Broadcast is a blocking
     opperation, so no MPI_Barrier are needed..., lol same than with n...*/
  MPI_Bcast(&response,1,MPI_CHAR,0,MPI_COMM_WORLD);    
} //end while

我没有尝试编译...所以可能有一些错别字...