简体   繁体   中英

openMP - parallelization with for loop and private

I wrote a function to evaluate a given function at points in a set (set_). Code with no parallelization is like that:

void Method::evaluateSet(double* funcEvals_, double** set_)
{
    for(int j= 0;j<m_npts;j++)
    {
        if(!(isInsideConstraints(set_[j])) || qIsNaN(funcEvals_[j]) || !qIsFinite(funcEvals_[j])) 
        {
            funcEvals_[j] = DBL_MAX;                     
        }
        else
        {
            solverInput input_(m_input);
            input_.setFunParameters(simplex_[j]);
            funcEvals_[j]=input_.apply(simplex_[j]);
        }
    }           
}

and this is working properly.

I then parallelize using openMP, with a parallel construct, and a private copy of the variable set_ for each thread. Loop is

#pragma omp parallel for  private (set_)
for(int j= 0;j<m_npts;j++)
{
    if(!(isInsideConstraints(set_[j])) || qIsNaN(funcEvals_[j]) || !qIsFinite(funcEvals_[j])) 
    {
        funcEvals_[j] = DBL_MAX;
    }
    else
    {
        solverInput input_(m_input);
        input_.setFunParameters(set_[j]);
        funcEvals_[j]=input_.apply(set_[j]);
    }
}
#pragma omp barrier

It crashes, and error occurs at if evaluation, with set_ is being used without been initialized . I don't understand. Since I set the set_ variable private, shouldn't there be a copy of original set_ in each thread?

What is wrong with the code and how to improve?

Thanks and regards.

When you use private for a variable a private copy starts with no value, I mean it is not initialized at that time. Therefore, the value passed by parameter do not set set_ variable. You need to use firstprivate instead, which first initializes the private copy with the current value.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM