我正在一个项目中,我需要通过一个仅在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:
如果“运行”等于零,我的程序将终止进程中的某些代码。当前,它会在每次迭代时广播此消息,我认为这会使程序具有不必要的块。我只想在根中更改变量时发送/接收变量。
感谢您的帮助!
编辑:“运行中”是一个全局变量。