2012-04-16 172 views
4

我寫了一個函數來評估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

回答

7

當您使用private作爲變量時,私人副本以無值開頭,我的意思是當時沒有初始化它。因此,通過參數傳遞的值不會設置set_變量。您需要使用firstprivate,它首先使用當前值初始化私人副本。