На моей рабочей станции 128 ГБ памяти. Я не могу выделить массив, занимающий (непрерывную) память более ~ 16 ГБ. Но я могу выделить несколько массивов, каждый из которых занимает около 15 ГБ.
Пример кода:
#include <stdlib.h>
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
int MM = 1000000;
int NN = 2200; // 2000 is okay, used ~16GB memory; 2200 produces Segmentation fault
double* testMem1d;
testMem1d = (double*) malloc(MM*NN*sizeof(double));
double* testMem1d1; // NN=2000, allocate another array (or two) at the same time is okay
testMem1d1 = (double*) malloc(MM*NN*sizeof(double));
cout << "testMem1d allocated" << endl;
cin.get(); // here is okay, only malloc but not accessing the array element
cout << "testMem1d[MM*NN-1]=" << testMem1d[MM*NN-1]<< endl;
cout << "testMem1d1[MM*NN-1]=" << testMem1d1[MM*NN-1]<< endl;
// keep running and check the physical memory footprint
for (int tt=0;tt<1000;tt++)
{
for (int ii=0; ii<MM*NN; ii++)
{
testMem1d[ii]=ii;
testMem1d1[ii]=ii;
}
cout << "MM=" << MM << ", NN=" << NN << ", testMem1d[MM*NN-1]=" << testMem1d[MM*NN-1]<< endl;
}
}
Пожалуйста, не обращайте внимания. Я использую mallo c () в c ++, если это не является существенной проблемой . (Это так?) Мне нужно / хочу использовать mallo c () по другим причинам.
Некоторые наблюдения: (1) Выделение нескольких массивов, каждый из которых меньше 15 ГБ, нормально (2) Только do mallo c () в порядке. «Ошибка сегментации» при доступе к элементам массива.
Я подумал, что могут быть некоторые системные настройки, ограничивающие выделение памяти. С ulimit -a вроде все нормально. Поскольку программа может получить доступ к 64-битному виртуальному адресному пространству, я не смог найти никакой причины, которая ограничивает только непрерывное выделение памяти.
ОС: Ubunt 16.04. Я пробовал g ++ и i cc с mcmodel = large. Это кажется несущественным.
uname -a
Linux 4.4.0-143-generic #169-Ubuntu SMP Thu Feb 7 07:56:38 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 515031
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) unlimited
cpu time (seconds, -t) unlimited
max user processes (-u) 515031
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Редактирует:
(1) mall c () фактически возвращает NULL [в mcleod_ideafix]
(2) [в zwol]
free -m
total used free shared buff/cache available
Mem: 128809 18950 107840 1129 2018 107910
Swap: 974 939 35