gpt4 book ai didi

c++ - 大型计算后减少 C++ 程序的堆大小

转载 作者:IT王子 更新时间:2023-10-28 23:34:48 25 4
gpt4 key购买 nike

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

load 步骤期间,每个给定节点中的所有 rank 都排入队列,因此只有一个 rank 可以完全访问节点的 all 内存。之所以会这样设计,是因为在加载阶段,有一组大的IO block 被读取,都需要在之前在内存中加载一个local reduction 可以发生。我们将把这个局部缩减的结果称为命名变量myRankVector。一旦获得 myRankVector 变量,IO block 就会被释放。变量 myRankVector 本身占用的内存很少,因此在创建过程中节点可以使用 all 内存,完成后排名只需使用 2-3 GB 即可保存myRankVector.

在节点的globalReduce阶段,预计节点中的所有rank都加载了它们对应的globalReduce

所以这是我的问题,虽然我确保绝对没有任何内存泄漏(我使用共享指针进行编程,我使用 Valgrind 进行了双重检查等),但我确信即使在所有析构函数已释放 IO block 。当队列中的下一个队列开始工作时,它开始像前一个队列一样请求大量内存,当然程序会得到 Linux kill 产生“内存不足:杀死进程 xxx (xxxxxxxx) 分数 xxxx 或牺牲 child ”。很明显为什么会这样,队列中的第二个 rank 想要使用所有内存,但第一个 rank 仍然有一个大堆。

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

谢谢。

最佳答案

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

munmap 将释放所需的空间。

查看 boost : pool 中的代码对于允许您独立管理底层堆的实现。

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

关于c++ - 大型计算后减少 C++ 程序的堆大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34539647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com