5

セット内のポイント(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

クラッシュし、if評価でエラーが発生しset_ is being used without been initializedます。理解できない。変数privateを設定したので、各スレッドset_にオリジナルのコピーがあるべきではありませんか?set_

コードの何が問題になっていて、どのように改善するのですか?

ありがとう、よろしく。

4

1 に答える 1

8

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

于 2012-04-16T10:45:13.397 に答える