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_
のコピーがあるべきではありませんか?
コードに問題があり、改善する方法はありますか?
ありがとうございます。
フォーマットが修正されました。それはタブのために完全な混乱だった... – Mysticial