c++ - MPI 同步 vector 矩阵

标签 c++ vector matrix synchronization mpi

对不起,如果这个问题很常见或微不足道,我对 MPI 不是很熟悉,请多多包涵。

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

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

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

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

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

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

最佳答案

在这种情况下,您需要使用 MPI_Bcast 发送消息,通知其他处理器并指示它们做同样的事情。或者,如果在遇到障碍之前顺序无关紧要,则只能将消息发送到执行排列的根进程,然后在障碍之后使用 MPI_Bcast 将消息发送给所有其他进程。

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

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

关于c++ - MPI 同步 vector 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15224116/

相关文章:

c++ - 排序 vector ,未在此范围内声明顺序(库?)

c - 生成数字并显示矩阵

c++ - 如何重新安排并发任务?

android - Opencv SIFT undefined reference 问题

c++ - Vector<char*> push_back 覆盖所有条目

python - 映射具有重复索引的数组?

algorithm - 生成某些排列

c# - 如何制作 PInvoke 友好的 native API?

c++ - 运行时错误 :stack around `szDeviceType ` is corrupted

arrays - 在 Excel VBA 中使用一维或二维数组