openMP -распараллеливание с помощью цикла for и private

Я написал функцию для оценки заданной функции в точках набора (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_в каждом потоке?

Что не так с кодом и как его улучшить?

С уважением и благодарностью.

5
задан Mysticial 16 April 2012 в 10:45
поделиться