Параллельное программирование с использованием OpenMP. Антонов (2009) (Параллельное программирование с использованием OpenMP. Антонов (2009).pdf), страница 2
Описание файла
PDF-файл из архива "Параллельное программирование с использованием OpenMP. Антонов (2009).pdf", который расположен в категории "". Всё это находится в предмете "суперкомпьютерное моделирование и технологии" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 2 страницы из PDF
В простейшем случае процесс состоит из одной нити. Нити иногда называют также потоками, легковеснымипроцессами, LWP (light-weight processes).Важным достоинством технологии OpenMP является возможность реализации так называемого инкрементального программирования, когда программист постепенно находит участки в программе, содержащие ресурс параллелизма, с помощью предоставляемых механизмов делает их параллельными, азатем переходит к анализу следующих участков. Таким образом, в программенераспараллеленная часть постепенно становится всё меньше.
Такой подходзначительно облегчает процесс адаптации последовательных программ к параллельным компьютерам, а также отладку и оптимизацию.Описание функциональности OpenMP в данном пособии снабжено большимколичеством примеров. Все примеры протестированы сотрудниками лабораторииПараллельныхинформационныхтехнологийНаучноисследовательского вычислительного центра МГУ имени М.В.
Ломоносована суперкомпьютере СКИФ МГУ «ЧЕБЫШЁВ» [9] с использованием компиляторов Intel Fortran/C++ 11.0.Дополнительную информацию об интерфейсе OpenMP можно найти на тематической странице Информационно-аналитического центра по параллельнымвычислениям в сети Интернет Parallel.ru [4].7Основные понятияКомпиляция программыДля использования механизмов OpenMP нужно скомпилировать программукомпилятором, поддерживающим OpenMP, с указанием соответствующегоключа (например, в icc/ifort используется ключ компилятора –openmp, в gcc/gfortran –fopenmp, Sun Studio -xopenmp, в Visual C++ - /openmp, в PGI -mp).Компилятор интерпретирует директивы OpenMP и создаёт параллельныйкод.
При использовании компиляторов, не поддерживающих OpenMP, директивы OpenMP игнорируются без дополнительных сообщений.Компилятор с поддержкой OpenMP определяет макрос _OPENMP, которыйможет использоваться для условной компиляции отдельных блоков, характерных для параллельной версии программы. Этот макрос определён в формате yyyymm, где yyyy и mm – цифры года и месяца, когда был принят поддерживаемый стандарт OpenMP.
Например, компилятор, поддерживающийстандарт OpenMP 3.0, определяет _OPENMP в 200805.Для проверки того, что компилятор поддерживает какую-либо версиюOpenMP, достаточно написать директивы условной компиляции #ifdef или#ifndef. Простейшие примеры условной компиляции в программах на языках Си и Фортран приведены в примере 1.#include <stdio.h>int main(){#ifdef _OPENMPprintf("OpenMP is supported!\n");#endif}Пример 1a. Условная компиляция на языке Си.program example1b#ifdef _OPENMPprint *, "OpenMP is supported!"#endifendПример 1b.
Условная компиляция на языке Фортран.Для условной компиляции программ на Фортране строки могут также начинаться с пары символов !$, C$ или *$. В этом случае компилятор, поддерживающий OpenMP, заменит пару этих символов на два пробела, таким образом«раскомментировав» их. Пример 1с показывает использование такого варианта условной компиляции.8!$program example1cprint *, "OpenMP is supported!"endПример 1c. Условная компиляция на языке Фортран.Модель параллельной программыРаспараллеливание в OpenMP выполняется явно при помощи вставки в текстпрограммы специальных директив, а также вызова вспомогательных функций. При использовании OpenMP предполагается SPMD-модель (Single Program Multiple Data) параллельного программирования, в рамках которой длявсех параллельных нитей используется один и тот же код.Программа начинается с последовательной области – сначала работает одинпроцесс (нить), при входе в параллельную область порождается ещё некоторое число процессов, между которыми в дальнейшем распределяются частикода.
По завершении параллельной области все нити, кроме одной (нитимастера), завершаются, и начинается последовательная область. В программеможет быть любое количество параллельных и последовательных областей.Кроме того, параллельные области могут быть также вложенными друг вдруга. В отличие от полноценных процессов, порождение нитей является относительно быстрой операцией, поэтому частые порождения и завершениянитей не так сильно влияют на время выполнения программы.Для написания эффективной параллельной программы необходимо, чтобывсе нити, участвующие в обработке программы, были равномерно загруженыполезной работой. Это достигается тщательной балансировкой загрузки, длячего предназначены различные механизмы OpenMP.Существенным моментом является также необходимость синхронизациидоступа к общим данным.
Само наличие данных, общих для нескольких нитей, приводит к конфликтам при одновременном несогласованном доступе.Поэтому значительная часть функциональности OpenMP предназначена дляосуществления различного рода синхронизаций работающих нитей.OpenMP не выполняет синхронизацию доступа различных нитей к одним итем же файлам. Если это необходимо для корректности программы, пользователь должен явно использовать директивы синхронизации или соответствующие библиотечные функции. При доступе каждой нити к своему файлуникакая синхронизация не требуется.9Директивы и функцииЗначительная часть функциональности OpenMP реализуется при помощи директив компилятору. Они должны быть явно вставлены пользователем, чтопозволит выполнять программу в параллельном режиме. Директивы OpenMPв программах на языке Фортран оформляются комментариями и начинаютсяс комбинации символов !$OMP, C$OMP или *$OMP, а в языке Си — указаниямипрепроцессору, начинающимися с #pragma omp.
Ключевое слово omp используется для того, чтобы исключить случайные совпадения имён директивOpenMP с другими именами.Формат директивы на Си/Си++:#pragma omp directive-name [опция[[,] опция]...]Формат директивы на Фортране:!$OMP directive-name [опция[[,] опция]...]С$OMP directive-name [опция[[,] опция]...]*$OMP directive-name [опция[[,] опция]...]Объектом действия большинства директив является один оператор или блок,перед которым расположена директива в исходном тексте программы. ВOpenMP такие операторы или блоки называются ассоциированными с директивой. Ассоциированный блок должен иметь одну точку входа в начале и одну точку выхода в конце. Порядок опций в описании директивы несущественен, в одной директиве большинство опций может встречаться несколькораз.
После некоторых опций может следовать список переменных (для Фортрана также и имён COMMON-блоков, заключённых в слеши), разделяемыхзапятыми.Все директивы OpenMP можно разделить на 3 категории: определение параллельной области, распределение работы, синхронизация. Каждая директива может иметь несколько дополнительных атрибутов – опций (clause). Отдельно специфицируются опции для назначения классов переменных,которые могут быть атрибутами различных директив.Чтобы задействовать функции библиотеки OpenMP периода выполнения (исполняющей среды), в программу нужно включить заголовочный файл omp.h(для программ на языке Фортран – файл omp_lib.h или модуль omp_lib).Если вы используете в приложении только OpenMP-директивы, включатьэтот файл не требуется.
Функции назначения параметров имеют приоритетнад соответствующими переменными окружения.10Все функции, используемые в OpenMP, начинаются с префикса omp_. Еслипользователь не будет использовать в программе имён, начинающихся с такого префикса, то конфликтов с объектами OpenMP заведомо не будет. Вязыке Си, кроме того, является существенным регистр символов в названияхфункций. Названия функций OpenMP записываются строчными буквами.Для того чтобы программа, использующая функции OpenMP, могла оставаться корректной для обычного компилятора, можно прилинковать специальную библиотеку, которая определит для каждой функции соответствующую «заглушку» (stub).
Например, в компиляторе Intel соответствующаябиблиотека подключается заданием ключа –openmp-stubs.Выполнение программыПосле получения выполняемого файла необходимо запустить его на требуемом количестве процессоров. Для этого обычно нужно задать количество нитей, выполняющих параллельные области программы, определив значениепеременной среды OMP_NUM_THREADS. Например, в Linux в командной оболочке bash это можно сделать при помощи следующей команды:export OMP_NUM_THREADS=nПосле запуска начинает работать одна нить, а внутри параллельных областейодна и та же программа будет выполняться всем набором нитей. Стандартный вывод программы в зависимости от системы будет выдаваться на терминал или записываться в файл с предопределенным именем.Замер времениВ OpenMP предусмотрены функции для работы с системным таймером.Функция omp_get_wtime() возвращает в вызвавшей нити астрономическоевремя в секундах (вещественное число двойной точности), прошедшее с некоторого момента в прошлом.Си:double omp_get_wtime(void);Фортран:double precision function omp_get_wtime()Если некоторый участок программы окружить вызовами данной функции, торазность возвращаемых значений покажет время работы данного участка.Гарантируется, что момент времени, используемый в качестве точки отсчета,11не будет изменён за время существования процесса.