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) 나를 도와주지 않습니다. 별도의 함수로 넣으려고 시도합니다 ...
좋아, 이것은 또한 내 인상이며 부스트 스레드를 사용하여 구현할 것입니다. 그냥 기존 코드를 사용하여 빠른 구현을하고 싶었고 이미 일부 OpenMP를 알고 있었기 때문에 (부스트 섹션/태스크를 사용하여 가능해야하지만) – fungs