大量计算后减少C ++程序的堆大小

时间:2015-12-31 01:04:00

标签: c++ memory heap mpi

考虑基于两个步骤的MPI应用程序,我们称之为 load globalReduce 。为了简单起见,软件正在被描述,但还有很多事情要发生,所以它不仅仅是一个Map / Reduce问题。

加载步骤期间,每个给定节点中的所有排名都排队,以便只有一个排名可以完全访问节点的所有内存。这种设计的原因在于,在加载阶段,有一组大的IO块被读取,并且它们都需要在 局部缩减之前加载到内存中< / em>可以发生。我们将调用 local reduction 的结果命名变量 myRankVector 。获得 myRankVector 变量后,将释放IO块。变量 myRankVector 本身使用的内存很少,因此在创建过程中节点可以使用 all 内存,完成后排名只需要使用2-3 GB来保存 myRankVector

在节点的 globalReduce 阶段,预计节点中的所有排名都已加载了相应的 globalReduce

所以这是我的问题,虽然我已经确保绝对没有任何内存泄漏(我使用共享指针编程,我用Valgrind进行了双重检查等),我很肯定即使在所有的析构函数已经发布了IO块。当队列中的下一个排名完成它的工作时,它开始要求大量的内存,就像之前的排名一样,当然程序得到了Linux杀死的产生&#34;内存不足:杀死进程xxx(xxxxxxxx)得分xxxx或牺牲孩子&#34;。很清楚为什么会出现这种情况,队列中的第二个等级想要使用所有内存,但第一个等级仍然是一个大堆。

因此,在设置了这个问题的上下文之后:有没有办法在C ++中手动减少堆大小以真正释放未使用的内存?

感谢。

3 个答案:

答案 0 :(得分:1)

  

因此,在设置了这个问题的上下文之后:有没有办法在C ++中手动减少堆大小以真正释放未使用的内存?

这取决于操作系统,但很可能不可能。

大多数操作系统都会为您提供从单个进程完成的内存分配,直到该进程完全完成并被终止。

答案 1 :(得分:1)

堆是使用linux上的mmap实现的,你需要使用自己的堆,你可以完全配置和完成munmap。

.jar将释放所需空间。

查看boost : pool中的代码,了解允许您独立管理基础堆的实现。

根据我的经验,使用自定义分配器管理munmap容器非常困难,因为它们是类派生的,而不是实例派生的。

答案 2 :(得分:0)

共享内存可以解决您的问题(即使您不想共享此内存)吗? 您可以在“加载”阶段分配一块共享内存,并在计算“myRankVector”后取消附加内容。

(参见shmget,shmat,shmdt,shmctl(...,IPC_RMID,。))