Я написал функцию для оценки заданной функции в точках набора (set_). Код без распараллеливания похож на этот :
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]);
}
}
}
, и он работает правильно.
Затем я распараллеливаю, используя openMP, с параллельной конструкцией и частной копией переменной set_для каждого потока. Цикл
#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
. Он дает сбой и возникает ошибка при оценке с set_ is being used without been initialized
. Я не понимаю. Поскольку я установил переменную set_
как приватную, разве не должна быть копия исходной set_
в каждом потоке?
Что не так с кодом и как его улучшить?
С уважением и благодарностью.