【发布时间】:2010-12-30 03:45:47
【问题描述】:
我的 unix/windows C++ 应用程序已经使用 MPI 进行了并行化:作业被拆分到 N 个 cpus 中,每个块并行执行,非常高效,非常好的速度扩展,作业做得很好。
但有些数据在每个流程中重复出现,并且由于技术原因,这些数据不能轻易地通过 MPI 进行拆分 (...)。 例如:
- 5 Gb 静态数据,为每个进程加载完全相同的数据
- 可以在 MPI 中分布的 4 Gb 数据,使用的 CPU 越多,每个 CPU 的 RAM 越小。
在 4 CPU 作业中,这意味着至少需要 20Gb 的 RAM 负载,大部分内存都“浪费”了,这太糟糕了。
我正在考虑使用共享内存来减少整体负载,“静态”块每台计算机只会加载一次。
所以,主要问题是:
-
是否有任何标准的 MPI 方法可以在节点上共享内存? 某种现成的 + 免费库?
- 如果不是,我会使用
boost.interprocess并使用 MPI 调用来分发本地共享内存标识符。 - 共享内存将由每个节点上的“本地主机”读取,并且共享只读。不需要任何类型的信号量/同步,因为它不会改变。
- 如果不是,我会使用
-
任何性能损失或需要警惕的特定问题?
- (不会有任何“字符串”或过于怪异的数据结构,一切都可以归结为数组和结构指针)
作业将在 PBS(或 SGE)排队系统中执行,在进程不干净退出的情况下,我想知道这些是否会清理节点特定的共享内存。
【问题讨论】:
-
在到目前为止的答案、测试和进一步阅读之后,内存映射文件可能是最简单的选择: - 只有主 MPI 进程需要“准备”内存文件,该文件将被所有过程。 - 由于文件将是只读的,因此无需担心内容一致性。 - 不知道性能如何......也许只有实验会告诉我们。
-
性能完全取决于您的平台。您的详细信息很少,但考虑到您可用的 CPU 和 RAM,您应该不会有大问题。映射文件失败的唯一地方是如果您需要更改共享内存(您的分布式数据),不需要共享内存的内容是持久的,只需要共享 RAM。在这种情况下,您的系统将浪费大量时间将所有内存更改写入磁盘。
-
离开了,无法选择最终答案,得票最多的人得到了它:) 但无论如何,周围有很多好的答案,但没有什么能准确回答我想要的,所以我想没有广泛标准的方法可以做到这一点!
标签: c++ shared-memory mpi boost-interprocess pbs