20
printf("Hello, World 2!\n");
#pragma omp section
printf("Hello, World 3!\n");
}
Каждый независимый фрагмент участка sections обрамляет-
ся в отдельный участок section. В приведенном фрагменте в нача-
ле параллельного региона принудительно создается количество
потоков, равное количеству секций. Однако такой подход не все-
гда оптимален и удобен. Обычно правильнее не задавать количе-
ство потоков, а оставить его выбор на совесть системы OpenMP,
чтобы обеспечить большую гибкость
при смене платформы.
Наконец, одна из наиболее важных директив – директива
for. Как известно, наибольший потенциал к распараллеливанию
содержат циклы. Директива for позволяет распараллелить выпол-
нение отдельных итераций некоторого цикла. Следует отметить,
что для возможности распараллеливания цикла необходимо, что-
бы итерации были независимыми между собой по входным и вы-
ходным данным. Иначе говоря
, в них не должно быть зависимо-
сти от порядка выполнения. К примеру, рекуррентные итерации
являются зависимыми, поэтому их распараллеливать гораздо
сложнее, если вообще возможно.
Директива for распределяет итерации одноименного цикла
между существующими потоками параллельного региона:
#pragma omp parallel
#pragma omp for
for (int i = 0; i < 3; i++)
printf("Hello, World %d!\n", i);
При этом аргументы цикла должны быть в так называемой
канонической форме. Говоря коротко, аргументы должны содер-
жать инициализацию некой переменной, сравнение ее значения с
заданным значением границы диапазона и приращение значения
переменной, которое может содержать увеличение или уменьше-
ние на фиксированную величину. Подробнее об этом можно про-
читать в спецификации [38].
Итерации
цикла, объявленного в контексте директивы for,
распределяются между потоками объемлющего региона parallel.
Для явного указания способа распределения итераций между по-
токами (статическое, динамическое, др.) используется параметр