Синхронизация типа atomic
Отв. за выпуск Е.Н. Григорьева
Подписано в печать 17.09.07. Формат 60´84/16. Бумага газетная. Печать офсетная. Гарнитура Times New Roman. Усл. печ. л. 3,0. Уч.-изд.л. 2,32. Тираж 150 экз. Заказ №657.
Чувашский государственный университет
Типография университета
428015 Чебоксары, Московский просп., 15
Лабораторная работа №2
Синхронизация процессов.
Проблема синхронизации параллельных потоков состоит в том, что любой структурный параллельный блок по определению имеет одну точку выхода, за которой обычно находится последовательный структурный блок. Вычисления в последовательном блоке, как правило, могут быть продолжены, если завершены все процессы в параллельном структурном блоке и их результаты корректно переданы в последовательный блок. Именно для обеспечения такой корректной передачи данных и необходима процедура синхронизации параллельных потоков.
Следует отметить, что пока не завершены все параллельные процессы, программа не может начать подготовку загрузки конвейеров процессоров. Это ведет к большим потерям при синхронизации процессов, аналогичных потерям при работе условных операторов в обычной последовательной программе.
В OpenMP существует шесть типов синхронизации[1]:
- critical,
- atomic,
- barrier,
- master,
- ordered,
- flush.
Синхронизация типа atomic
Определяет, что определенная переменная должна быть изменена атомарно – то есть исключить возможность записи значения от нескольких процессов-нитей – избежать проблемы «состояния гонок» (race conditions).
Данная директива относится к идущему непосредственно за ней оператору, гарантируя корректную работу с общей переменной, стоящей в левой части оператора присваивания.
#pragma omp atomic <statement>where statement is an expression statement of scalar type that takes one of the forms that follow:
statement | Conditions |
x bin_op = expr | where: bin_op is one of: + * - / & ^ | << >> expr is an expression of scalar type that does not reference x. |
Атомарные операции могут использоваться в качестве одной из основных форм:
x++ | ++x |
x-- | --x |
x += expr | x -= expr |
x *= expr | x /= expr |
x <<= expr | x >>= expr |
x &= expr | x ^=expr |
x |= expr |
Notes
Load and store operations are atomic only for object x. Evaluation of expr is not atomic.
All atomic references to a given object in your program must have a compatible type.
Objects that can be updated in parallel and may be subject to race conditions should be protected with the omp atomic directive.
Дата добавления: 2015-02-03; просмотров: 868;