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

ПРИМЕР (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 печатается ещё раз .

• На всех тредах n=100.

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

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