Здавалка
Главная | Обратная связь

Пример: Цикл выполняет инициализацию элементов двумерного массива целых чисел. Количество потоков равно 2.



Внешний цикл по переменной i объявлен параллельным, внутренний цикл по переменной j будет выполняться последовательно каждой нитью. Выполняется блочно-циклическое распределение итераций внешнего цикла по две итерации в блоке.

 

int a[4][4];

#pragma omp parallel private(i)

{

#pragma omp for schedule(static, 2)

for(i=0; i<4; i++)

{

Нить с номером 1
Нить с номером 0
for(j=0; j<4; j++)

{

a[i] [j]= i+1;

}

}

}

Пример:внутренний цикл по переменной j объявлен параллельным, внешний цикл переменной i будет выполняться последовательно каждой нитью. Выполняется блочно-циклическое распределение итераций внутреннего цикла по две итерации в блоке.

 

int a[4][4];

for(i=0; i<4; i++)

{

Нить с номером 1
Нить с номером 0
#pragma omp parallel private(j)

{

#pragma omp for schedule(static,2 )

for(j=0; j<4; j++)

{

a[i][j]=i+1;

}

}

}

Оператор nowait – если не указан, то конструкция for завершится барьерной синхронизацией.

Ограничения к применению for. Цикл for

1. должен быть блоком (т.е. должны использоваться фигурные скобки),

2. не должен содержать оператор break,

3. содержать только один оператор schedule, ordered, nowait,

4. Значение длина_порции должно быть одно и тоже для всех нитей в группе.

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

#pragma omp parallel

{

#pragma omp for nowait

for (i=0; i<n; i++)

b[i] = (a[i] + a[i-1]) / 2.0;

#pragma omp for nowait

for (i=0; i<m; i++)

y[i] = sqrt(z[i]);

}

Динамическая привязка директив должна придерживаться следующих правил:

1. Директивы for, sections, single, master и barrier динамически привязываются к внешней директиве parallel, если она, конечно, существует. Если нет параллельной области, выполняемой в данный момент, вышеуказанные директивы не имеют никакого действия.

2. Директива ordered динамически привязывается к внешней директиве for.

3. Директива atomic навязывает монопольный доступ в соответствии с директивой atomic во всех нитях, и не только в текущей группе.

4. Директива critical навязывает монопольный доступ в соответствии с директивой critical во всех нитях, и не только в текущей группе.

5. Директива никогда не может быть привязана к любой директиве вне ближайшей директивы parallel.

 

Динамическое вложение директив должно придерживается следующих правил:

 

1. Директива parallelдинамически вне другой директивы parallel логически порождает новую группу, которая состоит только из текущей нити, если только вложенный параллелизм разрешен.

2. Директивыfor, sections и single, которые привязаны к одной и тоже директиве parallel, не могут быть вложенными одна в другую.

3. Критическая секция не может быть вложена в другую критическую секцию с тем же именем.

4. Директива master запрещена в блоках директив for, sections и single.

5. Секция ordered запрещена в в блоке секции critical.

6. Директивы for, sections и singleне допустимы в блоках critical, ordered и master.

7. Директива barrier не допустима в блоках for, ordered, sections, single, master, иcritical.

 

Оператор sections

Операторsections определяет набор программных конструкций не итерационного типа (т.е. не цикл), которые делятся между нитями в группе. Каждая секция выполняется каждой нитью один раз. Синтаксис директивы sections:

#pragma omp sections [оператор [оператор] ...]

{

[#pragma omp section]







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.