Parallel processing MPI:是否有一种方法仅在变量发生变化时才接收变量?

Parallel processing MPI:是否有一种方法仅在变量发生变化时才接收变量?,parallel-processing,mpi,Parallel Processing,Mpi,我正在从事一个项目,在这个项目中,我需要通过一个只在MPI程序的根进程中更改的变量来实现某种终止检测 我正在努力理解阻塞指令和非阻塞指令的概念 简而言之,只有根进程可以确定任务是否已完成。这是通过实现一个名为“running”的简单布尔整数变量来实现的。这必须广播到所有进程,以便它们知道何时退出while循环 所有进程都在自己的while循环中运行。在开始时,根进程会根据需要将“running”变量设置为true。 然后,根进程可以确定“running”变量是否应设置为零,并将其广播给所有其他进

我正在从事一个项目,在这个项目中,我需要通过一个只在MPI程序的根进程中更改的变量来实现某种终止检测

我正在努力理解阻塞指令和非阻塞指令的概念

简而言之,只有根进程可以确定任务是否已完成。这是通过实现一个名为“running”的简单布尔整数变量来实现的。这必须广播到所有进程,以便它们知道何时退出while循环

所有进程都在自己的while循环中运行。在开始时,根进程会根据需要将“running”变量设置为true。
然后,根进程可以确定“running”变量是否应设置为零,并将其广播给所有其他进程

目前,我正在使用广播来共享此变量。因此,每当循环到达其终点(或“running”设置为零)时,它就会向所有进程广播该值。因此,每个进程的函数内部都有一个广播来接收值。
我要么误解了阻塞的概念,要么我的程序效率低下。
广播是阻塞的,因此,如果根继续广播在大部分运行时间基本保持不变(TRUE)的变量,则每个进程基本上必须等待根完成其工作,然后阻塞,然后该进程才能继续其未来的工作

问题在于,由于此变量在根进程中只更改一次,因此在运行时会发生许多不必要的块。我只希望变量变为零后广播,这样我就可以告诉其他进程终止部分代码,而不必每次都等待根进程广播

if(myRank != 0) {
    while(running) {
        doThisFunction(myRank);
        MPI_Broadcast(... running ...); //Wait for root to broadcast?
    }
    /* Start doing something else */
} else {
    while(running || ... ) {
        /* Do stuff */
        if (...) {
            running = 0; //Somewhere in an if statement
            MPI_Broadcast(... running ...); //Now terminate the while
        }
        MPI_Broadcast(... running ...); //Unnecessary broadcast?
    }
}
我想我可以使用MPI_IProbe来检查是否有消息要接收,然后删除root的while循环中的MPI_广播。如果存在,则进程将启动MPI_广播。如果没有,那么它将继续正常运行

TL;博士:
如果“running”等于零,我的程序会终止进程中的一些代码。目前,它在每一次迭代中都会广播这个消息,我认为这会导致程序有一个不必要的块。我只想在根目录中更改变量时发送/接收该变量

谢谢你的帮助


编辑:“running”是一个全局变量。

以前也曾问过类似的问题
MPI\u Ibcast()
+
MPI\u Test()
是一个选项
MPI\u Put()
是另一个。