Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
30
Добавлен:
19.04.2015
Размер:
848.94 Кб
Скачать

ПРИМЕР (COPYPRIVATE)

int n;

#pragma omp parallel private(n)

{n=omp_get_thread_num(); printf("n (start): %d\n", n);

#pragma omp single copyprivate(n)

{n=100;

}

printf("n (finish): %d\n", n);

}

Каждый тред присвоит переменной n значение, равное своему номеру, и напечатает его.

В области single один из тредов присвоит переменной n значение 100.

На выходе из области это значение будет присвоено переменной n на всех тредах.

В конце параллельной области значение n печатается ещё раз .

26

ДИРЕКТИВА MASTER

Блок выполняется единственным master-тредом.

• Остальные треды пропускают блок и продолжают работу с оператора, расположенного за ним.

Неявной синхронизации директива не предполагает.

Синтаксис директивы:

#pragma omp master newline

{

structured_block //master-тред

}

27

ДИРЕКТИВА ATOMIC

Используется для корректного обновления общих переменных.

Применяется к отдельному оператору типа присваивания.

Синтаксис директивы:

#pragma omp atomic statement_expression

28

statement_expression:

x op= expr;//составное присваивание x = x op expr;

x++;

++x; x--;

--x;

х – скалярная переменная,

expr – скалярное выражение,

в котором не присутствует переменная х. op - оператор:

+

*

-

/

&

^

|

<<

>>

29

 

ОСОБЕННОСТИ ВЫПОЛНЕНИЯ

На время выполнения оператора блокируется доступ к данной переменной всем запущенным в данный момент тредам, кроме треда, выполняющего операцию.

Атомарной является только работа с переменной в левой части оператора присваивания.

Вычисления в правой части не обязаны быть атомарными

30

ПРИМЕР

int count = 0; #pragma omp parallel

{

#pragma omp atomic count++;

}

printf("number of threads: %d\n", count);

Чтобы предотвратить одновременное изменение несколькими тредами значения переменной, стоящей в левой части оператора присваивания, используется директива atomic

31

ДИРЕКТИВА FLUSH

Используется для согласования состояния памяти (консистентность).

Синтаксис директивы:

#pragma omp flush [(list)]

32

ОСОБЕННОСТИ

ВЫПОЛНЕНИЯ

Значения всех переменных (или переменных из списка), временно хранящиеся в регистрах и кэш- памяти текущего треда, будут занесены в

основную память.

Все изменения переменных, сделанные тредом во время работы, станут видимы остальным тредам.

Если какая-то информация хранится в буферах вывода, то буферы будут сброшены и т.п.

Операция производится только с данными

вызвавшего треда.

Данные, изменявшиеся другими тредами,

не затрагиваются.

33

• Неявно flush без параметров присутствует (если нет опции nowait):

в директиве barrier,

на входе и выходе областей действия директив parallel, critical, ordered,

на выходе for, sections, single

в вызовах функций семафоров

flush вызывается для переменной, участвующей в операции, ассоциированной с директивой atomic.

flush не применяется на входе и выходе области действия директивы master

34

Соседние файлы в папке Параллельное программирование (лекции)