kir*_*off 5 c++ multithreading openmp multiprocessing
我写了一个函数来评估集合(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]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是正常的.
然后我使用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
Run Code Online (Sandbox Code Playgroud)
它会崩溃,如果评估,则会发生错误set_ is being used without been initialized.我不明白.既然我将set_变量设置为私有,那么set_每个线程中是否应该有原始副本?
代码有什么问题以及如何改进?
感谢致敬.
当您使用private变量时,私有副本开始时没有值,我的意思是它当时没有初始化.因此,参数传递的值不设置set_变量.您需要使用firstprivate,首先使用当前值初始化私有副本.
| 归档时间: |
|
| 查看次数: |
2153 次 |
| 最近记录: |