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

时间:2019-04-28 14:40:14

标签: parallel-processing mpi

我正在一个项目中,我需要通过一个仅在MPI程序的根过程中才发生变化的变量来实现某种终止检测。

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

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

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

当前,我正在使用广播方式共享此变量。因此,每当循环到达终点(或“运行”设置为零)时,它将向所有进程广播该值。因此,每个进程在其功能内部都有一个广播,以接收该值。
我误解了阻塞的概念,或者我的程序效率不高。
广播正在阻塞,因此,如果根在大多数运行时间中都继续广播本质上保持相同(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来检查是否有消息要接收,然后在根的while循环中删除MPI_Broadcast。如果存在,则该过程将启动MPI_Broadcast。如果没有,它将继续正常运行。

TL; DR:
如果“运行”等于零,我的程序将终止进程中的某些代码。当前,它会在每次迭代时广播此消息,我认为这会使程序具有不必要的块。我只想在根中更改变量时发送/接收变量。

感谢您的帮助!

编辑:“运行中”是一个全局变量。

0 个答案:

没有答案