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_
的副本?
代碼有什麼問題以及如何改進?
感謝和問候。
修復了您的格式。這是一個完整的混亂,因爲選項卡... – Mysticial 2012-04-16 10:47:36