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

1

СИНТАКСИС ДИРЕКТИВЫ PARALLEL FOR

#pragma omp parallel for[опции ...] newline { ...for ...

}

schedule (type [,chunk]) ordered

private (list) firstprivate (list) lastprivate (list) shared (list)

reduction (operator: list) collapse (n)

nowait

2

ОПЦИЯ COLLAPSE

collapse(n) — n последовательных

тесновложенных циклов ассоциируется с данной директивой.

Для циклов образуется общее пространство итераций, которое делится между тредами.

Если опция не задана, то директива относится только к одному - непосредственно следующему за ней циклу.

3

ОПЦИЯ ORDERED

Опция для указания о том, что в цикле могут встречаться

директивы ordered.

В этом случае определяется

блок внутри тела цикла,

который должен выполняться в порядке, установленном в

последовательном цикле

4

ОПЦИЯ NOWAIT

По умолчанию в конце параллельного цикла происходит неявная барьерная синхронизация

параллельно работающих тредов –

дальнейшее выполнение происходит только тогда, когда все треды достигнут данной точки (барьера).

Если подобная задержка не нужна, используют опцию nowait.

Это позволяет тредам, уже дошедшим до конца цикла, продолжить

выполнение без синхронизации с остальными тредами.

5

ПРИМЕР

#include <omp.h> #define CHUNKSIZE 100 #define N 1000

main ()

{

int i, chunk;

float a[N], b[N], c[N]; // Some initializations

for (i=0; i < N; i++) a[i] = b[i] = i * 1.0; chunk = CHUNKSIZE;

#pragma omp parallel shared(a,b,c,chunk) private(i)

{

#pragma omp for schedule(dynamic,chunk) nowait for (i=0; i < N; i++)

c[i] = a[i] + b[i];

}

// end of parallel section

}

ЗАКЛЮЧЕНИЕ ПО6 РАСПАРАЛЛЕЛИВАНИЮ ЦИКЛОВ

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

Если цикл не содержит зависимостей, его итерации можно выполнять в любом порядке, в том числе

параллельно.

Соблюдение этого требования компилятор не проверяет, вся ответственность - на программисте.

Если дать указание компилятору распараллелить цикл, содержащий зависимости, результат работы программы может оказаться некорректным.

Задание – подобрать пример такого цикла, проверить выполнение параллельной программы.

7

ДИРЕКТИВА SECTIONS

Используется для реализации функционального параллелизма.

Эта директива определяет набор независимых секций кода, каждая из которых выполняется своим тредом.

8

СИНТАКСИС ДИРЕКТИВЫ SECTIONS

#pragma omp sections [опции ...] newline private (list)

firstprivate (list) lastprivate (list) reduction (operator: list) nowait

{

#pragma omp section newline structured_block //отдельный тред #pragma omp section newline structured_block //отдельный тред

}

int main()

{int n;

#pragma omp parallel private(n)

{n=omp_get_thread_num(); #pragma omp sections

#pragma omp section

{printf("section1, thread %d\n", n);

}

#pragma omp section

{printf("section2, thread %d\n", n);

}

#pragma omp section

{printf("section3, thread %d\n", n);

}

}

printf("parallel region, thread %d\n", n);

}

}

ОСОБЕННОСТИ ВЫПОЛНЕНИЯ

Перед первым участком кода в блоке sections

директива section не обязательна.

Какие треды будут выполнять какую секцию, не

определено.

Если число тредов больше количества секций, то часть тредов для выполнения данного блока секций не будет задействована.

Если число тредов меньше количества секций, то некоторым тредам достанется более одной секции.

10

ОСОБЕННОСТИ ВЫПОЛНЕНИЯ

Опция lastprivate определенно связана с последней section:

int n=0;

#pragma omp parallel

{ #pragma omp sections lastprivate(n)

{ #pragma omp section { n=1;

}

#pragma omp section { n=2;

}

#pragma omp section { n=3;

}

}

printf(«n on thread%d: %d\n", omp_get_thread_num(), n);

}

 

printf(«n out of parallel region: %d\n", n);

11

 

ОСОБЕННОСТИ ВЫПОЛНЕНИЯ

Переменная n объявлена как lastprivate.

Три треда, выполняющие секции section, присваивают своей локальным копиям n разные значения.

По выходе из области sections значение n из последней секции присваивается локальным копиям во всех тредах.

Поэтому все треды напечатают число 3.

Это же значение сохранится для переменной n и в последовательной области.

12

СИНХРОНИЗАЦИЯ

С. – ожидание одних (выполняющихся тредов) другими (уже выполненными).

С. действует в некоторых случаях (см. ранее for, sections) по умолчанию.

Опция nowait отменяет ожидание.

Самый распространенный способ синхронизации в OpenMP – барьер.

13

ДИРЕКТИВА BARRIER

• Синтаксис директивы:

#pragma omp barrier

Треды, выполняющие текущую параллельную область, дойдя до этой директивы,

останавливаются и ждут, пока все треды не дойдут до этой точки

программы, после чего разблокировываются и продолжают работать дальше.

14

ПРИМЕР – СИНХРОНИЗАЦИЯ ПЕЧАТИ

#pragma omp parallel

{

printf("Message 1\n"); printf("Message 2\n"); #pragma omp barrier printf("Message 3\n");

}

Выдачи разных тредов Message 1 и Message 2 могут появиться в произвольном порядке.

Выдача Message 3 со всех тредов придёт строго после двух предыдущих выдач.

15

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