首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当某个进程找到解决方案时,MPI以广播结束程序

当某个进程找到解决方案时,MPI以广播结束程序
EN

Stack Overflow用户
提问于 2019-02-01 11:54:06
回答 1查看 321关注 0票数 0

我在使用MS-MPI结束我的程序时遇到问题。

所有返回值看起来都很好,但我必须在cmd中使用ctrl +c来结束它(它看起来不像还在计算,所以退出条件看起来很好)。

我想运行一个使用N个进程的程序。当它们中的一个找到解决方案时,它应该将flag设置为false,并将其发送给其他所有人,然后在下一次迭代中,它们都将停止,程序结束。

这个程序实际上做了一些更高级的计算,为了清楚起见,我正在做简化的版本。我只想确保沟通正常。

代码语言:javascript
复制
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并退出。

EN

回答 1

Stack Overflow用户

发布于 2019-02-01 12:03:43

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54472650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档