Хелпикс

Главная

Контакты

Случайная статья





Семинар 12. Тема:Параллельное выполнение независимых фрагментов в OpenMP



Семинар 12

Тема:Параллельное выполнение независимых фрагментов в OpenMP

                                 

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

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

Вторая возможность – параллельное выполнение независимых фрагментов с использованием директивы sections. Особенности применения данной директивы – тема нынешнего семинара.

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

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

· директивы for и sections нельзя применять совместно! Нельзя распараллеливать циклы внутри независимых фрагментов, определяемых прагмой for! Нельзя организовывать параллельное выполнение фрагментов с помощью прагмы sections внутри параллельного цикла!

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

Итак, директива sections используется для распределения независимых фрагментов (секций) программного кода между потоками, при этом каждый поток (нить) будет выполнять свою секцию. Выбор конкретной нити, которая будет выполнять данную секцию, осуществляется компилятором. Если секций больше, чем потоков, то несколько секций будут выполняться одной нитью по очереди.

Нижеприведенный фрагмент демонстрирует схему использования директивы sections. В параллельной области, организованной с помощью прагмы parallel, вся совокупность независимых фрагментов выделяется прагмой sections, а каждый из независимых фрагментов этой совокупности выделяется с помощью прагмы section.

 

#pragma omp parallel

{ //открыли параллельную область

...

#pragma omp sections

{ //выделили совокупность фрагментов. Которые хотим выполнить параллельно

#pragma omp section

{ // первый независимый фрагмент

...

}

#pragma omp section

{ // второй независимый фрагмент

...      

}

} // закрыли прагму sections

...

} // закрыли прагму parallel

 

Как и в случае директивы for, если параллельная область открывается только ради параллельного выполнения независимых секций – прагмы parallel и sections можно применить совместно в одной строке:

 

#pragma omp parallel sections

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.