【问题标题】:MPI synchronize matrix of vectorsMPI 同步向量矩阵
【发布时间】:2013-02-19 20:56:39
【问题描述】:

如果这个问题很常见或无关紧要,请原谅,我对 MPI 不是很熟悉,请多多包涵。

我有一个向量矩阵。每个向量都是空的或其中有一些项目。

std::vector<someStruct*>  partitions[matrix_size][matrix_size];

当我启动程序时,每个进程都会在这个矩阵中拥有相同的数据,但随着代码的进行,每个进程可能会从一些向量中删除几个项目并将它们放入其他向量中。

因此,当我遇到障碍时,我必须以某种方式确保每个进程都具有此矩阵的最新版本。最大的问题是每个进程都可能操纵任何或所有向量。

我将如何确保每个进程在屏障之后都有正确的更新矩阵?

编辑: 对不起,我不清楚。每个进程可以将一个或多个对象移动到另一个向量,但只有一个进程可以移动每个对象。换句话说,每个进程都有一个它可以移动的对象列表,但是每个人都可以更改矩阵。而且两个进程永远不能移动同一个对象。

【问题讨论】:

  • 如果每个处理器都可能操纵任何元素,那么您到底如何确定“正确的更新矩阵”是什么?
  • 对不起,我不清楚。每个进程可以将一个或多个对象移动到另一个向量,但只有一个进程可以移动每个对象。

标签: c++ vector matrix synchronization mpi


【解决方案1】:

在这种情况下,您需要使用MPI_Bcast 发送消息,通知其他处理器并指示他们执行相同操作。或者,如果在遇到障碍之前排序并不重要,您只能将消息发送到执行排列的根进程,然后在障碍之后使用MPI_Bcast 将其发送给所有其他人。

还有一件事:指针向量通常不是一个好主意,因为您需要在其中手动管理内存。如果您可以使用 C++11,请改用 std::unique_ptrstd::shared_ptr(取决于您的语义),或使用提供非常相似功能的 Boost。

最后,将矩阵表示为固定大小数组的固定大小数组是非常糟糕的。第一:矩阵大小是固定的。第二:相邻的行不一定存储在连续的内存中,这会像疯了一样减慢你的程序(它实际上可以是数量级)。而是将矩阵表示为大小为Nrows*Ncols 的线性数组,然后将元素索引为Nrows*i + j,其中Nrows 是行数,ij 分别是行和列索引。如果您不想要列主要存储,请通过i + Ncols*j 寻址元素。您可以将这种索引杂耍包装在开销几乎为零的内联函数中。

【讨论】:

  • 谢谢,我不确定如何仅将这些指令发送到根目录,但我可能会弄清楚。至于矩阵部分,我目前并不真正需要速度,但我同意这将是一个更好的解决方案。我会试试这个!
  • 那你真的应该看看MPI documentation。它的可读性非常好,并且包含很多示例。
  • MPI_Broadcast 不是正确的工具,如果每个人都想分享其他人需要知道的信息(同时) --> MPI_Allgather
  • @Zulan 只有在所有人都必须同时共享它的情况下才是正确的。你是对的,如果数组是静态的。然而,一旦“行”被动态分配,你就不走运了。
  • 只要在 MPI 和 MPI_Allgatherv 中有用户定义的数据类型,你就不会走运。
【解决方案2】:

我建议以不同的方式排列数据:

每个进程都有他的对象及其在矩阵中的位置的映射。如何实现取决于您如何识别对象。如果所有本地对象都有编号,则可以使用vector&lt;pair&lt;int,int&gt;&gt;

将其视为您操作的主要结构并与MPI_Allgather 通信该结构(每个进程将其数据发送给所有其他进程,最后每个人都拥有所有数据)。如果你需要通过坐标快速查找,那么你可以建立一个缓存。

这可能会或可能不会表现良好。其他优化(如共享“事务”)完全取决于您的对象以及您对它们执行的操作。

【讨论】:

    猜你喜欢
    • 2016-01-23
    • 2010-12-03
    • 1970-01-01
    • 2012-11-24
    • 2021-01-20
    • 2013-12-23
    • 1970-01-01
    • 2018-09-08
    • 2020-09-28
    相关资源
    最近更新 更多