OpenMP | это... Что такое OpenMP? (original) (raw)
OpenMP (Open Multi-Processing) — открытый стандарт для распараллеливания программ на языках Си, Си++ и Фортран. Описывает совокупность директив компилятора, библиотечных процедур и переменных окружения, которые предназначены для программирования многопоточных приложений на многопроцессорных системах с общей памятью.
Содержание
- 1 Разработка
- 2 Введение
- 3 Ключевые элементы
- 4 Примеры программ
- 5 Существующие реализации
- 6 Пример реализации
- 7 Инструменты
- 8 См. также
- 9 Примечания
- 10 Ссылки
Разработка
Разработку спецификации OpenMP ведут несколько крупных производителей вычислительной техники и программного обеспечения, чья работа регулируется некоммерческой организацией, называемой OpenMP Architecture Review Board (ARB) [1].
Первая версия появилась в 1997 году, предназначалась для языка Fortran. Для С/С++ версия разработана в 1998 году. В 2008 году вышла версия OpenMP 3.0.
Введение
OpenMP реализует параллельные вычисления с помощью многопоточности, в которой «главный» (master) поток создает набор подчиненных (slave) потоков и задача распределяется между ними. Предполагается, что потоки выполняются параллельно на машине с несколькими процессорами (количество процессоров не обязательно должно быть больше или равно количеству потоков).
Задачи, выполняемые потоками параллельно, также как и данные, требуемые для выполнения этих задач, описываются с помощью специальных директив препроцессора соответствующего языка — прагм. Например, участок кода на языке Fortran, который должен исполняться несколькими потоками, каждый из которых имеет свою копию переменной N, предваряется следующей директивой: !$OMP PARALLEL PRIVATE(N)
Количество создаваемых потоков может регулироваться как самой программой при помощи вызова библиотечных процедур, так и извне, при помощи переменных окружения.
Ключевые элементы
Ключевыми элементами OpenMP являются
- конструкции для создания потоков (директива
parallel
), - конструкции распределения работы между потоками (директивы
DO
/for
иsection
), - конструкции для управления работой с данными (выражения
shared
иprivate
для определения класса памяти переменных), - конструкции для синхронизации потоков (директивы
critical
,atomic
иbarrier
), - процедуры библиотеки поддержки времени выполнения (например,
omp_get_thread_num
), - переменные окружения (например,
OMP_NUM_THREADS
).
Примеры программ
Ниже приведены примеры программ с использованием директив OpenMP:
Fortran 77
В этой программе на языке Fortran создается заранее неизвестное число потоков (оно определяется переменной окружения OMP_NUM_THREADS
перед запуском программы), каждый из которых выводит приветствие вместе со своим номером. Главный поток (имеющий номер 0) также выводит общее число потоков, но только после того, как все они «пройдут» директиву BARRIER
.
Код программы
PROGRAM HELLO
INTEGER ID, NTHRDS
INTEGER OMP_GET_THREAD_NUM, OMP_GET_NUM_THREADS
C$OMP PARALLEL PRIVATE(ID) ID = OMP_GET_THREAD_NUM() PRINT *, 'HELLO WORLD FROM THREAD', ID C$OMP BARRIER IF ( ID .EQ. 0 ) THEN NTHRDS = OMP_GET_NUM_THREADS() PRINT *, 'THERE ARE', NTHRDS, 'THREADS' END IF C$OMP END PARALLEL END
C
В этой программе два массива (a и b) складываются параллельно десятью потоками.
Код программы
#include <stdio.h> #include <omp.h>
#define N 100
int main(int argc, char *argv[]) { double a[N], b[N], c[N]; int i; omp_set_dynamic(0); // запретить библиотеке openmp менять число потоков во время исполнения omp_set_num_threads(10); // установить число потоков в 10
// инициализируем массивы for (i = 0; i < N; i++) { a[i] = i * 1.0; b[i] = i * 2.0; }
// вычисляем сумму массивов #pragma omp parallel shared(a, b, c) private(i) { #pragma omp for for (i = 0; i < N; i++) c[i] = a[i] + b[i]; } printf ("%f\n", c[10]); return 0; }
Эту программу можно скомпилировать, используя gcc-4.4 и более новые с флагом -fopenmp.
Существующие реализации
OpenMP поддерживается многими современными компиляторами.
- Компиляторы Sun Studio поддерживают официальную спецификацию — OpenMP 2.5 [2] — с улучшенной производительностью под ОС Solaris; поддержка Linux запланирована на следующий релиз.
- Visual C++ 2005 и выше поддерживает OpenMP в редакциях Professional и Team System [3].
- GCC 4.2 поддерживает OpenMP, а некоторые дистрибутивы (такие как Fedora Core 5 gcc) включили поддержку в свои версии GCC 4.1.
- Intel C++ Compiler, включая версию Intel Cluster OpenMP для программирования в системах с распределённой памятью.
- IBM XL compiler
- PGI (Portland group)
- Pathscale
- HP
Пример реализации
Компиляторы Sun Studio создают отдельную процедуру из исходного кода, располагающегося под директивой parallel
, а вместо самой директивы вставляют вызов процедуры __mt_MasterFunction_
библиотеки libmtsk
, передавая ей адрес искусственно созданной. Таким образом, разделяемые (shared) данные могут быть переданы последней по ссылке, а собственные (private) объявляются внутри этой процедуры, оказываясь независимыми от своих копий в других потоках.
Процедура __mt_MasterFunction_
создает группу потоков (количеством 9 в приведенном выше примере на языке C), которые будут выполнять код конструкции parallel
, а вызвавший её поток становится главным в группе. Затем главный поток организовывает работу подчиненных потоков, после чего начинает выполнять пользовательский код сам. Когда код будет выполнен, главный поток вызывает процедуру _mt_EndOfTask_Barrier_
, синхронизирующую его с остальными.
Инструменты
- VivaMP — Статический анализатор Си/Си++ кода для выявления ошибок в программах, построенных на технологии OpenMP (рус.)
- Intel® Threading Tools — инструменты анализа производительности программ OpenMP (рус.)
См. также
- Intel Threading Building Blocks — библиотека для параллельного программирования на С++
- MPI (Message Passing Interface) — интерфейс обмена сообщений между процессами
- Список многопоточных библиотек C++
- OpenCL - открытый каркас для параллельных вычислений на графических и центральных процессорах
- OpenACC
Примечания
- ↑ Официальный сайт OpenMP Architecture Review Board
- ↑ 1. Introducing the OpenMP API (Sun Studio 12: OpenMP API User’s Guide) — Sun Microsystems
- ↑ Visual C++ Editions
Ссылки
- openmp.org — официальный сайт OpenMP
Intel Software Network (рус.)
- Richard Gerber Начало работы с OpenMP*. Intel Software Network (5 июня 2009 года). Архивировано из первоисточника 3 марта 2012. Проверено 11 февраля 2010.
- Richard Gerber Эффективное распределение нагрузки между потоками с помощью OpenMP*. Intel Software Network (5 июня 2009 года). Архивировано из первоисточника 3 марта 2012. Проверено 11 февраля 2010.
- Andrey Karpov Кратко о технологии OpenMP. Intel Software Network (5 января 2010 года). Архивировано из первоисточника 3 марта 2012. Проверено 11 февраля 2010.
viva64.com (рус.)
- Статья «32 подводных камня OpenMP при программировании на Си++» (рус.)
- Статья «Отладка и оптимизация многопоточных OpenMP-программ» (рус.)
Другие источники
- Введение в OpenMP: API параллельных программ для многопроцессорных систем с общей памятью (рус.)
- Что такое OpenMP? (рус.)
- OpenMP и C++ (рус.)
- Учебный курс — Параллельное программирование с использованием OpenMP (рус.)
- OpenMP Support in Sun Studio Compilers and Tools (англ.)
- Презентация на тему OpenMP (рус.)
Параллельные вычисления | |
---|---|
Общие положения | Облачные вычисления · Высокопроизводительные вычисления · Кластерные вычисления · Распределённые вычисления · Грид-вычисления · Гибридные вычисления |
Уровни паралеллизма | Биты · Инструкции · Данные · Задачи |
Поток выполнения | Суперпоточность · Гиперпоточность |
Теория | Закон Амдала · Закон Густавсона — Барсиса · Эффективность затрат · Метрика Карпа-Флэтта · Замедление · Коэффициент ускорения |
Элементы | Процесс · Поток · Файбер · ПМПД · Instruction window |
Взаимодействие | Многопроцессорность · Многопоточность · Когерентность памяти · Когерентность кэша · Недействительность кэша · Барьер · Синхронизация · Контрольная точка |
Программирование | Модели (Скрытый паралеллизм · Явный паралеллизм · Параллелизм) · Таксономия Флинна (SISD • SIMD • MISD • MIMD (SPMD)) · Поток · Неблокирующая синхронизация |
Компьютерная техника | Мультипроцессорность (Симметричная · Асимметричная) · Память (NUMA · COMA · Распределённая · Разделяемая · Распределённая разделяемая) · Одновременная многопоточность MPP · Суперскалярность · Векторный процессор · Суперкомпьютер · Beowulf |
API | Ateji PX · POSIX Threads · OpenMP · OpenHMPP · PVM · MPI · UPC · Intel Threading Building Blocks · Boost · Global Arrays · Charm++ · Cilk · Co-array Fortran · OpenCL · CUDA · Stream · Dryad · DryadLINQ |
Проблемы | Затруднительное распараллеливание · Проблемы Великого Вызова · Блокировка ПО · Масштабируемость · Состояние гонки · Взаимная блокировка · Активный тупик · Детерминированный алгоритм · Параллельное замедление |