3.4.3 Параллельные секции
Директива OpenMP sections используется для выделения участков
программы в области параллельных структурных блоков, выполняющихся
в отдельных параллельных потоках. Данная директива содержит набор
структурированных блоков, которые распределяются по потокам в группе.
Каждый структурированный блок исполняется один раз одним из потоков
в группе.
#pragma omp sections опция[[[,] опция] ...]
{
#pragma omp section
структурированный блок
#pragma omp section
структурированный блок ...
}
При выполнении этого кода OpenMP сначала создает группу
потоков, а затем распределяет между ними обработку итераций цикла,
после выполнения которого потоки начинают параллельную обработку
оставшихся разделов кода. Если количество разделов программного кода
будет больше числа потоков, обработка нескольких разделов будет
отложена до тех пор, пока не появятся свободные потоки. В отличие от
планирования циклов, распределение нагрузки между потоками при
обработке параллельных разделов кода осуществляется и контролируется
OpenMP. Программисту остается только выбрать, какие переменные
будут общими, а какие – индивидуальными, и предусмотреть выражения
уменьшения аналогично сегменту с организацией циклов.
Рассмотрим возможные опции данной директивы.
private(список) – задаёт список переменных, для которых
порождается локальная копия в каждой нити; начальное значение
локальных копий переменных из списка не определено.
firstprivate(список) – задаёт список переменных, для которых
порождается локальная копия в каждой нити; локальные копии
переменных инициализируются значениями этих переменных в нити-
мастере.
lastprivate(список) – переменным, перечисленным в списке,
присваивается результат, полученный в последней секции.
|