我编写了一个函数来评估集合(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
它崩溃,并且在 if 评估时发生错误,使用set_ is being used without been initialized
. 我不明白。既然我将变量设置为私有,那么每个线程中set_
不应该有一个原始副本吗?set_
代码有什么问题以及如何改进?
谢谢并恭祝安康。