- •ЗАКЛЮЧЕНИЕ ПО6 РАСПАРАЛЛЕЛИВАНИЮ ЦИКЛОВ
- •int main()
- •ОСОБЕННОСТИ ВЫПОЛНЕНИЯ
- •ОСОБЕННОСТИ ВЫПОЛНЕНИЯ
- •ОСОБЕННОСТИ ВЫПОЛНЕНИЯ
- •СИНХРОНИЗАЦИЯ
- •ДИРЕКТИВА BARRIER
- •ПРИМЕР – СИНХРОНИЗАЦИЯ ПЕЧАТИ
- •ДИРЕКТИВА ORDERED
- •ОСОБЕННОСТИ
- •ПРИМЕР – СИНХРОНИЗАЦИЯ ПЕЧАТИ
- •ПРИМЕР – СИНХРОНИЗАЦИЯ ПЕЧАТИ
- •КРИТИЧЕСКИЕ РАЗДЕЛЫ
- •ДИРЕКТИВА CRITICAL
- •ОСОБЕННОСТИ ВЫПОЛНЕНИЯ
- •ПРИМЕР – КОРРЕКТНАЯ РАБОТА С ОБЩЕЙ ПЕРЕМЕННОЙ
- •ДИРЕКТИВА SINGLE
- •ОПЦИЯ COPYPRIVATE
- •ПРИМЕР (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 печатается ещё раз . |
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