我在使用MS-MPI结束我的程序时遇到问题。
所有返回值看起来都很好,但我必须在cmd中使用ctrl +c来结束它(它看起来不像还在计算,所以退出条件看起来很好)。
我想运行一个使用N个进程的程序。当它们中的一个找到解决方案时,它应该将flag设置为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和标志的每个进程开始,然后在每次(while)传递时,它将其c递增一个固定的数字。然后,当它达到停止条件时,它将flag设置为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并退出。
发布于 2019-02-01 12:03:43
MPI_Bcast()是一个集合操作,通信器的所有级别都必须使用same值作为root参数(在您的程序中,它们都使用不同的值)。
一种有效的方法(尽管不太可能是最优的方法)是发送终止消息给等级0,相应地更新flag,并使所有等级调用MPI_Bcast(..., root=0, ...)。
https://stackoverflow.com/questions/54472650
复制相似问题