Изменение первого цикла OpenMP с 1000000 на 2000000 вызовет ту же ошибку.Это указывает на то, что проблема нехватки памяти связана с ограничением стека OpenMP.
Попробуйте установить ограничение предела стека OpenMP как неограниченное в bash с помощью
ulimit -s unlimited
Вы также можете изменить переменную среды OpenMP OMP_STACKSIZE иустановка 100 МБ или более.
ОБНОВЛЕНИЕ 1: я изменяю первый цикл на
{
std::vector<std::vector<int*> > nts(100);
#pragma omp for schedule(static) ordered
for(int begin = 0; begin < int(nts.size()); ++begin) {
for(int i = 0; i < 2000000; ++i) {
nts[begin].push_back(new int(5));
}
}
std::cout << " pre delete " << std::endl;
for(int begin = 0; begin < int(nts.size()); ++begin) {
for(int j = 0; j < nts[begin].size(); ++j) {
delete nts[begin][j]
}
}
}
Затем я получаю ошибку памяти при i = 1574803 в главном потоке.
ОБНОВЛЕНИЕ 2: Если вы используете компилятор Intel, вы можете добавить следующее в начало своего кода, и это решит проблему (при условии, что у вас достаточно памяти для дополнительных издержек).
std::cout << "Previous stack size " << kmp_get_stacksize_s() << std::endl;
kmp_set_stacksize_s(1000000000);
std::cout << "Now stack size " << kmp_get_stacksize_s() << std::endl;
ОБНОВЛЕНИЕ 3: Для полноты, как упомянуто другим участником, если вы выполняете какое-то числовое вычисление, лучше всего предварительно распределить все в одном новом плавающем [1000000] вместо использования OpenMP для выполнения 1000000 распределений,Это относится и к распределению объектов.