Reputation: 26333
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.
Upvotes: 5
Views: 3119
Reputation: 2002
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.
Upvotes: 8