Студопедия — Цикл for
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Цикл for






цикл for должен иметь классическую форму языка Си:

for (выражение; логическая_операция; приращение)

{

Тело цикла

}

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

private (список)

firstprivate (список)

lastprivate (список)

reduction (оператор: список)

Ordered

schedule (вид [, длина_порции ])

Nowait

Операторы private, firstprivate, lastprivate и reduction рассматривались ранее.

Оператор ordered определяет блок, в котором итерации цикла выполняются в последовательном режиме. Не допускается использование в конструкции for оператора ordered более одного раза.

Оператор schedule определяет, как итерации цикла делятся между нитями группы. Правильность программы не должна зависеть от того, какая нить выполняет конкретную итерацию. Вид планирования может быть одним из следующих:

static schedule (static, длина_порции) -итерации делятся на порции длиной, равной длина_порции. Порции назначаются нитям в группе в порядке увеличения номеров нитей. Количество итераций делится на порции, которые приблизительно равны между собой, и каждой нити назначается одна порция. Значение порции статическое (не меняется)
dynamic schedule (dynamic, длина_порции) -порция итераций длиной длина_порции назначается каждой нити. Когда нить завершит присвоенную ей порцию итераций, ей динамически назначается следующая порция, пока все порции не закончатся. Последняя порция может иметь меньшее число итераций. По умолчанию (длина_порции -не определена) значение равно 1.
guided schedule(guided, длина_порции) -итерации назначаются нитям порциями с уменьшением размера порции. Когда нить завершает выполнение своей порции итераций, то назначается следующая порция до тех пор, пока их не останется. Если длина_порции= 1, то длина_порции равна отношению числа итераций на число нитей. По умолчанию длина_порции =1.
runtime schedule(runtime) - распределение и размер порции выбираются во время выполнения по значению переменной OMP_SCHEDULE(устанавливает способ планирования и длину порции, аналогично static, dynamic и guided, п. export OMP_SCHEDULE = guided,4 или export OMP_SCHEDULE = dynamic). Если перем-я среды не установлена, то планирование зависит от реализации OpenMP. Параметр, определяющий размер порции не указывается.

Примеры использования циклов:

int a[10];

#pragma omp parallel private(i)

{

#pragma omp for schedule(static, 3)

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

a[i] = i+1;

}

индекс элемента                    
значение                    
номер нити        

int a[10];

#pragma omp parallel private(i)

{

#pragma omp for schedule(dynamic, 3)

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

a[i] = i+1;

}

индекс элемента                    
значение                    
номер нити      

int a[10];

#pragma omp parallel private(i)

{

#pragma omp for schedule(guided, 3)

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

a[i] = i+1;

}

индекс элемента                    
значение                    
номер нити      

Пример: Цикл выполняет инициализацию элементов двумерного массива целых чисел. Количество потоков равно 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.

 







Дата добавления: 2015-08-12; просмотров: 754. Нарушение авторских прав; Мы поможем в написании вашей работы!



Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

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

Тема 5. Организационная структура управления гостиницей 1. Виды организационно – управленческих структур. 2. Организационно – управленческая структура современного ТГК...

Методы прогнозирования национальной экономики, их особенности, классификация В настоящее время по оценке специалистов насчитывается свыше 150 различных методов прогнозирования, но на практике, в качестве основных используется около 20 методов...

Методы анализа финансово-хозяйственной деятельности предприятия   Содержанием анализа финансово-хозяйственной деятельности предприятия является глубокое и всестороннее изучение экономической информации о функционировании анализируемого субъекта хозяйствования с целью принятия оптимальных управленческих...

Тема 5. Анализ количественного и качественного состава персонала Персонал является одним из важнейших факторов в организации. Его состояние и эффективное использование прямо влияет на конечные результаты хозяйственной деятельности организации.

Билет №7 (1 вопрос) Язык как средство общения и форма существования национальной культуры. Русский литературный язык как нормированная и обработанная форма общенародного языка Важнейшая функция языка - коммуникативная функция, т.е. функция общения Язык представлен в двух своих разновидностях...

Патристика и схоластика как этап в средневековой философии Основной задачей теологии является толкование Священного писания, доказательство существования Бога и формулировка догматов Церкви...

Studopedia.info - Студопедия - 2014-2024 год . (0.013 сек.) русская версия | украинская версия