- •ЗАКЛЮЧЕНИЕ ПО6 РАСПАРАЛЛЕЛИВАНИЮ ЦИКЛОВ
- •int main()
- •ОСОБЕННОСТИ ВЫПОЛНЕНИЯ
- •ОСОБЕННОСТИ ВЫПОЛНЕНИЯ
- •ОСОБЕННОСТИ ВЫПОЛНЕНИЯ
- •СИНХРОНИЗАЦИЯ
- •ДИРЕКТИВА BARRIER
- •ПРИМЕР – СИНХРОНИЗАЦИЯ ПЕЧАТИ
- •ОСОБЕННОСТИ
- •ПРИМЕР – СИНХРОНИЗАЦИЯ ПЕЧАТИ
- •ПРИМЕР – СИНХРОНИЗАЦИЯ ПЕЧАТИ
- •КРИТИЧЕСКИЕ РАЗДЕЛЫ
- •ДИРЕКТИВА CRITICAL
- •ОСОБЕННОСТИ ВЫПОЛНЕНИЯ
- •ПРИМЕР – КОРРЕКТНАЯ РАБОТА С ОБЩЕЙ ПЕРЕМЕННОЙ
- •ДИРЕКТИВА SINGLE
- •ОПЦИЯ COPYPRIVATE
- •ДИРЕКТИВА ORDERED
- •ПРИМЕР (COPYPRIVATE)
- •ДИРЕКТИВА MASTER
- •ДИРЕКТИВА ATOMIC
- •statement_expression:
- •ОСОБЕННОСТИ ВЫПОЛНЕНИЯ
- •ПРИМЕР
- •ДИРЕКТИВА FLUSH
- •ОСОБЕННОСТИ
- •• Неявно flush без параметров присутствует (если нет опции nowait):
ПРИМЕР (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
