我在C中有一个MPI程序。程序的一部分可以达到任意数量的进程。我只想要2个进程来做某事,我希望其余的不要做任何事情。不知道哪个进程id会到达程序的这一部分,所以我不能这样做:
if(rank == 0 || rank == 1) {
// do something
}
// (else do nothing)
虽然排名0和排名1进程可能永远不会到达此处。我知道至少两个进程会在这里到达。
如何在MPI中实现这一目标?
非常感谢:)。
答案 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
。