【问题标题】:Optimal Way to Send Recv to multiple processes in MPI在 MPI 中将 Recv 发送到多个进程的最佳方式
【发布时间】:2013-07-23 06:26:55
【问题描述】:

我的具体问题如下: 假设我有 4 个工人和 1 个主进程。我想将每个工人的消息发送给所有其他工人。 (从工人1到2,3,4;从进程2到1,3,4等)

我不关心消息发送的顺序,但我关心性能。我发送的数据非常大,可能以千兆字节为单位。

我目前正在使用 Isend 和 Recv,但不断收到分段错误。我尝试使用 Sendrecv,但那些似乎只是挂在中间,可能是由于死锁。所以我想知道在多个进程之间发送和接收的最佳方式是什么。

这是我当前的代码:

for(int id  = 1; id < num_processes; id++) { 
    // Some computation with the vector vec //
    MPI_Request request;
    if(id != myId)
        MPI_Isend(&vec.front(), vec.size(), mpi_bid, id, 1, MPI_COMM_WORLD, &request);
}

然后用于接收。

for(int id = 1; id < num_processes; id++) {
    MPI_Request request2;
    if(id != myID)
        MPI_Recv(&recvVec.front(), some_large_value, mpi_bid, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD, &request2);
}

感谢任何帮助!

【问题讨论】:

  • 您描述的数据模式是 MPI_Alltoall 或 MPI_Alltoallv。您为什么不使用该集体进行此操作?
  • 谢谢!如果我要发送的矢量有不同的长度,它会起作用吗?似乎 alltoall 为所有进程发送相同的长度。
  • MPI_Alltoallv 用于不同大小的向量。还要注意MPI_Recv 的最后一个参数是MPI_Status 类型而不是MPI_Request。也许您打算改用MPI_Irecv

标签: c++ debugging parallel-processing mpi


【解决方案1】:

如果您遇到段错误,您的问题可能不是以最佳方式进行数据传输。你可能在其他地方也有问题。您可能想尝试使用调试器来弄清楚发生了什么。您可以在此处 (How do I debug an MPI program?) 看到有关 MPI 调试的重要帖子。如果您特别想要一个免费的调试器,您可以随时使用 GDB(如果您不知道如何操作,请参阅 this answer)。

【讨论】:

    猜你喜欢
    • 2019-12-30
    • 1970-01-01
    • 2020-05-02
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    相关资源
    最近更新 更多