【问题标题】:Copy data between MPI communicators在 MPI 通信器之间复制数据
【发布时间】:2014-03-09 03:51:25
【问题描述】:

我已将 MPI_COMM_WORLD 拆分为两个子通信器,我想将分布在 MPI_COMM_WORLD 上的一组数据传输到两个子通信器。在 MPI-1.1 中执行此操作的最佳方法是什么?

例如有一个数组A = [1 2 3 4 5 6 7 8]分布在MPI_COMM_WORLD的四个MPI进程中,如下

rank 0: [1 2] 
rank 1: [3 4] 
rank 2: [5 6] 
rank 3: [7 8]

我将 MPI_COMM_WORLD 拆分为两个子通信器,每个子通信器包含两个 MPI 进程,并希望我的数据如下:

subcommunicator1:

    rank 0: [1 2 3 4]
    rank 1: [5 6 7 8]

subcommunicator2:

    rank 0: [1 2 3 4]
    rank 1: [5 6 7 8]

【问题讨论】:

    标签: c++ c mpi


    【解决方案1】:

    没有办法将数据从一个通信器发送到另一个通信器。在 MPI 中,通信器专门设计用于包含组内的通信。在您的情况下,您需要在拆分 MPI_COMM_WORLD 之前分发您的数据。你如何做到这一点将取决于你的数据和所需的分布。您可能需要查看 MPI_SCATTERMPI_GATHER 或两者。

    【讨论】:

    • 有一个网站提供了一些非常好的教程:mpitutorial.com(虽然是“Wes”写的,但和我不一样)
    • 没有办法将数据从一个通信器发送到另一个通信器。 当然,每个进程都在MPI_COMM_WORLD 中保留其成员资格(和排名),以便消息可以继续发送在不同(子)通信器的进程之间传递?还是我错过了什么?很久没有使用群组和交互工具了。
    • 当然,你是对的,马克。创建子通信器后,您可以继续在原始通信器上发送数据。关键是您必须在 MPI_COMM_WORLD 上进行这种数据传输,而不是在您创建的其他通信器上。
    • 韦斯利,谢谢。我希望有一种方法可以半自动完成。
    • 迟到了,我认为将 MPI_COMM_WORLD 和 subcommunicator* 与内部通信器 (mpi_intercomm_create) 链接会有所帮助。
    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 2018-06-04
    • 2016-11-19
    • 2012-05-24
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多