【问题标题】:Is it possible to ignore/throw out received data in MPI_Allgather?是否可以忽略/丢弃 MPI_Allgather 中接收到的数据?
【发布时间】:2012-03-31 02:02:27
【问题描述】:

在 MPI 中,是否可以立即丢弃接收到的数据而不分配缓冲区来保存它?我正在使用 MPI_Allgather 从多个进程收集数据,但在某些时候,一个或多个进程没有要发送的有用数据。

我最初的解决方案是让无用的过程完成。但是,如果一个任务在没有调用 MPI_Allgather 的情况下终止,则其余任务将陷入死锁,因为 MPI_Allgather 阻塞。为了克服这个问题,我将所有进程保留到最后,但发送从未使用过的垃圾数据。

有用的进程会保留一些接收到的数据,但无用的进程不会。我尝试像这样为 recbuf 传递一个空指针:

MPI_Allgather(&sendbuf, 1, MPI_INT, 0, 1, MPI_INT, MPI_COMM_WORLD);

但它没有用。我能做些什么来避免接收或至少存储无用的数据吗?

【问题讨论】:

    标签: c++ c mpi parallel-processing


    【解决方案1】:

    您可以为有用的进程创建一个新组并聚集在该组而不是MPI_COMM_WORLD

    【讨论】:

    • +1 这是实现仅涉及所有进程的子集的集体通信的正确方法。如果非通信进程仍需要与其他进程同步,则可能还需要屏障。
    【解决方案2】:

    根据定义,集合是集合,这意味着通信器中的每个进程都必须调用它们。如果您需要对通信器的子集执行集体调用,则必须按照已经建议的那样创建一个新的通信器。

    您还可以查看MPI_Allgatherv,看看它是否适合您的应用程序。使用这个集合,您可以指定每个进程将发送多少数据。但是,通信器中的每个进程仍然必须调用MPI_Allgatherv,即使是那些不发送数据的进程。除此要求外,所有进程都必须知道每个进程贡献了多少数据。

    最后,MPI 3 很可能会包含稀疏的集合操作,这些操作完全符合您的要求。但就目前而言,新的沟通者可能是最好的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 2021-10-01
      • 2017-10-08
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      相关资源
      最近更新 更多