2011-11-29 5 views
0

OpenMP를 사용하여 단일 제작자 - 다중 소비자 모델을 구현하려고합니다. (더 나은 부스트 ​​스레드를 사용할 수 있음을 알고 있습니다.) 여기 OpenMP를 사용한 소비자 생산자 모델

은 매우 간단하고 스레드 인식 대기열 유형을 사용하여 내 코드입니다 :

bool producer_finished = false; 

#pragma omp parallel default(none) shared(producer_finished, buffer, datagen) 
{ 
    #pragma omp sections 
    { 
     #pragma omp section 
     { // single producer 

      while(datagen) { 
       DType data = datagen.next() 
       buffer.push(data); 
      } 

      producer_finished = true; 
      #pragma omp flush(producer_finished) 

     } // end omp section 

     #pragma omp section 
     { 
      #pragma omp for schedule(static, 1) 
      for (int i = 0; i < omp_get_max_threads() - 1; ++i) { 

       while (! producer_finished) { 

        #pragma omp critical(buffer) 
        { 
         DType = buffer.pop(); 
        } 

        processData(data); 
        outputData(data); 

        #pragma omp flush(producer_finished) 
       } 
      } // end omp for 
     } // end omp section 

    } //end omp sections 
} // end omp parallel 

여기서 문제는 버퍼가 가득하지만, 소비자가 결코 시작하지 않을 때까지 생산자가 시작되고이 데이터를 밀어 것입니다 . "for pragma"부분을 제거하면 같은 일이 발생합니다. 내 접근 방식에 문제가있는 것을 볼 수 있습니까?

또한 컴파일시이 경고를 얻을 :

warning: work-sharing region may not be closely nested inside of work-sharing, critical, ordered or master region 

그것은 섹션에서 for 루프의 중첩을 의미합니다. 이 경우 올바른 방법은 무엇입니까?

의견에 감사드립니다.

편집 : 그냥 찾은 this related question, set_omp_nested (1) 나를 도와주지 않습니다. 별도의 함수로 넣으려고 시도합니다 ...

답변

0

OpenMP는 병렬 계산을 위해 설계된 것으로 일반용 스레딩 라이브러리는 아닙니다. 따라서 OpenMP로 생산자/소비자 루프를 만들려고 시도하는 것은 잘못된 도구 IMHO를 사용하는 것입니다.

+0

좋아, 이것은 또한 내 인상이며 부스트 스레드를 사용하여 구현할 것입니다. 그냥 기존 코드를 사용하여 빠른 구현을하고 싶었고 이미 일부 OpenMP를 알고 있었기 때문에 (부스트 섹션/태스크를 사용하여 가능해야하지만) – fungs

0

OpenMP 코드가 구문 오류입니다. 이것은 컴파일러에서 알려주는 것입니다. 병렬 섹션과 병렬 루프는 모두 작업 공유 구성이며 서로 내에서 중첩되지 않을 수 있습니다. for 구문 주위에 내부 병렬 루프를 추가하여 명시 적으로 활성화해야하는 중첩 된 병렬 처리를 사용할 수 있습니다.

또한 flush 지시문을 사용하는 것으로 충분하지 않습니다. 작업중인 데이터를 동기화해야합니다. 목록없이 플러시를 사용하는 것이 좋습니다.

OpenMP 관련 질문을 www.openmp.org의 포럼에 올려서 OpenMP 익스팬더에 대해 이야기하고 싶을 수도 있습니다.

안부, 디터

+1

감사합니다. 부스트 스레드를 사용하여 생산자 - 소비자 패턴을 구현했으며 매력. 나를 위해 많은 for 루프로 기본 직렬 코드를 병렬 처리해야만 OpenMP을 사용할 수 있습니다. – fungs

0

전체 #pragma omp를 함수로 추출하고 #pragma omg parallel for로 변경합니다.

현재 #pragma omp를 실행하기 전에 omp_set_nested (1)로 중첩 된 병렬 실행을 활성화하십시오.