Шаг 41.
Параллельные алгоритмы. Средства построения параллельных программ. Конструкции OpenMP

    На этом шаге мы рассмотрим основные конструкции OpenMP.

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

    OpenMP включает два базовых типа конструкций: директивы pragma и функции исполняющей среды OpenMP. Директивы pragma являются специальными директивами для компиляторов. Они создают и организуют выполнение параллельных процессов (нитей), а также обмен данными между процессами. Все эти директивы начинаются с #pragma omp. Как и любые другие директивы pragma, они игнорируются компилятором, не поддерживающим конкретную технологию - в данном случае OpenMP.

    Директивы OpenMP аналогичны директивам препроцессора для языка C/C++, что позволяет в любой момент разработки параллельной реализации программного продукта при необходимости вернуться к последовательному варианту программы.

    Функции OpenMP служат в основном для изменения и получения параметров среды. Кроме того, OpenMP включает API-функции для поддержки некоторых типов синхронизации. Чтобы задействовать эти функции библиотеки OpenMP периода выполнения (исполняющей среды), в программу нужно включить заголовочный файл omp.h. Если в приложении используются только OpenMP-директивы pragma, подключать этот файл не требуется.

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

  #pragma omp <директива> [раздел [ [,] раздел]...]

    Общий вид основных директив OpenMP на языке C/C++:

#pragma omp parallel                          \
         private (var1, var2, …)              \
         shared (var1, var2, …)               \
         firstprivate (var1, var2, …)         \
         lastprivate (var1, var2, …)          \
         copyin (var1, var2, …)               \
         reduction (operator: var1, var 2, …) \
         if (expression)                      \
         default (shared | none)              \
{
   [ Структурный блок программы]
}

    Для обозначения начала и окончания параллельного блока программы в C/C++ используются обычные фигурные скобки. Для продолжения длинных директив на следующих строках в программах на C/C++ применяется символ "обратный слэш" в конце строки.

    Помимо директив OpenMP поддерживает ряд полезных подпрограмм. Они делятся на три обширных категории: функции исполняющей среды, блокировки/синхронизации и работы с таймерами. Все эти функции имеют имена, начинающиеся с omp_, и определены в заголовочном файле omp.h.

    Подпрограммы первой категории позволяют запрашивать и задавать различные параметры операционной среды OpenMP. Функции, имена которых начинаются на omp_set_, можно вызывать только вне параллельных регионов. Все остальные функции можно использовать как внутри параллельных регионов, так и вне таковых.

    Описание директив и функций OpenMP дается в приложении 2.

    На следующем шаге мы приведем алгоритм настроки среды для создания приложений с использованием OpenMP.




Предыдущий шаг Содержание Следующий шаг