Технология OpenМР: синхронизация нитей в параллельных областях




Семинар 13

Тема семинара

Директивы синхронизации обеспечивают возможность организации явной синхронизации работы нитей в параллельной области (прагма omp barrier), а также синхронизации путем назначения специального режима для выполнения фрагмента, выделенного внутри параллельной секции. Например, такой фрагмент может быть выполнен только одной нитью или всеми нитями, но по очереди.

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

 

Директива single указывает на однократное выполнение выделенного внутри параллельной области блока произвольной нитью.

 

#pragma omp parallel

{

#pragma omp single

{ … }

}

 

Выделенный желтым фрагмент будет выполнен однократно, нитью с произвольным номером.

 

 

Пример 1. Рассмотрим пример применения прагмы single для однократного выполнения какой-либо нитью операции увеличения значения общей целочисленной переменной а на 10. Остальные нити пропускают выделенный фрагмент. Начальное значение переменной а=0.

В параллельной области организована печать до прагмы single, внутри области, выделенной прагмой single, и после закрытия single-фрагмента.

 

Видно, что увеличение а на 10 выполняет только одна нить (в нашем случае оказалось, что это нить с номером 0), так что в конечном итоге имеем а=10.

Видно, что все нити печатают а=0 (строки «before single…»), печать из single-секции осуществляется однократно, затем после закрытия single-секции все нити печатают новое значение а=10 (строки («after single…»).

Директива master, подобно single, также указывает на однократное выполнение блока, однако выделенный блок будет выполнен не произвольной нитью, как в случае применения директивы single, а мастер-нитью, имеющей внутри параллельной области номер 0.

#pragma omp parallel

{

#pragma omp master

{ … }

}

 

Выделенный желтым фрагмент будет выполнен однократно, нитью с номером 0.

Директивы critical и atomic, выделяют фрагмент в параллельной области, выполняемый всеми нитями, задействованными в данной параллельной области, однако в каждый конкретный момент критический фрагмент выполняется только одной нитью, т.е. когда одна нить выполняет содержимое критической секции остальные нити, готовые к выполнению критической секции находятся в режиме ожидания.

 

#pragma omp parallel

{

#pragma omp critical

{ … }

}

 

Выделенный желтым фрагмент будет выполнен всеми нитями, но по очереди. Очередность выполнения нитями критической секции не определена.

Прагма atomic работает аналогично прагме crirical, только она относится к непосредственно следующему за ней оператору.

 

int count=0;

#pragma omp parallel

{

#pragma omp atomic

count++;

}

Здесь каждая нить увеличивает значение общей переменной count на 1, в результате переменная count примет значение, равное количеству нитей.

Отметим, что в языках с и с++ имеются ограничения на операторы, которые могут применяться в atomic-секции.

Директива ordered – еще одна директива для выделения критических секций, она используется только в параллельных циклах. В директиве for при этом должна быть указана опция ordered. Прагма ordered обеспечивает упорядоченное выполнение ordered-блока всеми нитями по очереди, по порядку их номеров. Внутри ordered-секции в каждый момент времени может находиться только один поток. Данная прагма может, например, использоваться для упорядочения печатив цикле.

К директивам синхронизации относятся также прагма барьерной синхронизации (barrier) и прагма flush, о них написано в учебном пособии по OpenMP.

 

Пример 2. Рассмотрим применение директивы ordered.

 

 

В приведенной программе с помощью прагмы ordered обеспечивается печать каждой нитью выполняемых ею номеров итераций цикла, в порядке возрастания номеров нитей. Прагма for имеет опцию ordered В цикле присутствуют два оператора печати: вне ordered-секции и из ordered-секции (эта строка начинается со слова «ordered»). Видно, что печать вне ordered-секции – неупорядочна, а строки, начинающиеся со слова «ordered» выводятся на экран по порядку возрастания индекса i:

Задание

 

1. Изучить раздел 3.1 в учебном пособии по OpenMP.

2. Воспроизвести на кластере Hybrilit вышеприведенные примеры по применению прагмы omp single и ordered.

3. Заменить в программе из Примера й директиву omp single на omp master. Прокомментировать результат запуска.

4. Заменить в этой же программе директиву omp single на omp critical. Прокомментировать результат запуска и получаемое конечное значение а.

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-12-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: