在C中,我们定义了链接列表或二进制树的结构:
struct list{
int val;
list *next;
};
OR
struct tree_node{
int val;
tree_node *left, *right;
};
我们可以在串行编程中轻松分配下一个存储单元的指针。我的问题是如何在多处理器有本地内存的MPI中处理指针?我该如何跟踪它?如何在MPI中实现链表/二叉树?我知道MPI_Graph。但它在我的场景中没用。
感谢您的回答。提前谢谢。
答案 0 :(得分:2)
我将讨论链接列表,但所有这些都适用于二叉树,只需要一些额外的工作即可。
在MPI中实现链接列表在MPI中是不可能的,因为正如您所说,每个进程都有自己的本地内存,在其他进程中不会保持一致。所以这基本上限制了使用像点对点消息这样简单的东西,除非你想做很多不太有意义的工作。
但是,可以使用单面通信或RMA执行某些操作。实际上,有一些示例代码here。 RMA的基本思想是每个等级将一个内存区域暴露给其他进程。然后,通过适当的访问器和同步调用,每个进程都可以从其他进程内存中获取数据并将数据放入其中。
该示例使用动态窗口允许应用程序根据需要分配内存,但它也可以预先静态分配所有内存并在应用程序开始时将每个进程指向它,这可能是让它更容易理解。
所有这些都是有效的还是正确的做法是一个不同的论点。对于足够大的列表,这可能很强大,因为您可以在单个节点的内存中存储更多数据。但是,对于小型数据结构,遍历列表的成本相当高,因此分发列表的效率非常低,在每个节点上复制它可能更实际。