Разница между директивой single и section в OpenMP

Насколько я понимаю, я могу использовать директиву single, выполняя ту же работу, что и при использовании sections, просто добавляя nowait флаги.

Следующий код ничем не отличается для меня от директивы section:

    void main(){
    #pragma omp parallel
        {
            int tid = omp_get_thread_num();
    #pragma omp single nowait
            {
                printf("Thread %d in #1 single construct.\n", tid);
            }
    #pragma omp single nowait
            {
                printf("Thread %d in #2 single construct.\n", tid);
            }
    #pragma omp single nowait
            {
                printf("Thread %d in #3 single construct.\n", tid);
            }
        }
    }

Может ли кто-нибудь привести несколько примеров использования директив sections и single в разных сценариях?


person Charles Chow    schedule 09.05.2014    source источник


Ответы (2)


Прежде всего, директивы single и sections имеют явно разные семантические цели, когда речь идет о чтении кода, и использование одной для имитации другой может вводить в заблуждение.

Что касается технических аспектов, single является единственной директивой о совместной работе, поддерживающей пункт copyprivate, который:

... предоставляет механизм использования частной переменной для передачи значения из среды данных одной неявной задачи в среды данных других неявных задач, принадлежащих параллельной области.

С другой стороны, конструкция совместной работы sections поддерживает пункты lastprivate и reduction, а single — нет.

Наконец, обратите внимание, что ваш фрагмент:

#pragma omp single nowait
        {
            printf("Thread %d in #1 single construct.\n", tid);
        }
#pragma omp single nowait
        {
            printf("Thread %d in #2 single construct.\n", tid);
        }
#pragma omp single nowait
        {
            printf("Thread %d in #3 single construct.\n", tid);
        } // No barrier here

имитирует не sections, а sections nowait. Чтобы имитировать sections, вы должны помнить, что самая последняя конструкция single поддерживает свой неявный барьер.

person Massimiliano    schedule 09.05.2014
comment
Если я хочу сделать функцию диспетчера задач, какую директиву мне выбрать? - person Charles Chow; 09.05.2014
comment
@CharlesChow Я не понимаю, что вы подразумеваете под функцией диспетчера задач. Если вы хотите использовать параллелизм на уровне задач, OpenMP 3.X и 4.0 поддерживают директивы task. - person Massimiliano; 09.05.2014
comment
Я имею в виду программу, которая регистрирует новые задачи и назначает каждую задачу потокам. Вы упомянули, что я должен оставить барьер для одной директивы, значит ли это, что я просто удаляю nowait в последнем разделе single? - person Charles Chow; 09.05.2014
comment
Думаю, вам будет полезно прочитать этот ответ о различиях между разделами и задачами. - person Massimiliano; 09.05.2014

в некоторых случаях конструкция single nowait может вести себя так же, как конструкция sections. Однако спецификация OpenMP требует, чтобы только один поток выполнял конструкцию single. Это не требует, чтобы бездействующие потоки брали на себя другие последующие конструкции. Вы не можете просто полагаться на это поведение для всех реализаций OpenMP. Большинство будет делать то, что вы ожидаете, но нет никаких гарантий.

Еще одна вещь, о которой стоит упомянуть, это то, что в большинстве реализаций используется система тикетов, присваивающая single региона потокам. Обычное преобразование кода для sections заключается в сопоставлении с рабочей конструкцией совместного использования for путем преобразования конструкции section в цикл for и использования оператора switch для конструкций section. Итак, есть еще какие-то гарантии исполнения.

Привет, - Майкл

person Michael Klemm    schedule 09.05.2014
comment
Я правильно понимаю, что даже в sections спецификации нет require that idle threads take on the other subsequent constructs? (См. здесь для более широкого объяснения того, что я имею в виду, т.е. расписание определяется реализацией) - person Massimiliano; 09.05.2014
comment
Вы правы. Если разделов меньше, чем потоков, некоторые из них могут оставаться бездействующими. В приведенном выше единственном шаблоне технически может выполняться только один поток, хотя есть несколько областей, которые могут выполняться параллельно. - person Michael Klemm; 09.05.2014