我的Unix/Windows C++应用程序已经使用MPI实现了并行化:作业被分割成N个CPU,每个块都以并行方式执行,效率很高,速度扩展性非常好,工作完成得很好。
但是某些数据在每个进程中都是重复的,并且由于技术原因,这些数据不能轻松地通过MPI分割(...)。例如:
- 5 GB的静态数据,每个进程加载的确切内容都相同
- 4 GB的数据可以在MPI中分布,使用的CPU越多,每个CPU的RAM就越小。
在4个CPU的工作中,这意味着至少有20GB的RAM负载,大部分内存“浪费”,这太糟糕了。
我考虑使用共享内存来减少总体负载,“静态”块将仅在每台计算机上加载一次。
因此,主要问题是:
是否存在任何标准MPI共享节点内存的方法? 有一些现成且免费的库吗?
- 如果没有,我将使用
boost.interprocess
,并使用MPI调用来分发本地共享内存标识符。 - 每个节点上的“本地主机”将读取共享内存,并进行只读共享。不需要任何信号量/同步,因为它不会改变。
- 如果没有,我将使用
是否存在任何性能损失或需注意的特别问题?
- (不会有“字符串”或过于奇怪的数据结构,一切都可以归结为数组和结构指针)
该作业将在PBS(或SGE)排队系统中执行,在进程退出不干净的情况下,我想知道那些将清除节点特定的共享内存。