gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:39:20 25 4
gpt4 key购买 nike

我有第一个进程 (test1),它动态生成第二个进程 (test2),然后等待从生成的组接收带有标记 1 的消息。生成的进程执行一些计算,然后向父组(包含第一个进程)发送一 strip 有标记 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;
}

最佳答案

在您的 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

再见,

弗朗西斯

关于c - MPI_Finalize 在动态生成的进程中挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21831730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com