【问题标题】:Getting only two processes to execute code in MPI - don't know which processes will get to code segment though只让两个进程在 MPI 中执行代码 - 虽然不知道哪些进程会进入代码段
【发布时间】:2011-10-12 03:16:25
【问题描述】:

我有一个 C 语言的 MPI 程序。程序的一部分可以访问任意数量的进程。我只希望 2 个进程做某事,而我希望其余的不做任何事情。不知道哪个进程 ID 会到达程序的这一部分,所以我不能这样做:

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

rank-0 和 rank-1 进程可能永远不会到达这里。我确实知道至少两个进程会到达这里。

如何在 MPI 中实现这一点?

非常感谢:)。

【问题讨论】:

  • 您能告诉我们更多关于基本问题的信息吗?为什么超过 2 个进程做一件事会不好?让“额外”进程执行某些任务的额外成本可能低于避免它所需的同步成本。

标签: c mpi


【解决方案1】:

分别启动两个必须编码才能到达那里的进程,然后使用排名确定。

编辑:在所有进程中创建一个共享整数,一个进程在到达该代码补丁时将递增,下一个进程也将递增,并用 if 条件标记有问题的代码,因此除非共享,否则它不会运行整数,小于 2。

【讨论】:

  • 不,不能那样做!我开始了一系列流程,它们都开始做完全相同的事情,并逐渐开始分支做出不同的选择。由于这个分支,我不知道哪些进程会得到这个函数。抱歉.. 好主意,但不是我的问题。
  • stackoverflow.com/questions/4948788/… 的回答中,有实现这样一个计数器的代码。
【解决方案2】:

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

MPI_ANY_SOURCE 上使用MPI_IRecv。到达关键代码部分的每个等级都将MPI_Send 将等级 0 标识为已到达关键部分。然后排名 0 将 MPI_Send 和临界区的排名将 MPI_Recv 一个令牌。到达关键代码的前两个等级将被发送一个“继续”令牌。向任何其他等级发送“请勿打扰”令牌。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2017-04-25
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2019-05-25
    相关资源
    最近更新 更多