Вперед: 3.2. Директивы OpenMP
Назад: 2.10. Контрольные вопросы к главе 2.
К содержанию: Оглавление


Глава 3. Прикладной программный интерфейс OpenMP

3.1. Основы OpenMP

В главе 1 были упомянуты некоторые концептуальные идеи, заложенные в OpenMP. Изложим их более подробно. Итак, OpenMP является прикладным программным интерфейсом для параллельного программирования в модели общей памяти. Поддерживаются интерфейсы к стандартным языкам программирования Фортран и C/C++. OpenMP включает в себя набор директив компилятору, набор встроенных процедур и функций и набор переменных окружения. Поскольку исполнимая параллельная программа изготавливается на этапе компиляции, интерфейс OpenMP должен быть встроен непосредственно в компилятор. Таким образом, разработка программ с использованием технологии OpenMP требует использования специальных компиляторов. С этой точки зрения интерфейс MPI, реализованный в виде библиотеки, является более "демократичным", поскольку может работать с любым стандартным компилятором. К счастью, на сегодняшний день, практически все современные компиляторы поддерживают интерфейс OpenMP. Так как, директивы компилятору выглядят как комментарии и должны игнорироваться обычными компиляторами, то при компиляции OpenMP программ требуется указывать, что необходима обработка OpenMP директив. Для компиляторов Intel это делается с помощью специальной опции -openmp (-fopenmp для компиляторов GCC). Для компиляторов других производителей опции для подключения OpenMP могут быть другие.

OpenMP программа состоит из последовательных и параллельных фрагментов. Программа начинает выполняться как обычный однонитевый процесс, который в ОpenMP называется главной нитью (master thread). Этот процесс выполняется последовательно до тех пор, пока он не дойдет до параллельной части - области, заключенной между директивами PARALLEL и END PARALLEL, в программе на языке Фортран, или до директивы #pragma omp parallel в программах на языках C/C++. В этот момент создается группа (team) нитей. Число нитей в группе задается переменной окружения OMP_NUM_THREADS или вызовом подпрограммы OMP_SET_NUM_THREADS перед началом выполнения параллельного фрагмента. Отметим, что это возможно только в том случае, если значение переменной окружения OMP_DYNAMIC установлено в 1. В свою очередь, значение переменной OMP_DYNAMIC может быть модифицировано функцией OMP_SET_DYNAMIC. Внутри параллельной области число нитей фиксировано. Все нити имеют уникальные номера. Главная нить имеет номер 0. Параллельный фрагмент выполняется всеми нитями. После завершения параллельного фрагмента все нити группы, кроме 0-й, завершаются и продолжает выполняться только главная нить. OpenMP допускает вложения параллельных конструкций (пар PARALLEL/END PARALLEL).

В параллельной области все переменные программы разделяются на два класса: общие (SHARED) и локальные (PRIVATE). Общая переменная всегда существует лишь в одном экземпляре для всей программы и доступна всем нитям под одним и тем же именем. Объявление локальной переменной вызывает порождение своего экземпляра данной переменной для каждой нити. Изменение нитью значения локальной переменной, никак не влияет на значение этой же локальной переменной в других нитях. По умолчание все статические переменные считаются общими, кроме счетчиков циклов. Все динамические переменные по умолчанию считаются локальными. Директивы объявления параллельной области, как правило, сопровождаются набором ключей (clauses) для изменения класса переменных, правил их поведения по умолчанию и поведению переменных при входе в параллельную область и выходе из параллельной области: REDUCTION, FIRSTPRIVATE, LASTPRIVATE, COPYIN.



Вперед: 3.2. Директивы OpenMP
Назад: 2.10. Контрольные вопросы к главе 2.
К содержанию: Оглавление