Для моего понимания,
я могу использовать 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
директивы в разных сценариях?
Прежде всего, 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
построить поддержание его неявного барьера.
в некоторых случаях, single nowait
конструкция может вести себя так же, как sections
построить. Однако спецификация OpenMP требует, чтобы только один поток выполнял single
построить. Это не требует, чтобы пустые потоки принимали другие последующие конструкции. Вы не можете просто полагаться на это поведение для всех реализаций OpenMP. Большинство будет делать то, что вы ожидаете, но нет никаких гарантий.
Другая вещь, о которой стоит упомянуть, это то, что в большинстве реализаций используется система тикетов, назначающая single
регионы на темы. Обычное преобразование кода для sections
это сопоставить с for
рабочая конструкция разделения путем перевода конструкции разделов в for
цикл и использование switch
заявление для section
строит. Итак, есть еще несколько гарантий о казни.
Ура,
-Майкл