OpenMP
OpenMP (Open Multi-Processing) — открытый стандарт для распараллеливания программ на языках Си, C++ и Фортран. Даёт описание совокупности директив компилятора, библиотечных процедур и переменных окружения, которые предназначены для программирования многопоточных приложений на многопроцессорных системах с общей памятью.
Разработка спецификаций стандарта ведётся некоммерческой организацией OpenMP Architecture Review Board (ARB)[1], в которую входят все основные производители процессоров, а также ряд суперкомпьютерных лабораторий и университетов. Первая версия спецификации вышла в 1997 году, предназначалась только для Фортрана, в следующем году вышла версия для Си и C++.
OpenMP реализует параллельные вычисления с помощью многопоточности, в которой ведущий (англ. master) поток создаёт набор ведомых потоков, и задача распределяется между ними. Предполагается, что потоки выполняются параллельно на машине с несколькими процессорами (количество процессоров не обязательно должно быть больше или равно количеству потоков).
Задачи, выполняемые потоками параллельно, так же, как и данные, требуемые для выполнения этих задач, описываются с помощью специальных директив препроцессора соответствующего языка — «прагм». Например, участок кода на
Фортране, который должен исполняться несколькими потоками, каждый из которых имеет свою копию переменной N, предваряется следующей директивой: !$OMP PARALLEL PRIVATE(N)
Количество создаваемых потоков может регулироваться как самой программой при помощи вызова библиотечных процедур, так и извне, при помощи переменных окружения.
Ключевые элементы стандарта:
- конструкции для создания потоков (директива
parallel), - конструкции распределения работы между потоками (директивы
DO/forиsection), - конструкции для управления работой с данными (выражения
sharedиprivateдля определения класса памяти переменных), - конструкции для синхронизации потоков (директивы
critical,atomicиbarrier), - процедуры библиотеки поддержки времени выполнения (например,
omp_get_thread_num), - переменные окружения (например,
OMP_NUM_THREADS).
Примеры
Программа на Фортране-77, создающая заранее неизвестное число потоков (оно определяется переменной окружения 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
Программа на Си, складывающая в десять потоков массив a с массивом b (компилируется с использованием gcc-4.4 и более новых версий с флагом -fopenmp):
#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 for shared(a, b, c) private(i)
for (i = 0; i < N; i++)
c[i] = a[i] + b[i];
printf("%f\n", c[10]);
return 0;
}
Реализации
OpenMP поддерживается многими современными компиляторами.
Компиляторы Sun Studio поддерживают спецификацию OpenMP 2.5[2] с поддержкой операционной системы Solaris; поддержка Linux запланирована на следующий выпуск[уточнить]. Эти компиляторы создают отдельную процедуру из исходного кода, располагающегося под директивой parallel, а вместо самой директивы вставляют вызов процедуры __mt_MasterFunction_ библиотеки libmtsk, передавая ей адрес искусственно созданной. Таким образом, разделяемые (shared) данные могут быть переданы последней по ссылке, а собственные (private) объявляются внутри этой процедуры, оказываясь независимыми от своих копий в других потоках. Процедура __mt_MasterFunction_ создает группу потоков (количеством 9 в приведенном выше примере на языке C), которые будут выполнять код конструкции parallel, а вызвавший её поток становится главным в группе. Затем главный поток организовывает работу подчиненных потоков, после чего начинает выполнять пользовательский код сам. Когда код будет выполнен, главный поток вызывает процедуру _mt_EndOfTask_Barrier_, синхронизирующую его с остальными.
Visual C++ 2005 и 2008 поддерживает OpenMP 2.0 в редакциях Professional и Team System, 2010 — в редакциях Professional, Premium и Ultimate, 2012 — во всех редакциях[3].
В GCC начиная с версии 4.2 реализована поддержка OpenMP для Си, C++ и Фортрана (на базе gfortran), а некоторые дистрибутивы (такие как Fedora Core 5) включили поддержку в GCC 4.1. В Clang и LLVM 3.7 поддерживается OpenMP 3.1.[4].
Intel C++ Compiler, Intel Fortran Compiler и Intel Parallel Studio поддерживают версию OpenMP 3.0, а также Intel Cluster OpenMP для программирования в системах с распределённой памятью. Существуют также реализации в компиляторах IBM XL compiler, PGI (Portland group), Pathscale, HP[уточнить].
См. также
- Intel Threading Building Blocks — библиотека для параллельного программирования на C++
- MPI (Message Passing Interface) — интерфейс обмена сообщений между процессами
- OpenCL — открытый каркас для параллельных вычислений на графических и центральных процессорах
- OpenACC
Примечания
- ↑ Официальный сайт OpenMP Architecture Review Board. Дата обращения: 15 января 2008. Архивировано из оригинала 20 июля 2008 года.
- ↑ 1. Introducing the OpenMP API (Sun Studio 12: OpenMP API User’s Guide) — Sun Microsystems
- ↑ Visual C++ Editions. Дата обращения: 15 января 2008. Архивировано 23 апреля 2008 года.
- ↑ OpenMP.org » Blog Archive » Clang 3.7 will have full OpenMP 3.1 support. openmp.org. Дата обращения: 3 сентября 2015. Архивировано 5 сентября 2015 года.
Ссылки
- openmp.org — официальный сайт OpenMP
Intel Software Network (рус.)
- Richard Gerber. Начало работы с OpenMP*. Intel Software Network (5 июня 2009). Дата обращения: 11 февраля 2010. Архивировано из оригинала 3 марта 2012 года.
- Richard Gerber. Эффективное распределение нагрузки между потоками с помощью OpenMP*. Intel Software Network (5 июня 2009). Дата обращения: 11 февраля 2010. Архивировано из оригинала 3 марта 2012 года.
- Andrey Karpov. Кратко о технологии OpenMP. Intel Software Network (5 января 2010). Дата обращения: 11 февраля 2010. Архивировано из оригинала 3 марта 2012 года.
viva64.com (рус.)
- Статья «32 подводных камня OpenMP при программировании на Си++» (рус.)
- Статья «Отладка и оптимизация многопоточных OpenMP-программ» (рус.)
Другие источники
- Учебник по OpenMP Архивная копия от 16 февраля 2019 на Wayback Machine (рус.)
- Введение в OpenMP: API параллельных программ для многопроцессорных систем с общей памятью (рус.)
- Что такое OpenMP? Архивная копия от 1 февраля 2008 на Wayback Machine (рус.) — базовая статья на сайте parallel.ru Архивная копия от 23 января 2008 на Wayback Machine
- OpenMP и C++ (рус.)
- Параллельное программирование с использованием OpenMP Архивная копия от 20 апреля 2008 на Wayback Machine (рус.) — Учебный курс на сайте Intuit.ru
- Презентация на тему OpenMP Архивная копия от 29 мая 2015 на Wayback Machine (рус.)
- OpenMP Support in Sun Studio Compilers and Tools Архивная копия от 26 октября 2007 на Wayback Machine (англ.)
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.