【问题标题】:MPI_send and MPI_recv functions for multiple processors C++多处理器 C++ 的 MPI_send 和 MPI_recv 函数
【发布时间】:2018-09-11 00:53:28
【问题描述】:

我是 MPI 编程的新手,在我的项目中陷入困境。

我想为以下问题编写 MPI 代码。我不确定 MPI 中的哪些功能是合适的。 问题来了:

处理器 0 有一个二维向量或 Edges={(0,4),(1,5)} 数组。它需要从其他处理器中获取一些信息,这并不总是一个固定的处理器,它取决于设置的边缘。因此,我需要一个如下的for循环:

if(my_rank==0)
{
    for(all pairs (i,j) in Edges)
    {
        send i (or j) to Processor r (r depends on the index i)
        recieve L_r from Processor r
        create (L_i, L_j, min(L_i,L_j)) // want to broadcast to all later.
    }
}

现在,我不确定如何为处理器 r 执行此操作,我应该在 for 循环中执行吗? 请注意,我不能在 if 语句中执行此操作,因为我不知道哪个处理器将是,因此根据处理器的数量,我需要一个我认为不正确的 if 语句。我可能有很多处理器,每个处理器都包含矩阵的某些部分。

需要指出我无法与通信器的子组通信,因为这完全取决于索引,基本上,我想要标签,例如需要与持有它的 P4 通信的索引 (0,4)。

任何想法都值得赞赏。

【问题讨论】:

  • 自定义通讯器,也许?如果您不与 MPI_COMM_WORLD 通信,则必须查看子组。 mpitutorial.com/tutorials/…
  • @SeverinPappadeux 不,我不能,这完全取决于索引,基本上,我想要标签,例如需要与持有它的 P4 通信的索引 (0,4)。
  • 我猜如果您不知道哪个节点将拥有数据,您将不得不围绕短(特定整数)消息和非阻塞 I/O(MPI_Isend () 和 MPI_Irecv() 加上 MPI_Wait)。也许stackoverflow.com/questions/10017301/…?
  • 您能否在启动时将作业特定 (i,j) 链接到节点等级?
  • 在我看来,您应该研究 MPI 的分布式图拓扑。

标签: c++ matrix mpi distributed-computing partitioning


【解决方案1】:

我会这样做:

1) Proc 0 构造一个它必须与之通信的每个进程的列表。

2) Proc 0 将此列表广播给所有进程(或仅广播给他必须与之通信的进程,但这会更复杂,一旦你得到一个可以工作的版本就可以完成)

3) 你执行你的通讯:

如果(rank==0){...}

else if(在列表中排名){...}

【讨论】:

    猜你喜欢
    • 2011-11-11
    • 2015-05-14
    • 2018-09-10
    • 2014-04-17
    • 2011-01-24
    • 2017-10-25
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    相关资源
    最近更新 更多