在c++中并行化for循环-内存错误

mccptt67  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(178)

我尝试在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);
}
sbtkgmzw

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的范围,这是非常危险的,它可能会造成无限循环。

3qpi33ja

3qpi33ja2#

尝试使用OMP_STACKSIZE环境变量增加每个OMP线程的堆栈大小。
https://gcc.gnu.org/onlinedocs/gcc-12.1.0/libgomp/OMP_005fSTACKSIZE.html
我认为私有数据结构会被放到堆栈上,所以增加问题的大小最终会超过保留的堆栈空间。

相关问题