- •ЗАКЛЮЧЕНИЕ ПО6 РАСПАРАЛЛЕЛИВАНИЮ ЦИКЛОВ
- •int main()
- •ОСОБЕННОСТИ ВЫПОЛНЕНИЯ
- •ОСОБЕННОСТИ ВЫПОЛНЕНИЯ
- •ОСОБЕННОСТИ ВЫПОЛНЕНИЯ
- •СИНХРОНИЗАЦИЯ
- •ДИРЕКТИВА BARRIER
- •ПРИМЕР – СИНХРОНИЗАЦИЯ ПЕЧАТИ
- •ДИРЕКТИВА ORDERED
- •ОСОБЕННОСТИ
- •ПРИМЕР – СИНХРОНИЗАЦИЯ ПЕЧАТИ
- •ПРИМЕР – СИНХРОНИЗАЦИЯ ПЕЧАТИ
- •КРИТИЧЕСКИЕ РАЗДЕЛЫ
- •ДИРЕКТИВА CRITICAL
- •ОСОБЕННОСТИ ВЫПОЛНЕНИЯ
- •ПРИМЕР – КОРРЕКТНАЯ РАБОТА С ОБЩЕЙ ПЕРЕМЕННОЙ
- •ДИРЕКТИВА SINGLE
- •ОПЦИЯ COPYPRIVATE
- •ПРИМЕР (COPYPRIVATE)
- •ДИРЕКТИВА MASTER
- •ДИРЕКТИВА ATOMIC
- •statement_expression:
- •ОСОБЕННОСТИ ВЫПОЛНЕНИЯ
- •ПРИМЕР
- •ДИРЕКТИВА FLUSH
- •ОСОБЕННОСТИ
- •• Неявно flush без параметров присутствует (если нет опции nowait):
ДИРЕКТИВА ORDERED
• Синтаксис директивы:
#pragma omp ordered
{
...
}
•Директива определяет блок внутри параллельного цикла, который должен выполняться в том порядке, в котором итерации шли бы в последовательном цикле.
•Директива for должна содержать опцию ordered
16
ОСОБЕННОСТИ
ВЫПОЛНЕНИЯ
•Для вложенных циклов выделенный блок операторов относится к самому внутреннему из циклов.
•Тред, выполняющий первую итерацию цикла, выполняет операции выделенного блока.
•Тред, выполняющий k-ую итерацию, должен сначала дождаться выполнения всех операций выделенного блока всеми тредами, выполняющими предыдущие итерации.
17
ПРИМЕР – СИНХРОНИЗАЦИЯ ПЕЧАТИ
int i, n; omp_set_num_threads(4);
#pragma omp parallel private (i, n)
{n=omp_get_thread_num(); #pragma omp for ordered for (i=0; i<5; i++)
{
printf(“Thread %d, iter %d\n", n, i); #pragma omp ordered
{
printf("ordered:thread %d,iter %d\n",n, i);
}
}
}
•Внутри тела цикла идут две выдачи –
одна вне блока ordered, а вторая – внутри него.
18
ПРИМЕР – СИНХРОНИЗАЦИЯ ПЕЧАТИ
•В результате:
•первая выдача будет неупорядоченной,
•вторая идёт в порядке по возрастанию номера итерации.
19
КРИТИЧЕСКИЕ РАЗДЕЛЫ
•В коде можно выделять критические разделы.
•С помощью критических разделов можно
предотвратить одновременный доступ к
одному сегменту кода (критическому разделу!) из нескольких тредов.
•Один тред получает доступ только тогда, когда другие не выполняют данный код.
20
ДИРЕКТИВА CRITICAL
• Синтаксис директивы:
#pragma omp critical [name]
{
...
}
21
ОСОБЕННОСТИ ВЫПОЛНЕНИЯ
•В каждый момент времени критический раздел может выполнять не более одного треда.
•Если критический раздел уже выполняет какой-либо тред, то все другие треды будут заблокированы, пока вошедший тред не закончит выполнение.
•Как только работавший тред выйдет из критического раздела, один из заблокированных войдет в него.
•Если на входе в критический раздел стояло несколько тредов, то случайным образом выбирается один из них.
•Остальные заблокированные треды продолжают
ожидание.
22
ПРИМЕР – КОРРЕКТНАЯ РАБОТА С ОБЩЕЙ ПЕРЕМЕННОЙ
main()
{
int x; x = 0;
#pragma omp parallel shared(x)
{
#pragma omp critical x = x + 1;
}
// end of parallel section
}
23
ДИРЕКТИВА SINGLE
•Блок выполняется единственным тредом
•Синтаксис директивы:
#pragma omp single [опции ...] newline private (list)
firstprivate (list) copyprivate (list) nowait
{
structured_block //единственный тред
}
24
ОПЦИЯ COPYPRIVATE
•После выполнения треда новые значения
переменных списка будут доступны всем
одноименным частным переменным (private и firstprivate), описанным в начале параллельной области и используемым всеми её тредами.
•Опция не может использоваться совместно с опцией nowait.
•Переменные списка не могут быть перечислены в опциях private и firstprivate данной директивы single.
25