繁体   English   中英

openMP - 与for循环和私有的并行化

[英]openMP - parallelization with for loop and 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_ is being used without been initialized ,则会发生错误。 我不明白。 由于我将set_变量设置为private,因此每个线程中是否应该没有原始set_的副本?

代码有什么问题以及如何改进?

感谢致敬。

当您使用private作为变量时,私有副本开始时没有值,我的意思是它当时没有初始化。 因此,参数传递的值不设置set_ variable。 您需要使用firstprivate ,它首先使用当前值初始化私有副本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM