2012-04-16 2 views
4

집합의 점 (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_ 사본이 없어야합니까?

코드의 문제점 및 개선 방법은 무엇입니까?

감사합니다.

+1

서식이 수정되었습니다. 탭 때문에 완전히 엉망 이었어 ... – Mysticial

답변

7

변수에 private을 사용하면 개인 복사본이 값없이 시작됩니다. 즉, 그 시간에 초기화되지 않았 음을 의미합니다. 따라서 매개 변수로 전달 된 값은 set_ 변수를 설정하지 않습니다. 대신 firstprivate을 사용해야합니다. 먼저 현재 값으로 개인용 사본을 초기화합니다.