Составители:
Рубрика:
В этом примере массивы A,B,C объявлены общими; общей объ-
явлена также переменная N. Переменная I является локальной (что
вполне естественно). Итерации между нитями здесь распределяют-
ся динамически блоками по 100 итераций. В конце параллельно-
го цикла синхронизация производиться не будет из-за директивы
!$OMP END DO NOWAIT.
§ 9. Критические секции
Критическая секция программы оформляется для того, чтобы
нити проходили ее поочередно: в каждый момент времени в крити-
ческой секции может находиться не более одной нити. Критическая
секция оформляется директивами
!$OMP CRITICAL [(<имя критической секции >)]
<фрагмент программы >
!$OMP END CRITICAL [(<имя критической секции >)]
Если критическая секция выполняется, то нити, выполнившие ди-
рективу CRITICAL, останавливаются и ждут, пока упомянутая нить
не завершит работу в критической секции. Порядок прохождения
нитями критической секции (если на входе в нее стоит несколь-
ко нитей) не предопределен и, с точки зрения пользователя, носит
случайный характер (определяемый генерацией системы и распре-
делением памяти в момент исполнения).
Рассмотрим следующий пример.
!$OMP CRITICAL
I=OMP_GET_THREAD_NUM()
PRINT*,I
!$OMP END CRITICAL
Здесь номера всех нитей будут напечатаны от 0 до
OMP_NUM_THREADS-1 независимо от того, объявлена ли пере-
менная I общей или она объявлена локальной. Напомним, что в
ранее приведенном примере (без критической секции)
I=OMP_GET_THREAD_NUM()
PRINT*,I
144
Страницы
- « первая
- ‹ предыдущая
- …
- 141
- 142
- 143
- 144
- 145
- …
- следующая ›
- последняя »
