2012-04-17 58 views
4
#include <stdio.h> 
#include <math.h> 
#include <mpi.h> 

int main(int argc, char *argv[]) 
{ 
    int i, done = 0, n; 
    double PI25DT = 3.141592653589793238462643; 
    double pi, tmp, h, sum, x; 

    int numprocs, rank; 
    MPI_Status status; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    if (numprocs < 1) 
     printf("numprocs = %d, should be run with numprocs > 1\n", numprocs); 
    else { 
     while (!done) 
     { 
      if (rank == 0) { 
       printf("Enter the number of intervals: (0 quits) \n"); 
       scanf("%d",&n); 
      } 
      if (n == 0) break; 

      MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); 

      h = 1.0/(double) n; 
      sum = 0.0; 
      for (i = 1 + rank; i <= n; i+=numprocs) { 
       x = h * ((double)i - 0.5); 
       sum += 4.0/(1.0 + x*x); 
      } 

      MPI_Reduce(&sum, &tmp, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); 
      if (rank == 0) { 
       pi = h * tmp; 
       printf("pi is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT)); 
      } 
     } 
    } 
    MPI_Finalize(); 
} 

我运行此程序与10的进程数=和在scanf输入0( “%d”,& n)的后;该程序似乎没有最终确定,我必须用Ctrl + C关闭它。杀死MPI_Finalize()不定型

10个总进程(一些可能通过清理过程中的mpirun) 的mpirun:清洁终止完成

显示于控制台杀死过程之后。

回答

5

好吧,当然。再看一下是怎么回事:

 if (rank == 0) { 
      printf("Enter the number of intervals: (0 quits) \n"); 
      scanf("%d",&n); 
     } 
     if (n == 0) break; 

     MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); 

如果秩0输入“0”,则排名0休息,但所有其他队伍有什么他们不得不在正最后时间左右(或在的情况下,第一次迭代,无论什么东西都在那个内存位置)。所以排名1(N-1)输入MPI_Bcast,耐心等待参加广播以找出什么是n,同时排名0已退出循环,并且坐在MPI_Finalize想知道其他人在哪里。

你只需要翻转这些线路:

 MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); 
     if (n == 0) break; 

现在大家决定是否要在同一时间跳出循环。

+0

谢谢,我已经知道它与待处理的请求有关,但是因为我在做Bcast-Reduce对,我不知道“丢失”消息的位置。谢谢! – Shadark 2012-04-17 17:30:12

+0

@Jonathan Dursi感谢您在mpi标记中的完整答案。 – peaceman 2012-04-18 12:40:21

+0

不客气! – 2012-04-18 19:39:53

0

你有一个无尽的while循环,所以MPI_Finalize()不能执行。

+1

为什么你坚持回答已经有有效的,被接受的答案的旧问题? – talonmies 2012-04-30 13:39:37

+0

,因为我认为这些答案不好 – yyfn 2012-05-02 09:44:47

+0

也许你可以解释你认为你的一个句子的答案比这个问题接受的答案更好吗? – talonmies 2012-05-02 19:22:33