使用MS-MPI结束程序时遇到问题。
所有返回值似乎都很好,但我必须在cmd中按ctrl + c结束它(它看起来仍在计算,因此退出条件看起来还不错)。
我想使用N个进程运行一个程序。当其中一个找到解决方案时,应将标志设置为false,将其发送给所有其他解决方案,然后在下一次迭代中,它们将全部停止并且程序结束。
该程序实际上进行了一些更高级的计算,为了清晰起见,我正在开发简化版本。我只是想确保沟通正常。
int main(int argc, char* argv[])
{
MPI_Init(&argc, &argv);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
//sets as 0 -> (N-1) depending on number of processes running
int c = world_rank;
bool flag = true;
while (flag) {
std::cout << "process: " << world_rank << " value: " << c << std::endl;
c += world_size;
//dummy condition just to test stop
if (c == 13) {
flag = false;
}
MPI_Barrier(MPI_COMM_WORLD);
//I have also tried using MPI_Bcast without that if
if(!flag) MPI_Bcast(&flag, 1, MPI_C_BOOL, world_rank, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
} //end of while
MPI_Finalize();
return 0;
}
我认为它如何工作: 它从定义其c和标志的每个进程开始,然后在每次(同时)传递时,将c递增固定的数字。然后,当它达到停止条件时,将标志设置为false并将其发送到所有其余进程。通过4个进程运行它会得到什么:
进程:0值:0
过程:2值:2
过程:1值:1
过程:3值:3
工艺:1值:5
过程:3值:7
程序:0值:4
过程:2值:6
过程:3值:11
工艺:1值:9
工艺:2值:10
进程:0值:8
过程:3值:15
过程:2值:14
流程:0值:12
(我可以使用这几个额外的值)
但是之后,我必须使用ctrl + c手动终止它。在1个进程上运行时,它会从1平稳过渡到12,然后退出。
答案 0 :(得分:0)
MPI_Bcast()
是一个集体操作,所有沟通者必须对root
参数使用 same 值(在您的程序中,它们都使用不同的值)。
一种有效的方法(尽管不太可能是最佳方法)是发送终止消息以排名0
,相应地更新flag
并使所有排名都调用MPI_Bcast(..., root=0, ...)
。