На этом шаге мы рассмотрим основные конструкции 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.