openMP - for循环和私有的并行

问题描述:

我写了一个函数来评估set(set_)中点上的给定函数。没有并行化的代码就是这样的:openMP - for循环和私有的并行

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_变量设置为private,所以在每个线程中都不应该有原始set_的副本?

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

感谢和问候。

+1

修复了您的格式。这是一个完整的混乱,因为选项卡... – Mysticial 2012-04-16 10:47:36

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