我的unix/windows C++应用程序已经使用MPI进行了并行化:作业被拆分为N cpus,并且每个块都并行执行,相当高效,非常好的速度调整,作业完成正确。共享内存,MPI和排队系统
但是有些数据在每个过程中都会重复出现,而且由于技术原因,这些数据不能通过MPI(...)轻松拆分。 例如:
- 5静态数据,每个进程加载
- 4 GB的数据,可以在MPI分布完全相同的东西的GB,所述多个CPU被使用,更小的这个每个CPU RAM是。
对于一个4 CPU的工作,这意味着至少20Gb的RAM负载,大部分内存'浪费',这是可怕的。
我在考虑使用共享内存来减少整体负载,每个计算机只能加载一次“静态”块。
所以,主要的问题是:
有什么标准MPI方式在一个节点上共享内存?某种现成的+免费图书馆?
- 如果不是,我会使用
boost.interprocess
并使用MPI调用来分配本地共享内存标识符。 - 共享内存将由每个节点上的“本地主机”读取,并且共享只读。不需要任何形式的信号/同步,因为它不会改变。
- 如果不是,我会使用
是否有任何性能问题或需要特别注意的问题?
- (有不会是任何“串”或过于怪异的数据结构,什么都可以降至阵列和结构指针)
该作业将在PBS中执行(或SGE )排队系统,在进程不干净的情况下退出,我想知道这些是否会清理节点特定的共享内存。
答案到目前为止,测试和进一步的读数,内存映射文件可能是最简单的选择: - 只有主MPI进程需要“准备”内存文件,这将被所有进程映射。 - 由于该文件将是只读的,因此不需要担心内容的一致性。 - 没有关于性能的想法寿命...也许只有实验才能说明。 – Blklight 2009-12-27 15:50:24
性能完全取决于您的平台。你的细节很稀疏,但是考虑到你可用的CPU和RAM,你不应该有一个大问题。如果您需要更改共享内存(您的分布式数据),则不需要共享内存的内容是持久性的,只需要共享内存即可。在这种情况下,您的系统将浪费大量时间将所有内存更改写入磁盘。 – 2010-01-10 05:38:35
已经离开,不能选择最后的答案,最多的一个得到它:) 但无论如何,很多好的答案四周,但没有什么回答我正在寻找的东西,所以我想没有广泛的标准的方式来做到这一点! – Blklight 2010-01-11 19:40:28