我在一个系统std::fill
上观察到,与常量值或动态值相比,std::vector<int>
设置常量值时,大型系统显着且持续地较慢:0
1
5.8 GiB/s vs 7.5 GiB/s
但是,对于较小的数据大小,结果是不同的,其中fill(0)
更快:
对于4个GiB数据大小的多个线程,fill(1)
显示更高的斜率,但达到的峰值远低于fill(0)
(51 GiB/s对90 GiB/s):
这提出了次要问题,为什么峰值带宽fill(1)
要低得多.
测试系统是一个双插槽Intel Xeon CPU E5-2680 v3,设置为2.5 GHz(通道/sys/cpufreq
),带有8x16 GiB DDR4-2133.我使用GCC 6.1.0(-O3
)和英特尔编译器17.0.1(-fast
)进行了测试,结果都相同.GOMP_CPU_AFFINITY=0,12,1,13,2,14,3,15,4,16,5,17,6,18,7,19,8,20,9,21,10,22,11,23
被设定了.Strem/add/24个线程在系统上获得85 GiB/s.
我能够在不同的Haswell双插槽服务器系统上重现这种效果,但没有任何其他架构.例如在Sandy Bridge EP上,内存性能是相同的,而在缓存fill(0)
中则要快得多.
这是重现的代码:
#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <omp.h>
#include <vector>
using value = int;
using vector = std::vector<value>;
constexpr size_t write_size = 8ll * 1024 * 1024 * 1024;
constexpr size_t …
Run Code Online (Sandbox Code Playgroud) 我在测试程序中观察到以下行为:
我正在malloc()
为1 MB,然后free()
之后sleep(10)
。我做了五次。我正在观察top
程序运行时的内存消耗。
一次free()
-d,我期望程序的虚拟内存(VIRT)消耗将减少1 MB。但实际上并非如此。它保持稳定。这种现象的解释是什么?malloc()
分配内存时是否做一些保留?
假设我将一些内存malloc到某些指针但在程序退出之前不要释放它们.这个内存是否会在退出时自动释放,或者内存泄漏会继续存在,直到我重新启动计算机?
我在Python中编写的代码不会以应有的方式释放内存.内存由Python占用,但即使在不再使用后也永远不会被释放.即使你用ctrl + c打破正在运行的程序.删除变量并运行它似乎不收集的gc.collect().或者与Ipython中相同并运行%reset.内存不会被释放并且运行gc.collect()无效.我在Windows中对此进行了测试,因为我想看看它是否可能与垃圾收集器库有关.看来情况就是这样.在Linux中运行下面的代码,然后在Windows中运行.然后比较内存使用情况.你需要安装numpy和scipy.任何有关此问题的帮助或见解将不胜感激.
导入模型,创建实例,然后运行createSpecific().
这是在Ubuntu 10.04中展示此行为的代码:
from numpy import array, maximum,intersect1d, meshgrid, std, log, log10, zeros, ones, argwhere, abs, arange, size, copy, sqrt, sin, cos, pi, vstack, hstack, zeros, exp, max, mean, savetxt, loadtxt, minimum, linspace, where
from numpy.fft import fft
from scipy.stats import f_oneway, kruskal, sem, scoreatpercentile
#import matplotlib
#matplotlib.use('cairo.pdf')
from matplotlib.pyplot import plot, clf, show, cla, xlim, xscale, imshow, ylabel, xlabel, figure, savefig, close, bar, title, xticks, yticks, axes, axis
from matplotlib.axes import Axes
from mpl_toolkits.mplot3d import Axes3D …
Run Code Online (Sandbox Code Playgroud) 问题与Will malloc实现将free-ed内存返回给系统有很多相似之处?,但我对Windows/Microsoft Visual Studio的答案以及有关确切虚拟内存状态的详细信息感兴趣.
Visual C++ CRT会自由地将内存返回给系统吗?关于虚拟内存分配的内存的确切状态是什么?在大内存块上释放后,块中的内存是否会被提交,保留或释放?如果我在免费后拨打_heapmin怎么办?
我有一个在 Linux(Centos 7)上运行的 C++ 应用程序(gcc 4.9.1,glibc 2.17)。它使用各种第三方库,尤其是 Boost 1.61。当应用程序运行时,我可以通过htop
'sVIRT
和RES
列,或ps
命令等观察它的内存使用量稳步增加。如果我让它运行足够长的时间,它将使用大量的内存并淹没盒子。
听起来像是泄漏,但它通过valgrind
时只泄漏了几个字节,所有这些都在我期望的地方。调试打印消息表明程序流程符合预期。
通过调试器进一步挖掘,我发现__run_exit_handlers
在main
. 我可以逐步执行各种调用,free
因为它通过全局析构函数链工作。完成这些之后,我只观察到明显内存使用量的最小向下变化。然后,最后它调用_exit()
,然后才立即将内存恢复到操作系统。
任何人都可以向我提供有关如何进行调试的其他提示吗?为什么我的程序不还给那个内存?
我试图找出为什么free(3)
不将内存返回系统.
我分配了~11GB,呼叫malloc_info
,释放,malloc_info
再次呼叫.
但我不明白malloc_info
输出,特别是保留内存和当前使用的内存之间的区别.
$ uname -a
Linux gunda3 2.6.32-358.18.1.el6.x86_64 #1 SMP Wed Aug 28 17:19:38 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
/lib/libc.so.6
GNU C Library stable release version 2.12, by Roland McGrath et al.
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.4.7 20120313 …
Run Code Online (Sandbox Code Playgroud) 似乎即使我释放了由malloc()分配的Linux进程的所有内存之后,内存仍然为该进程保留,并且没有返回给OS。
默认情况下运行valgrind massif工具不会泄漏。
使用--pages-as-heap = yes运行valgrind会显示以下内容:
-> 13.77%(7,655,424B)0x35FEEEB069:brk(brk.c:31)
-> 13.77%(7,655,424B)0x35FEEEB113:sbrk(sbrk.c:53)
-> 13.77%(7,655,424B)0x35FEE82717:__default_morecore(morecore.c:48)
-> 13.77%(7,655,424B)0x35FEE7DCCB:_int_malloc(malloc.c:2455)
-> 13.77%(7,655,424B)0x35FEE7F4F1:malloc(malloc.c:2862)
因此,即使内存已经由free()释放,似乎malloc调用了brk / sbrk,也没有将其返回给操作系统。
如何强制free()立即调用sbrk()并将所有内存返回给OS?
我在每个MB都非常重要的低端平台上运行。
提前致谢。
我使用两个变量,其中内存是动态分配的,我打印内存位置,但它们不是连续的.为什么?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *a = malloc(sizeof(int));
int *b = malloc(sizeof(int));
printf("\n a=%p \t b=%p \n",a,b);
}
Run Code Online (Sandbox Code Playgroud)
我得到的答案(在Linux中)是
第一次:
a=0x20a0010 b=0x20a0030
Run Code Online (Sandbox Code Playgroud)
第二次:
a=0x657010 b=0x657030
Run Code Online (Sandbox Code Playgroud)
第3次:
a=0x139e010 b=0x139e030
Run Code Online (Sandbox Code Playgroud)
为什么第1次,第2次和第3次的内存位置a
和b
变量之间的确切差异是什么?
这与分页内存有关吗?
我的处理器是64位.
当我运行以下代码时,我希望一旦foo()
执行,它使用的内存(主要是 create m
)就会被释放。然而,事实并非如此。要释放此内存,我需要重新启动 IPython 控制台。
%%cython
# distutils: language = c++
import numpy as np
from libcpp.map cimport map as cpp_map
cdef foo():
cdef:
cpp_map[int,int] m
int i
for i in range(50000000):
m[i] = i
foo()
Run Code Online (Sandbox Code Playgroud)
如果有人能告诉我为什么会出现这种情况以及如何在不重新启动 shell 的情况下释放此内存,那就太好了。提前致谢。
c ×6
c++ ×4
linux ×4
malloc ×3
glibc ×2
memory ×2
memory-leaks ×2
python ×2
containers ×1
cython ×1
free ×1
memset ×1
numpy ×1
performance ×1
x86 ×1