5

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.

1
  • 1
    Fixed your formatting. It was a complete mess because of the tabs... Commented Apr 16, 2012 at 10:47

1 Answer 1

8

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.