只获得两个进程来在MPI中执行代码 - 不知道哪些进程会进入代码段

时间:2011-07-24 18:34:44

标签: c mpi

我在C中有一个MPI程序。程序的一部分可以达到任意数量的进程。我只想要2个进程来做某事,我希望其余的不要做任何事情。不知道哪个进程id会到达程序的这一部分,所以我不能这样做:

if(rank == 0 || rank == 1) { 
  // do something
}
// (else do nothing)

虽然排名0和排名1进程可能永远不会到达此处。我知道至少两个进程会在这里到达。

如何在MPI中实现这一目标?

非常感谢:)。

2 个答案:

答案 0 :(得分:2)

单独启动两个进程,您必须编写代码才能到达那里,然后使用等级确定。

编辑:在所有进程中创建一个共享整数,一个进程在到达该代码补丁时将递增,下一个进程也是如此,并使用if条件标记相关代码,这样除非共享整数,小于2。

答案 1 :(得分:2)

设置等级0(或等级n-1)作为“控制等级”。这个等级将持有两个魔法标记来控制进入临界区。

MPI_IRecv上使用MPI_ANY_SOURCE。到达关键代码部分的每个等级都会MPI_Send将0到ID自己排在关键部分。然后排名0将MPI_Send并且关键部分的排名将MPI_Recv成为标记。达到关键代码的前两个等级将被发送一个“前进”令牌。发送任何其他排名“不要打扰”令牌。

在运行结束时,会有一个不匹配的MPI_IRecv。在MPI_Irecv输入之前,可以取消MPI_Finalize