MPI如何发送和接收未知数据类型

时间:2011-10-19 14:02:58

标签: c++ parallel-processing mpi hpc

我们用C ++开发了一个算法库,允许用户实现自己的数据类型,以便在各个算法之间共享数据(也由用户实现)。 这很好,但我们想在库级提供并行化。各个算法应该在分布式内存机器的不同节点上并行执行。

我们决定使用MPI进行并行化,因为它可以用于分布式和共享内存机器而无需更改代码。 不幸的是,我们现在争论如何在节点之间分发用户实现的数据类型。我们有以下问题:

  • 我们不知道数据有多大,甚至可能会在不同的运行中发生变化。
  • 我们不知道数据结构中有哪些数据。
  • 数据量可能非常大,最高可达1GB(MPI应该没问题)
  • 用户不应该看到在实现并行执行的数据类型或算法方面存在任何差异(对于算法实际上没有问题)

是否有可能使用MPI在节点之间共享这些数据,或者是否有可用的方法,这可能更适合此类问题。 我们希望有一个至少在共享内存机上运行的解决方案,但我们希望有一个解决方案,无需在共享和分布式内存机器上进行代码更改。

1 个答案:

答案 0 :(得分:3)

是的,你可以用MPI做到这一点,但不,MPI不能单独为你做这件事。

无论您是将此数据发送到另一个节点,还是将其写入磁盘,您都需要在内存中明确描述数据结构布局,以便它可以serialized。如果您传递MPI(或任何其他通信库)指针,它不知道该指针另一侧的内容,因此它无法遍历数据结构以复制其内容。

您可以将参数编组为普通旧数据(手动或使用MPI_PACK之类的东西),或者您可以创建一个MPI数据类型,该数据类型描述该特定实例的内存中数据的布局,并将数据复制过来。此外,您还需要重定向数据结构中的任何指针。 Boost serialization可以帮助您完成所有这些工作。