我尝试在C++中并行化一个for循环,但是每次我尝试将这个循环用于更大的数据集时,我都会得到这个错误:返回的过程-1073741819(0xC 0000005)
对于小的数据集,循环可以工作,对于大的数据集,初始化可以工作,但是在这之后,我得到了内存错误。我使用的是Codeblocks和GNU GCC编译器。在这个循环中,我想运行优化进化启发式的几次迭代。我使用的是openmp,并试图将在几个线程中使用的变量置于私有状态。
#include <omp.h>
void search_framework(Data &data, Solution &best_s)
{
vector<Solution> pop(data.p_size);
vector<Solution> child(data.p_size);
for (int i = 0; i < data.p_size; i++)
{
pop[i].reserve(data);
child[i].reserve(data);
}
// parent index in pop
vector<tuple<int, int>> p_indice(data.p_size);
bool time_exhausted = false;
int run = 1;
#pragma omp parallel for firstprivate(pop, pop_fit, pop_argrank, child, child_fit, child_argrank, p_indice)
for (int run = 1; run <= data.runs; run++)
{
run++;
int no_improve = 0;
int gen = 0;
initialization(pop, pop_fit, pop_argrank, data);
local_search(pop, pop_fit, pop_argrank, data);
while (!termination(no_improve, data))
{
gen++;
// printf("---------------------------------Gen %d---------------------------\n", gen);
no_improve++;
// select parents
select_parents(pop, pop_fit, p_indice, data);
// do local search for children
local_search(child, child_fit, child_argrank, data);
// replacement
replacement(pop, p_indice, child, pop_fit, pop_argrank, child_fit, child_argrank, data);
// update best
argsort(pop_fit, pop_argrank, data.p_size);
update_best_solution(pop[pop_argrank[0]], best_s, used, run, gen, data);
if (data.tmax != NO_LIMIT && used > clock_t(data.tmax))
{
time_exhausted = true;
break;
}
}
if (time_exhausted) run = data.runs;
}
}
编辑:这是pop等初始化的部分:
void initialization(vector<Solution> &pop, vector<double> &pop_fit, vector<int> &pop_argrank, Data &data)
{
int len = int(pop.size());
for (int i = 0; i < len; i++)
{
pop[i].clear(data);
}
for (int i = 0; i < len; i++)
{
data.lambda_gamma = data.latin[i];
new_route_insertion(pop[i], data);
}
for (int i = 0; i < len; i++)
{
pop_fit[i] = pop[i].cost;
}
argsort(pop_fit, pop_argrank, len);
}
2条答案
按热度按时间sbtkgmzw1#
您已复制以增加
run
一个
for (int run = 1; run <= data.runs; run++)
和
run++
的正下方我不知道什么是'数据'在这种情况下,但我猜这是不稳定的。
如果不是,我猜
data.runs
的类型是unsigned long
,请注意for (int run = 1; run <= data.runs; run++)
int
的范围是“-2147483648到2147483647”,如果data.runs
的值超出int
的范围,这是非常危险的,它可能会造成无限循环。3qpi33ja2#
尝试使用OMP_STACKSIZE环境变量增加每个OMP线程的堆栈大小。
https://gcc.gnu.org/onlinedocs/gcc-12.1.0/libgomp/OMP_005fSTACKSIZE.html
我认为私有数据结构会被放到堆栈上,所以增加问题的大小最终会超过保留的堆栈空间。