Разница между директивой 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 директивы в разных сценариях?

4

Решение

Прежде всего, 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 построить поддержание его неявного барьера.

3

Другие решения

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

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

Ура,
-Майкл

2

По вопросам рекламы [email protected]