2011-03-09 3 views
0

3 개의 코드가 OpenMP와 동시에 실행되도록하려면 어떻게해야합니까? 다음 장난감 문제에서 AB 섹션은 일부 데이터를 생성하고 C 섹션은 데이터를 폴링하고 이에 대한 조치를 취합니다.3 병렬 영역

int main(int argc, char* argv[]) 
{ 
    int G = -1,S = -1; 
    #pragma omp parallel sections default(none) shared(G,S,cout) 
    { 
     // Section A 
     #pragma omp section 
     { 
      for(;;) 
      { 
       G = G_Generator(); 
       if(G == 0) break; 
      } 
     } 
     // Section B 
     #pragma omp section 
     { 
      for(;;) 
      { 
       S = S_Generator(); 
       if(S == 0) break; 
      } 
     } 
     // Section C 
     #pragma omp section 
     { 
      for(;;) 
      { 
       if(G == 1 || S == 1) Do_1(); 
       if(G == 2 || S == 2) Do_2(); 
       if(G == 0 || S == 0) break; 
      } 
     } 
    } 
return 0; 
} 

이것은 작동하지 않으며 디버깅 할 수 없습니다. 폴링 섹션 C가 G 또는 S 값이 1 또는 2 인 "miss"가 가능합니까? 코드가 원하는 결과를 얻지 못하는 것 같습니다. OpenMP에서 코드를 작성하는 올바른 방법입니까? 전에 루프 만 병렬 처리했습니다.

답변

2

파이프 라인 병렬 처리가 제대로 수행되기 때문에 올바르게 동기화 할 수 없습니다. 병렬 처리가 필요하다면 섹션 C가 준비 될 때까지 섹션 A와 B에서 나오는 데이터를 저장하는 대기열 (아마도 순환 버퍼)이 필요합니다. 예를 들어, 147 페이지의 http://www.openmp.org/mp-documents/omp-hands-on-SC08.pdf을 살펴보십시오. 그러나 이것은 한 프로듀서, 단일 소비자입니다.

+0

'#pragma omp flush'가 누락되었다고 생각합니다. – Jacob

+2

최근 토론 내용을보실 수도 있습니다 : http://stackoverflow.com/questions/5110816/pragma-omp-flush-to-make-exchange- data-among-threads flush를 사용하는 것은 그렇게 쉬운 일은 아닙니다. – ejd