집합의 점 (set_)에서 주어진 함수를 평가하는 함수를 작성했습니다. 병렬 처리가없는 코드는 다음과 같습니다.openMP - for 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]);
}
}
}
이 코드는 올바르게 작동합니다.
다음은 각 스레드에 대해 병렬 구문과 변수 set_의 개인 복사본을 사용하여 openMP를 사용하여 병렬 처리합니다. 루프
#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_
변수를 비공개로 설정 했으므로 각 스레드에 원본 set_
사본이 없어야합니까?
코드의 문제점 및 개선 방법은 무엇입니까?
감사합니다.
서식이 수정되었습니다. 탭 때문에 완전히 엉망 이었어 ... – Mysticial