相关疑难解决方法(0)

为什么std :: fill(0)比std :: fill(1)慢?

我在一个系统std::fill上观察到,与常量值或动态值相比,std::vector<int>设置常量值时,大型系统显着且持续地较慢:01

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)

c++ performance x86 memset compiler-optimization

65
推荐指数
2
解决办法
2366
查看次数

malloc在分配内存时是否保留更多空间?

我在测试程序中观察到以下行为:

我正在malloc()为1 MB,然后free()之后sleep(10)。我做了五次。我正在观察top程序运行时的内存消耗。

一次free()-d,我期望程序的虚拟内存(VIRT)消耗将减少1 MB。但实际上并非如此。它保持稳定。这种现象的解释是什么?malloc()分配内存时是否做一些保留?

c malloc free dynamic-memory-allocation

31
推荐指数
3
解决办法
2636
查看次数

程序退出时是否释放堆?

假设我将一些内存malloc到某些指针但在程序退出之前不要释放它们.这个内存是否会在退出时自动释放,或者内存泄漏会继续存在,直到我重新启动计算机?

c

9
推荐指数
1
解决办法
3549
查看次数

分配给Python的内存即使在gc.collect()之后也不会在Linux中发布

我在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)

python malloc garbage-collection memory-management numpy

6
推荐指数
1
解决办法
1410
查看次数

Visual C++运行时malloc/free会将内存返回给操作系统吗?

问题与Will malloc实现将free-ed内存返回给系统有很多相似之处,但我对Windows/Microsoft Visual Studio的答案以及有关确切虚拟内存状态的详细信息感兴趣.

Visual C++ CRT会自由地将内存返回给系统吗?关于虚拟内存分配的内存的确切状态是什么?在大内存块上释放后,块中的内存是否会被提交,保留或释放?如果我在免费后拨打_heapmin怎么办?

c c++ memory-management visual-studio-2010 visual-studio

6
推荐指数
1
解决办法
2444
查看次数

glibc 应用程序保留未使用的内存直到退出之前

我有一个在 Linux(Centos 7)上运行的 C++ 应用程序(gcc 4.9.1,glibc 2.17)。它使用各种第三方库,尤其是 Boost 1.61。当应用程序运行时,我可以通过htop'sVIRTRES列,或ps命令等观察它的内存使用量稳步增加。如果我让它运行足够长的时间,它将使用大量的内存并淹没盒子。

听起来像是泄漏,但它通过valgrind时只泄漏了几个字节,所有这些都在我期望的地方。调试打印消息表明程序流程符合预期。

通过调试器进一步挖掘,我发现__run_exit_handlersmain. 我可以逐步执行各种调用,free因为它通过全局析构函数链工作。完成这些之后,我只观察到明显内存使用量的最小向下变化。然后,最后它调用_exit(),然后才立即将内存恢复到操作系统。

任何人都可以向我提供有关如何进行调试的其他提示吗?为什么我的程序不还给那个内存?

c++ linux memory-leaks glibc

6
推荐指数
1
解决办法
2292
查看次数

如何解释malloc_info

我试图找出为什么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)

c linux malloc

5
推荐指数
0
解决办法
1578
查看次数

强制free()将malloc内存返回给OS

似乎即使我释放了由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都非常重要的低端平台上运行。

提前致谢。

c linux memory memory-management glibc

5
推荐指数
2
解决办法
2576
查看次数

为什么动态分配的两个变量的内存位置不连续?

我使用两个变量,其中内存是动态分配的,我打印内存位置,但它们不是连续的.为什么?

#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次的内存位置ab变量之间的确切差异是什么?

这与分页内存有关吗?

我的处理器是64位.

c c++ linux

5
推荐指数
2
解决办法
508
查看次数

Cython容器不释放内存吗?

当我运行以下代码时,我希望一旦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 的情况下释放此内存,那就太好了。提前致谢。

python memory containers memory-leaks cython

5
推荐指数
1
解决办法
3144
查看次数