当某些进程找到解决方案时,MPI 结束程序与广播
Posted
技术标签:
【中文标题】当某些进程找到解决方案时,MPI 结束程序与广播【英文标题】:MPI end program with Broadcast when some process finds a solution 【发布时间】:2019-02-01 03:54:06 【问题描述】:我在使用 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 递增一个固定数字。然后当它到达停止条件时,它将标志设置为假并将其发送到所有剩余的进程。当我用 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 平稳地退出并退出。
【问题讨论】:
【参考方案1】:MPI_Bcast()
是一个集体操作,所有通信者的等级都必须为root
参数使用相同 值(在您的程序中,它们都使用不同的值)。
一种有效的方法(虽然不太可能是最佳方法)是发送终止消息到排名0
,相应地更新flag
,并让所有排名调用MPI_Bcast(..., root=0, ...)
。
【讨论】:
以上是关于当某些进程找到解决方案时,MPI 结束程序与广播的主要内容,如果未能解决你的问题,请参考以下文章