当某些进程找到解决方案时,带有广播的MPI最终程序

时间:2019-02-01 03:54:06

标签: c++ mpi ms-mpi

使用MS-MPI结束程序时遇到问题。
所有返回值似乎都很好,但我必须在cmd中按ct​​rl + 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,然后退出。

1 个答案:

答案 0 :(得分:0)

MPI_Bcast()是一个集体操作,所有沟通者必须对root参数使用 same 值(在您的程序中,它们都使用不同的值)。

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