MPI_Waitany不等待某些进程

时间:2017-10-04 01:01:04

标签: c mpi openmpi

我正在尝试使用mpi创建动态进程,但是我遇到了从子进程接收响应的问题。我创建了一个名为sum_partial的向量来存储每个孩子的结果。当我运行4个进程(1个父进程+ 3个子进程)时,这可以正常工作。但是当我运行更多进程时,sum_partial不会得到一些孩子的结果。

我不确定问题是MPI_Irecv还是MPI_Waitany。我尝试过使用MPI_Wait,MPI_Waitall,MPI_Test的其他方法。然而,问题重演了。

这是我在父进程中使用的MPI代码块。

//Some code here...

for(j=0;j<num_Proc;j++){
    sprintf(argv[2], "%llu", vetIni[j+1]);
    sprintf(argv[3], "%llu", vetEnd[j+1]);
    MPI_Comm_spawn(bin, argv, 1, localInfo, 0, MPI_COMM_SELF, &intercommChild[j], err);
}

long long int sum_local=0, *sum_partial = calloc(num_Proc, sizeof(long long int));

for(j=0;j<num_Proc;j++)
    MPI_Irecv(&sum_partial[j], 1, MPI_LONG, 0, 99, intercommChild[j], &req[j]);

long long int ini = vetIni[0], end = vetEnd[0];

for(i=ini;i<end;i++)
    sum_local += i * (N-i); //Parent process do it's computation

for(j=0;j<num_Proc;j++){
    MPI_Waitany(num_Proc, req, &source, MPI_STATUS_IGNORE);
    sum_local += sum_partial[j]; //Sum all results
}

MPI_Finalize();

以下是子进程运行的代码。

//Some code here...

long long int ini = atol(argv[2]);
long long int end = atol(argv[3]);
long long int sum=0, i;

for(i=ini;i<end;i++)
    sum += i*(N-i);

MPI_Send(&sum, 1, MPI_LONG, 0, 99, intercommPai);

MPI_Finalize();

如果我打印与7个孩子一起运行的sum_partial,它将类似于:

-8393498447644280608
4191132954560973024
0
0
-3708736119148578592
9184626552355719392
-903258050952161056

这些零不应该在那里。其他结果是正确的。

任何人都可以确定我的代码中存在的问题吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

这是你在主人身上的循环

for(j=0;j<num_Proc;j++){
    MPI_Waitany(num_Proc, req, &source, MPI_STATUS_IGNORE);
    sum_local += sum_partial[j]; //Sum all results
}

所以在迭代j你等待来自任何任务的数据,但是你隐含地假设已收到来自任务j的数据(例如你访问sum_partial[j])。

你可以

for(j=0;j<num_Proc;j++){
    MPI_Wait(&req[j], MPI_STATUS_IGNORE);
    sum_local += sum_partial[j]; //Sum all results
}

或更可能

for(j=0;j<num_Proc;j++){
    MPI_Waitany(num_Proc, req, &source, MPI_STATUS_IGNORE);
    sum_local += sum_partial[source]; //Sum all results
}

为了清楚起见,你认为它确实做到了&#34;工作&#34;有4个任务,但你很幸运。