MPI在某个进程找到解决方案时使用广播结束程序



我在使用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和标志开始,然后在每次(while)传递时,它将其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

(我对这几个额外的值很满意)
但在那之后,我必须用ctrl+c手动终止它。当在1个进程上运行时,它会从1平滑地变为12并退出。

MPI_Bcast()是一个集体操作,通信器的所有列都必须为root参数使用相同的值(在您的程序中,它们都使用不同的值)。

一种有效的方法(尽管不太可能是最佳方法)是向秩0发送终止消息,相应地更新flag,并使所有秩调用MPI_Bcast(..., root=0, ...)

相关内容

最新更新