Я пытаюсь реализовать модель с одним производителем и несколькими потребителями, используя 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
Проблема здесь в том, что производитель запускает и отправляет данные до тех пор, пока буфер не будет заполнен, но потребители никогда не начнут. Если я удаляю раздел вокруг «для прагмы», то же самое происходит. Вы видите, что не так с моим подходом?
Я также получаю это предупреждение во время компиляции:
warning: work-sharing region may not be closely nested inside of work-sharing, critical, ordered or master region
Это относится к вложенности цикла for в разделе. Как правильно сделать это в этом случае?
Спасибо за ваш отзыв.
Редактировать: Только что найдено этот связанный вопрос , set_omp_nested (1) мне не помогает. Я постараюсь поместить его в отдельные функции ...