Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Answers.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
522.63 Кб
Скачать
  1. Директивы OpenMp. Распределение вычислений по потокам.

Существует 3 директивы для распределения вычислений в параллельной области:

  • DO/for – распараллеливание циклов

  • section – распараллеливание раздельных фрагментов кода (функциональное распараллеливание)

  • single – директива для указания последовательного выполнения кода

!Начало выполнения директив по умолчанию не синхронизируется, завершение директив по умолчанию является синхронным.

Директива DO/for распределение итераций цикла между потоками; параллельная область уже должна быть активна, иначе игнорируется.

# pragma omp for [clause ...] newline

for_loop

clause

schedule (type[,chunk]) ordered

private (list)

firstprivate (list)

lastprivate (list)

shared (list)

reduction (operator: list)

nowait

Директива DO/for – распределение итераций регулируется параметром schedule.

  • static – итерации делятся на блоки по chunk итераций и статистически разделяются между потоками; если параметр chunk не определен, итерации делятся между потоками равномерно и непрерывно.

  • dynamic – распределение итерационных блоков осуществляется динамически (по умолчанию chunk=1)

  • guided – размер итерационного блока уменьшается экспоненциально при каждом распределении; chunk определяет минимальный размер блока (по умолчанию chunk=1)

  • runtime – правило распределения определяется переменной OMP_SCHEDULE (при использовании runtime параметр chunk задаваться не должен)

Директива sectionраспределение вычислений для раздельных фрагментов кода

  • фрагменты выделяются при помощи директивы section

  • каждый фрагмент выполняется однократно

  • разные фрагменты выполняются разными потоками

  • завершение директивы по умолчанию синхронизируется

  • директивы section должны использоваться только в статическом контексте

# pragma omp section [clause ...] newline

{

# pragma omp section newline

structured_block

}

clause

firstprivate (list)

lastprivate (list)

reduction (operator: list)

nowait

Директива singleопределение фрагмента кода, который должен быть выполнен только одним потоком; все остальные потоки ожидают завершения выполнения фрагмента (если не указан параметр nowait)

# pragma omp single [clause ...] newline

structured_block

clause

private (list)

firstprivate (list)

nowait

  1. Директивы OpenMp. Синхронизация.

  • masterопределяет фрагмент кода , который должен быть выполнен только основным потоком; все остальные потоки пропускают данный фрагмент (завершение директивы по умолчанию не синхронизируется)

#pragma omp master newline

structured_block

  • criticalопределяет фрагмент кода, который должен выполняться только одним потоком в каждый текущий момент времени (критическая секция)  При попытке входа в критическую секцию, которая уже исполняется одним из потоков используется, все другие потоки приостанавливаются ( блокируются ). Как только критическая секция освобождается, один из приостановленных потоков (если они имеются) активизируется для выполнения критической секции.

#pragma omp critical [name] newline

structured_block

Как можно заметить, критические секции могут быть именованными - можно рекомендовать активное использование данной возможности для разделения критических секций, т.к. это позволит уменьшить число блокировок процессов.

  • barrierопределяет точку синхронизации, которую должны достигнуть все процессы для продолжения вычислений (директива должна быть вложена в блок)

#pragma omp barrier newline

  • atomic – определяет переменную, доступ к которой (чтение/запись) должен быть выполнен как неделимая операция

#pragma omp atomic

statement_exrpession

Возможный формат записи выражения: x binop = expr, x++,++x,x--,--x

x должна быть скалярной переменной

expr не должна ссылаться на x

binop должна быть перегруженной операцией вида +,-,*,/,&,^,|,>>,<<

  • flushопределяет точку синхронизации, в которой системой должно быть обеспечено единое для всех процессов состояние памяти (т.е. если потоком какое-либо значение извлекалось из памяти для модификации, измененное значение обязательно должно быть записано в общую память)

#pragma omp flush (list) newline

Если указан список list, то восстанавливаются только указанные переменные.

Директива flush неявным образом присутствует в директивах barrier, critical, ordered, parallel, for, section, single

  • ordered – указывает фрагмент кода параллельного цикла, который должен выполняться точно в таком же порядке, как и при последовательном выполнении.

#pragma omp ordered newline

structured_block

В каждый момент в блоке ordered может находиться только один поток.

На одной итерации цикла может быть только одна директива ordered и эта директива может выполниться только однократно.

Цикл, в котором есть директива ordered, должен иметь параметр ordered

  • threadprivateиспользуется для создания поточных копий для глобальных переменных программы; созданные копии не видимы между потоками, но существуют все время выполнения программы

#pragma omp threadprivate (list)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]