1

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

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

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

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

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

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

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

4

2 回答 2

1

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

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

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

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

于 2013-03-05T13:44:24.927 回答
1

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

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

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

于 2013-03-05T13:39:16.320 回答