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

ДИРЕКТИВА 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

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