使用MPI并行化n-ary树遍历

时间:2013-12-04 14:41:58

标签: tree mpi

我使用C中的glib函数生成了一个 n-ary树。现在我需要使用MPI并行化n-ary树中的遍历。我想知道是否可以使用MPI并行化树遍历。如果有可能请建议我怎么才能真正做到这一点。

1 个答案:

答案 0 :(得分:1)

这当然是可能的,但可能不值得努力。我会试着解释一下。如果你愿意的话,你可能会认为这是一个扩展的评论,我当然不会提出解决方案,只需要考虑一些事情。

MPI进程本质上是同一程序的独立实例,它们每个都有自己的地址空间填充(或不填充)变量和数据结构等等。因此,为了使您的遍历程序并行化,您必须克服的一个障碍是将数据从(通常是)主进程(树在最初的位置)传输到一组工作进程。您必须做出的一个选择是将整个树发送到所有进程,还是只发送每个工作进程要遍历的树的那些部分。这在开发工作方面(编写代码以找出如何跨进程分割树,发送块,获得结果)和执行时间(通信需要时间但是根本不进行计算)会产生成本)。

克服的另一个障碍是指针;我认为你已经使用指针来实现你的串行算法,因为它们似乎很受C程序员的欢迎。问题是来自一个MPI进程的指针在另一个MPI进程上是无用的。指针在根目的地只是对内存地址的引用;不能保证指针指向另一个进程上的相同数据位,甚至不指向它指向有效的内存位置。要克服这个问题,您必须以某种方式序列化您的树,传递序列化版本并在工作进程上对其进行反序列化。 (与串行版本相比,浪费了更多的执行时间。)

将树拆分成块并串行化基于指针的数据结构的这种开销使我怀疑是否会通过性能改进来奖励并行化程序的努力。

另一个值得考虑的是,如果树很大,那就是让每个工作进程从您之前存储它的磁盘文件中读取它自己的树的一部分,然后按照这样做进行序列化。只要您通过多个进程协调树的读取,这将起作用。同样,如果没有数据,我不相信努力是值得的。

在树上并行化程序的另一个问题是树的部分的幼稚分布经常导致在运行时的负载平衡差。假设您有一个树,其根有N个子节点,并且有N + 1个进程。通过一切手段将1个孩子送到N个工人流程中的每个流程,但也就是说,对于一般的树木,不太可能导致每个孩子都有(大约)相同的工作量。

当然,如果你有远见来创建一个没有使用指针的树,并且知道树中1级或2级的天真分裂会产生同样平衡的子树,那么你的问题要简单得多。更普遍和基于指针的情况。

而不是MPI,您可能会考虑使用OpenMP,这是在共享内存计算机上进行并行计算。如果您正在编写共享内存程序,那么我看到您使用MPI遇到的许多问题都不会存在。