2012-04-16 27 views
4

私は、セット内のポイント(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_のプライベートコピーを使用して並列化します。ループは、それがクラッシュし、エラーがset_ is being used without been initializedで、もし評価で発生

#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_変数をプライベートに設定しているので、各スレッドに元のset_のコピーがあるべきではありませんか?

コードに問題があり、改善する方法はありますか?

ありがとうございます。

+1

フォーマットが修正されました。それはタブのために完全な混乱だった... – Mysticial

答えて

7

privateを変数に使用すると、プライベートコピーは値なしで開始します。つまり、その時点で初期化されていないことを意味します。したがって、パラメータによって渡された値はset_変数を設定しません。代わりにfirstprivateを使用する必要があります。プライベートコピーを最初に現在の値で初期化します。

関連する問題