MPI2 / MPI3:考虑同步的MPI_allgather与MPI单向通信

时间:2014-07-11 14:31:29

标签: c++ mpi mpi-rma

我正在使用MPI-2编写一个优化程序,其中我需要在所有进程之间共享std::vector等长({1}} s(概念上)。此向量为当前找到的问题保留了最佳std::vector解决方案,并在每次MPI进程之一找到新的最佳解决方案时进行更新。每个流程在寻找新解决方案上花费的时间通常会有很大差异。

我的问题是,考虑到同步和等待中的性能问题,每次找到新的最佳解决方案时是否应该使用k等MPI集合;或者我应该在MPI-2中使用单面通信来维持共享"所有过程中的向量。

特别是,如果我使用MPI_allgather,进程是否会提前完成其作业并等待与其他进程进行某种同步?

我在MPI点对点通信(upd:以及UPC)方面有一些工作经验,但在实际编码中没有使用集体或单方面通信。我搜索了SO并找到了有关MPI_allgathers的相关问题/答案,例如Distribute a structure using MPI_Allgather,以及片面沟通Creating a counter that stays synchronized across MPI processes。但是我很难说出两种方法之间的确切区别。

谢谢,

---更新---

特别是,我在Creating a counter that stays synchronized across MPI processes底部有代码示例,它使用单面来维护单个MPI_allgather"共享"。我试图使其适用于通用类型,但不知道如何使其工作,因为我无法理解原始代码以及为什么它维护数组int,以及我如何推广{ {1}}用户函数(比如简单地用新的向量替换旧向量)。

模板//注意:T只能是原始类型(不是指针,引用或结构),例如int和double。 struct mpi_array {       typedef std :: vector Vector;       MPI_Win获胜;       int hostrank;
      int rank;
      int size;
      矢量val;
      Vector * hostvals; };


单面通信计数器代码:

data

1 个答案:

答案 0 :(得分:0)

您担心某些进程可能在其他进程之前进入MPI_ALLGATHER是有效的,但在任何具有同步的应用程序中总是如此,而不仅仅是那些明确使用集体通信的进程。

然而,看起来您可能对单方面操作的行为有误解。他们没有提供并行全局地址空间(PGAS)模型,所有内容都是为您同步的。相反,它们只是为您提供了一种直接处理远程进程内存的方法。每个进程的内存仍然是独立的。此外,如果您要从一点到另一点升级到MPI的其余部分,我不会仅限于MPI-2功能。 MPI-3中有一些新东西也可以改善集体和片面(尤其是后者)。

所有这一切,如果你从来没有使用任何东西,只是点对点,片面对你来说将是一个巨大的跳跃。你可能想要更多的中间步骤,无论如何首先检查集体。如果你对自己的表现仍然不满意,你可以看看单方面的章节,但它非常复杂,而且大多数人通常最终会使用一些单方面的东西而不是而不是直接使用它(比如某些PGAS语言)。