我有第一个进程(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;
}
答案 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
再见,
弗朗西斯