【问题标题】:MPI how to send and receive unknown datatypesMPI 如何发送和接收未知数据类型
【发布时间】:2011-10-19 14:02:57
【问题描述】:

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

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

  • 我们不知道数据可能有多大,它甚至可能会随着运行而变化。
  • 我们不知道数据结构中的数据是什么。
  • 数据量可以很大,最高可达 1GB(MPI 应该没问题)
  • 用户在实现并行执行的数据类型或算法时应该看不到任何差异(对于算法实际上没有问题)

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

【问题讨论】:

  • 你遇到过 boost.mpi 吗?除非我误解了,否则应该按照你的要求做。
  • Boost.mpi 是 MPI 的 C++ 包装器,我仍然有一个问题,只有:“映射到 MPI 数据类型的类型”可以传输,这可能不是这种情况,因为我没有定义数据类型。
  • 你问 MPI 是否可以发送任意数据结构,只要给它们一个指针(或类似的结构)?

标签: c++ parallel-processing mpi hpc


【解决方案1】:

是的,您可以使用 MPI 执行此操作,但不,MPI 无法自行为您执行此操作。

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

您可以将参数编组为普通的旧数据(手动或使用诸如 MPI_PACK 之类的东西),或者您可以创建一个 MPI 数据类型来描述该特定实例在内存中的数据布局,并将数据复制过来。此外,您需要重定向数据结构中的任何指针。 Boost serialization 或许能帮到你。

【讨论】:

  • 感谢回复,但我不知道数据结构会是什么样子,因为我没有自己实现。这也是我们开发这个库的原因,让用户可以使用自己的数据结构。是否可以使用 MPI_PACK 打包未知数据?
  • 不,仅使用 fwrite() 可以将任意数据结构写入文件。在此过程中,有人需要能够就如何序列化数据结构进行交流。
  • 所以这意味着我们不能使用 MPI。希望有一些共享内存机器的方法,可以交换指针。
  • 在这一点上,我认为它与 MPI 没有任何关系 - 如果按照设计,您不知道如何使用任何类型的分布式内存系统在指针的另一边。
  • 我担心这个,但是使用共享内存应该是可能的,因为只有指向某个共享变量的指针必须被交换。
猜你喜欢
  • 2019-01-20
  • 2015-02-08
  • 2013-04-15
  • 2015-09-10
  • 2013-12-31
  • 2018-03-12
  • 2013-12-20
  • 2016-06-15
  • 2012-03-13
相关资源
最近更新 更多