#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:清洁终止完成
显示于控制台杀死过程之后。
谢谢,我已经知道它与待处理的请求有关,但是因为我在做Bcast-Reduce对,我不知道“丢失”消息的位置。谢谢! – Shadark 2012-04-17 17:30:12
@Jonathan Dursi感谢您在mpi标记中的完整答案。 – peaceman 2012-04-18 12:40:21
不客气! – 2012-04-18 19:39:53