MPI_Finalize在动态生成的进程中挂起

时间:2014-02-17 14:32:37

标签: c mpi

我有第一个进程(test1),它动态生成第二个进程(test2),然后等待从生成的组中接收带有标记1的消息。 生成的进程执行一些计算,然后将带有标记1的消息发送到父组(包含第一个进程)以表示它已完成,最后调用MPI_Finalize。 第一个进程正确接收消息并继续,但第二个进程在MPI_Finalize中挂起。 我不明白是什么阻止了第二个进程终止。

测试1

#include <stdio.h>
#include "mpi.h"

int main() {
int flag_mpi, erc, err_mpi, ndr;
MPI_Comm comm;

MPI_Initialized (&flag_mpi);
if (!flag_mpi) MPI_Init (NULL,NULL);

err_mpi = MPI_Comm_spawn("test2", MPI_ARGV_NULL, 1, MPI_INFO_NULL,
        0, MPI_COMM_WORLD, &comm, &erc);

MPI_Recv(&ndr, 1, MPI_INT, 0, 1, comm, MPI_STATUS_IGNORE);
printf("  Spawn_recv ok (ndr=%d)\n", ndr);

int i = 1;
while (i == 1) {  /* just to simulate further computation */
    printf(".");
    sleep(5);
}

MPI_Initialized (&flag_mpi);
if (flag_mpi) MPI_Finalize();
return 0;
}

测试2

#include <stdio.h>
#include "mpi.h"

int main() {
int ndr;
MPI_Comm comm;
MPI_Init (NULL,NULL);

    /* some computation not involving MPI */

MPI_Comm_get_parent(&comm);

ndr = 1;
MPI_Send(&ndr, 1, MPI_INT, 0, 1, comm);
printf("  Spawn_sent ok (ndr=%d)\n", ndr);

MPI_Finalize();
return 0;
}

1 个答案:

答案 0 :(得分:0)

while循环中,i不会改变。这可以解释您的代码永远不会结束。您的代码似乎与mpiexec -n 1 test1

一起使用

如果使用mpiexec -n 2 test1,则会创建两个进程,processus 0将生成一个进程。问题是第二个进程将等待消息......

我建议修改:

 int rank;
 MPI_Comm_rank(MPI_COMM_WORLD,&rank);
 if(rank==0){
     MPI_Recv(&ndr, 1, MPI_INT, 0, 1, comm, MPI_STATUS_IGNORE);
     printf("  Spawn_recv ok (ndr=%d)\n", ndr);
 }

等等:

 int i = 30;
 while (i != 1) {  /* just to simulate further computation */
     printf(".");
     sleep(1);
     i--;
 }
编辑:我误解了这个问题......所以这里有一个更好的答案:你可以在test1.c和test2.c中添加MPI_Comm_disconnect(&comm);来关闭进程之间的连接!这样,生成的进程将不会等待第一个进程MPI_Finalize() ...

http://www.mcs.anl.gov/research/projects/mpi/www/www3/MPI_Comm_disconnect.html

再见,

弗朗西斯