【问题标题】:MPI Gather From SELECT Processors Only仅从 SELECT 处理器收集 MPI
【发布时间】:2013-08-09 15:04:29
【问题描述】:

我正在 MPI 中寻找一个类似于 allgather 的函数,只是它只从所有处理器的某个子集收集数据。

此外,我想按不依赖于处理器等级的顺序组合数据。

有这样的功能吗?如果没有,如何有效地实现这一点?

谢谢!

【问题讨论】:

    标签: c parallel-processing mpi


    【解决方案1】:

    您的问题基本上有两种解决方案。第一个解决方案是创建一个通信器,将必须发送数据的节点放置在其中;但是,这不允许您打乱收集的数据。第二种解决方案是使用 MPI_Gatherv 而不是 MPI_Gather。

    MPI_Gatherv 的作用与 MPI_Gather 相同,但您指定从每个处理器收集多少元素以及放置它们的位置。考虑例如您可能希望收集进程 0 的 2 个值、进程 1 的 3 个值、进程 2 的无值和进程 3 的 1 个值。

    然后您必须使用以下参数调用 MPI_Gatherv(我将数组放在方括号中,因此这是无效代码;mycount 是当前进程必须发送的元素数,因此进程 0 将是 2 , 3 代表进程 1,...):

    MPI_Gatherv(sendbuffer, mycount, type,
        recvbuffer, [2, 3, 0, 1], [0, 2, 5, 5], type,
        root, comm)
    

    注意第二个数组,参数“displs”指定recvbuffer中的偏移量,从相应的进程接收到的元素将被保存在这里:

    ProcID    Portion    Size
      0       [0, 2)      2
      1       [2, 5)      3
      2       [5, 5)      0
      3       [5, 6)      1
    

    如果您喜欢,例如要以相反的顺序存储值,即来自进程 3 的值位于开头,而来自进程 0 的值位于末尾,您应该改为:

    MPI_Gatherv(sendbuffer, mycount, type,
        recvbuffer, [2, 3, 0, 1], [4, 1, 1, 0], type,
        root, comm)
    

    这样,“职业计划”看起来像:

    ProcID    Portion    Size
      0       [4, 6)      2
      1       [1, 4)      3
      2       [1, 1)      0
      3       [0, 1)      1
    

    如果你想要一个随机分布,你将“只是”必须随机生成一个数组“displ”,并(大量)注意使其保持一致。

    作为最后两点,请注意两个数组 recvcounts 和 displs 仅与 root 相关;在其他节点上,传递空指针是安全的。另一个注意事项是,您还必须在不发送数据的节点中调用 MPI_Gatherv:在这些情况下,mycount 必须设置为 0;如果你想避免在没有值发送的节点上调用 MPI_Gatherv,你必须设置一个差分通信器,然后调用 MPI_Gatherv。

    【讨论】:

      【解决方案2】:

      我认为没有任何方法可以更改 MPI 调用本身的顺序(尽管您可以在之后轻松地自己重新排序),但是解决第一个问题相对容易。

      在 MPI 中,并不要求所有集体调用都发生在 MPI_COMM_WORLD(其中包含在执行开始时启动的所有进程)。您可以创建新的通信器,其中包含您喜欢的原始进程组的任何子集。执行此操作的调用是 MPI_COMM_CREATE。

      要使用 MPI_COMM_CREATE,您需要使用适当的函数(MPI_GROUP_EXCL、MPI_GROUP_INCL、MPI_GROUP_INTERSECTION 等)来操作要放入新通信器的 MPI_Group 进程。网络上通常有很多教程,如果不是很明显,您可以在其中找到如何做这些事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-23
        • 2023-03-03
        • 2021-06-25
        • 2011-12-13
        • 2015-12-14
        • 2011-08-13
        • 1970-01-01
        • 2017-02-19
        相关资源
        最近更新 更多