我的 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)排队系统中执行,在进程不干净退出的情况下,我想知道这些是否会清理节点特定的共享内存。