stringtranslate.com

OpenMP

OpenMP ( Open Multi-Processing ) — это интерфейс прикладного программирования (API), который поддерживает многоплатформенное программирование многопроцессорной обработки с общей памятью на C , C ++ и Fortran , [3] на многих платформах, архитектурах с набором команд и операционных системах , включая Solaris. , AIX , FreeBSD , HP-UX , Linux , macOS и Windows . Он состоит из набора директив компилятора , библиотечных подпрограмм и переменных среды , которые влияют на поведение во время выполнения. [2] [4] [5]

OpenMP управляется некоммерческим технологическим консорциумом OpenMP Architecture Review Board (или OpenMP ARB ), совместно определяемым широким кругом ведущих поставщиков компьютерного оборудования и программного обеспечения, включая Arm , AMD , IBM , Intel , Cray , HP , Fujitsu , Nvidia , NEC . , Red Hat , Texas Instruments и Oracle Corporation . [1]

OpenMP использует портативную масштабируемую модель, которая предоставляет программистам простой и гибкий интерфейс для разработки параллельных приложений для платформ, начиная от стандартного настольного компьютера и заканчивая суперкомпьютером .

Приложение, созданное с использованием гибридной модели параллельного программирования , может работать в компьютерном кластере с использованием как OpenMP, так и интерфейса передачи сообщений (MPI), так что OpenMP используется для параллелизма внутри (многоядерного) узла, а MPI используется для параллелизма между узлами . . Также предпринимались попытки запустить OpenMP в программно-распределенных системах с общей памятью, [6] перевести OpenMP в MPI [7] [8] и расширить OpenMP для систем с неразделяемой памятью. [9]

Дизайн

Иллюстрация многопоточности , когда основной поток разделяет несколько потоков, которые параллельно выполняют блоки кода.

OpenMP — это реализация многопоточности , метода распараллеливания, при котором основной поток (серия инструкций, выполняемых последовательно) разделяет заданное количество подпотоков , и система разделяет задачу между ними. Затем потоки выполняются одновременно , при этом среда выполнения распределяет потоки по разным процессорам.

Раздел кода, предназначенный для параллельного выполнения, помечается соответствующим образом директивой компилятора, которая вызывает формирование потоков до выполнения раздела. [3] К каждому потоку прикреплен идентификатор , который можно получить с помощью функции (называемой omp_get_thread_num()). Идентификатор потока — целое число, а идентификатор основного потока равен 0 . После выполнения распараллеленного кода потоки снова объединяются в основной поток, который продолжается до конца программы.

По умолчанию каждый поток выполняет распараллеленный участок кода независимо. Конструкции разделения работы можно использовать для разделения задачи между потоками, чтобы каждый поток выполнял выделенную ему часть кода. Таким образом, с помощью OpenMP можно достичь как параллелизма задач , так и параллелизма данных .

Среда выполнения распределяет потоки по процессорам в зависимости от использования, загрузки компьютера и других факторов. Среда выполнения может назначать количество потоков на основе переменных среды , или код может делать это с помощью функций. Функции OpenMP включены в заголовочный файл , помеченный как omp.h в C / C++ .

История

Совет по обзору архитектуры OpenMP (ARB) опубликовал свои первые спецификации API, OpenMP для Fortran 1.0, в октябре 1997 года. В октябре следующего года они выпустили стандарт C/C++. В 2000 году была выпущена версия 2.0 спецификаций Fortran, а версия 2.0 спецификаций C/C++ была выпущена в 2002 году. Версия 2.5 представляет собой объединенную спецификацию C/C++/Fortran, выпущенную в 2005 году .

До версии 2.0 OpenMP в первую очередь определял способы распараллеливания очень регулярных циклов, как это происходит в матрично-ориентированном численном программировании , где количество итераций цикла известно во время входа. Это было признано ограничением, и в реализации были добавлены различные расширения параллельного выполнения задач. В 2005 году была сформирована группа по стандартизации параллелизма задач, которая опубликовала предложение в 2007 году, черпая вдохновение из функций параллелизма задач в Cilk , X10 и Chapel . [10]

Версия 3.0 была выпущена в мае 2008 года. В новые функции версии 3.0 входит концепция задач и конструкция задачи , [11] значительно расширяющая область применения OpenMP за пределы конструкций параллельного цикла, которые составляли большую часть OpenMP 2.0. [12]

Версия 4.0 спецификации была выпущена в июле 2013 года. [13] В ней добавлены или улучшены следующие функции: поддержка ускорителей ; атомика ; обработка ошибок; сходство потоков ; расширения задач; определяемое пользователем сокращение ; поддержка SIMD ; Поддержка Фортрана 2003 . [14] [ нужна полная цитата ]

Текущая версия — 5.2, выпущенная в ноябре 2021 года. [15]

Версия 6.0 должна быть выпущена в 2024 году. [16]

Обратите внимание, что не все компиляторы (и операционные системы) поддерживают полный набор функций последних версий.

Основные элементы

Диаграмма конструкций OpenMP

Основными элементами OpenMP являются конструкции для создания потоков, распределения рабочей нагрузки (совместного использования работы), управления средой данных, синхронизации потоков, процедур выполнения на уровне пользователя и переменных среды.

В C/C++ OpenMP использует #pragmas . Специальные прагмы OpenMP перечислены ниже.

Создание темы

Прагма omp Parallel используется для создания дополнительных потоков для параллельного выполнения работы, заключенной в конструкции. Исходный поток будет обозначен как главный поток с идентификатором потока 0.

Пример (программа C): Отображение «Hello, world». использование нескольких потоков.

#include <stdio.h> #include <omp.h>  int main ( void ) { #pragma omp параллельный printf ( «Привет, мир. \n » ); вернуть 0 ; }     

Используйте флаг -fopenmp для компиляции с использованием GCC:

$  gcc  -fopenmp  hello.c  -o  привет  -ldl

Вывод на компьютере с двумя ядрами и, следовательно, двумя потоками:

Привет,  мир.Привет,  мир.

Однако вывод также может быть искажен из-за состояния гонки, вызванного тем, что два потока совместно используют стандартный вывод .

Привет,  привет,  мир.рлд.

Является ли printfон атомарным, зависит от базовой реализации [17] в отличие от C++11 std::cout, который по умолчанию является потокобезопасным. [18]

Конструкции разделения работы

Используется для указания того, как назначить независимую работу одному или всем потокам.

Пример: инициализировать значение большого массива параллельно, используя каждый поток для выполнения части работы.

int main ( int argc , char ** argv ) { int a [ 100000 ];       #pragma omp Parallel for for ( int i = 0 ; i < 100000 ; я ++ ) { a [ i ] = 2 * i ; }                 вернуть 0 ; } 

Этот пример поразительно параллелен и зависит только от значения i . Флаг Parallel for OpenMP сообщает системе OpenMP разделить эту задачу между ее рабочими потоками. Каждый поток получит уникальную и закрытую версию переменной. [19] Например, при наличии двух рабочих потоков одному потоку может быть передана версия i с номерами от 0 до 49999, а второму — версия с номерами от 50000 до 99999.

Варианты директив

Вариантные директивы — это одна из основных функций, представленных в спецификации OpenMP 5.0, призванная помочь программистам улучшить переносимость производительности. Они позволяют адаптировать прагмы OpenMP и пользовательский код во время компиляции. Спецификация определяет признаки для описания активных конструкций OpenMP, исполнительных устройств и функций, предоставляемых реализацией, селекторы контекста на основе признаков и определяемых пользователем условий, а также метадирективы и директивы объявления , позволяющие пользователям программировать одну и ту же область кода с вариантными директивами.

Механизм, предоставляемый двумя вариантными директивами для выбора вариантов, более удобен в использовании, чем предварительная обработка C/C++, поскольку он напрямую поддерживает выбор варианта в OpenMP и позволяет компилятору OpenMP анализировать и определять окончательную директиву на основе вариантов и контекста.

// адаптация кода с помощью директив предварительной обработкиint v1 [ N ], v2 [ N ], v3 [ N ]; #if define(nvptx) #pragma omp целевые команды распределяют параллельно для map(to:v1,v2) map(from:v3) for ( int i = 0 ; i < N ; i ++ ) v3 [ i ] = v1 [ я ] * v2 [ я ]; #else #pragma omp target Parallel for map(to:v1,v2) map(from:v3) for ( int i = 0 ; i < N ; i ++ ) v3 [ i ] = v1 [ i ] * v2 [ i ]; #endif                                 // адаптация кода с использованием метадирективы в OpenMP 5.0int v1 [ N ], v2 [ N ], v3 [ N ]; #pragma omp target map(to:v1,v2) map(from:v3) #pragma omp метадиректива \  When(device={arch(nvptx)}: целевые группы распределяют параллельно для)\  default(target Parallel for) for ( int я = 0 ; я < N ; я ++ ) v3 [ я ] = v1 [ я ] * v2 [ я ];                 

Положения

Поскольку OpenMP — это модель программирования с общей памятью, большинство переменных в коде OpenMP по умолчанию видны всем потокам. Но иногда частные переменные необходимы, чтобы избежать состояния гонки , и возникает необходимость передавать значения между последовательной частью и параллельной областью (блоком кода, выполняемым параллельно), поэтому управление средой данных вводится в виде предложений атрибутов совместного использования данных путем добавления их к директива OpenMP. Различаются следующие виды оговорок:

Предложения атрибутов совместного использования данных
Положения о синхронизации
Положения о расписании
ЕСЛИ контроль
Инициализация
Копирование данных
Снижение
Другие

Подпрограммы выполнения на уровне пользователя

Используется для изменения/проверки количества потоков, определения того, находится ли контекст выполнения в параллельной области, количества процессоров в текущей системе, установки/снятия блокировок, функций синхронизации и т. д.

Переменные среды

Метод изменения функций выполнения приложений OpenMP. Используется для управления планированием итераций цикла, количеством потоков по умолчанию и т. д. Например, OMP_NUM_THREADS используется для указания количества потоков для приложения.

Реализации

OpenMP реализован во многих коммерческих компиляторах. Например, его поддерживают Visual C++ 2005, 2008, 2010, 2012 и 2013 (OpenMP 2.0 в редакциях Professional, Team System, Premium и Ultimate [20] [21] [22] ), а также Intel Parallel Studio для различных процессоров. . [23] Компиляторы и инструменты Oracle Solaris Studio поддерживают новейшие спецификации OpenMP с повышением производительности для ОС Solaris (UltraSPARC и x86/x64) и платформ Linux. Компиляторы Fortran, C и C++ от The Portland Group также поддерживают OpenMP 2.5. GCC также поддерживает OpenMP, начиная с версии 4.2.

Компиляторы с реализацией OpenMP 3.0:

Несколько компиляторов поддерживают OpenMP 3.1:

Компиляторы, поддерживающие OpenMP 4.0:

Несколько компиляторов, поддерживающих OpenMP 4.5:

Частичная поддержка OpenMP 5.0:

Автоматически распараллеливающие компиляторы, генерирующие исходный код, аннотированный директивами OpenMP:

Некоторые профилировщики и отладчики явно поддерживают OpenMP:

За и против

Плюсы:

Минусы:

Ожидаемые результаты

Можно было бы ожидать ускорения в N раз при запуске программы, распараллеленной с использованием OpenMP, на платформе N процессора. Однако это происходит редко по следующим причинам:

Сходство потоков

Некоторые поставщики рекомендуют устанавливать привязку к процессору для потоков OpenMP, чтобы связать их с определенными ядрами процессора. [45] [46] [47] Это сводит к минимуму затраты на миграцию потоков и переключение контекста между ядрами. Это также улучшает локальность данных и уменьшает трафик согласованности кэша между ядрами (или процессорами).

Тесты

Для демонстрации использования OpenMP, проверки его производительности и оценки правильности было разработано множество тестов.

Простые примеры

Тесты производительности включают в себя:

К критериям правильности относятся:

Смотрите также

Рекомендации

  1. ^ abc «О OpenMP ARB и». OpenMP.org. 11 июля 2013 г. Архивировано из оригинала 9 августа 2013 г. Проверено 14 августа 2013 г.
  2. ^ ab «Компиляторы и инструменты OpenMP». OpenMP.org. Ноябрь 2019 года . Проверено 5 марта 2020 г.
  3. ^ аб Ганье, Авраам Зильбершац, Питер Баер Галвин, Грег (17 декабря 2012 г.). Концепции операционной системы (9-е изд.). Хобокен, Нью-Джерси: Уайли. стр. 181–182. ISBN 978-1-118-06333-0.{{cite book}}: CS1 maint: несколько имен: список авторов ( ссылка )
  4. ^ Учебное пособие по OpenMP на Supercomputing 2008.
  5. ^ Использование OpenMP - Портативное параллельное программирование с общей памятью - Загрузите примеры книг и обсудите
  6. ^ Коста, Джей-Джей; и другие. (май 2006 г.). «Эффективный запуск приложений OpenMP на всеобщем SDSM». Журнал параллельных и распределенных вычислений . 66 (5): 647–658. дои : 10.1016/j.jpdc.2005.06.018. HDL : 2117/370260 .
  7. ^ Басумаллик, Айон; Мин, Сын Джай; Эйгенманн, Рудольф (2007). «Программирование систем с распределенной памятью с использованием OpenMP». 2007 Международный симпозиум IEEE по параллельной и распределенной обработке . Нью-Йорк: IEEE Press. стр. 1–8. CiteSeerX 10.1.1.421.8570 . дои : 10.1109/IPDPS.2007.370397. ISBN  978-1-4244-0909-9. S2CID  14237507.Препринт доступен на домашней странице Чэнь Дина; особенно см. раздел 3 о переводе OpenMP в MPI.
  8. ^ Ван, Цзюэ; Ху, Чан Цзюнь; Чжан, Цзилинь; Ли, ЦзяньЦзян (май 2010 г.). «Компилятор OpenMP для архитектур с распределенной памятью». Наука Китай Информационные науки . 53 (5): 932–944. дои : 10.1007/s11432-010-0074-0 .(По состоянию на 2016 год программное обеспечение KLCoMP, описанное в этом документе, не является общедоступным)
  9. ^ Cluster OpenMP (продукт, который раньше был доступен для компилятора Intel C++ версий с 9.1 по 11.1, но был исключен в версии 13.0)
  10. ^ Эгюад, Эдуард; Копти, Наваль; Дюран, Алехандро; Хофлингер, Джей; Линь, Юань; Массайоли, Федерико; Су, Эрнесто; Унникришнан, Прия; Чжан, Гуаньсун (2007). Предложение по параллелизму задач в OpenMP (PDF) . Учеб. Международный семинар по OpenMP.
  11. ^ «Интерфейс прикладного программного обеспечения OpenMP, версия 3.0» (PDF) . openmp.org. Май 2008 года . Проверено 6 февраля 2014 г.
  12. ^ ЛаГрон, Джеймс; Арибуки, Айодунни; Аддисон, Коди; Чепмен, Барбара (2011). Реализация задач OpenMP во время выполнения . Учеб. Международный семинар по OpenMP. стр. 165–178. CiteSeerX 10.1.1.221.2775 . дои : 10.1007/978-3-642-21487-5_13. 
  13. ^ «Выпущен API OpenMP 4.0» . OpenMP.org. 26 июля 2013 г. Архивировано из оригинала 09.11.2013 . Проверено 14 августа 2013 г.
  14. ^ «Интерфейс прикладного программного обеспечения OpenMP, версия 4.0» (PDF) . openmp.org. Июль 2013 . Проверено 6 февраля 2014 г.
  15. ^ «Спецификация OpenMP 5.2» .
  16. ^ «OpenMP ARB выпускает технический отчет 12» .
  17. ^ «C — Как использовать printf() в нескольких потоках» .
  18. ^ "std::cout, std::wcout - cppreference.com" .
  19. ^ «Учебное пособие – Параллельность циклов с OpenMP» . 14 июля 2009 г.
  20. ^ Выпуски Visual C++, Visual Studio 2005.
  21. ^ Выпуски Visual C++, Visual Studio 2008.
  22. ^ Выпуски Visual C++, Visual Studio 2010.
  23. ^ Дэвид Уортингтон, «Intel рассматривает жизненный цикл разработки с помощью Parallel Studio». Архивировано 15 февраля 2012 г. в Wayback Machine , SDTimes, 26 мая 2009 г. (по состоянию на 28 мая 2009 г.).
  24. ^ «Функции XL C/C++ для Linux» (по состоянию на 9 июня 2009 г.)
  25. ^ «Технологическая сеть Oracle для разработчиков Java | Технологическая сеть Oracle | Oracle» . Developers.sun.com . Проверено 14 августа 2013 г.
  26. ^ ab "openmp - GCC Wiki". Gcc.gnu.org. 30 июля 2013 г. Проверено 14 августа 2013 г.
  27. ^ Кеннеди, Патрик (6 сентября 2011 г.). «Компиляторы Intel® C++ и Fortran теперь поддерживают спецификацию OpenMP* 3.1 | Зона разработчиков Intel®». Software.intel.com . Проверено 14 августа 2013 г.
  28. ^ ab «Функции компиляторов IBM XL C/C++» . ИБМ . 13 декабря 2018 г.
  29. ^ ab «Функции компилятора IBM XL Fortran» . 13 декабря 2018 г.
  30. ^ ab «Примечания к выпуску Clang 3.7». llvm.org . Проверено 10 октября 2015 г.
  31. ^ "Домашняя страница Absoft" . Проверено 12 февраля 2019 г.
  32. ^ «Серия выпусков GCC 4.9 – Изменения» . www.gnu.org.
  33. ^ «Функции OpenMP * 4.0 в компиляторе Intel 15.0» . Программное обеспечение.intel.com. 13 августа 2014 г. Архивировано из оригинала 16 ноября 2018 г. Проверено 10 ноября 2014 г.
  34. ^ «Серия выпусков GCC 6 — Изменения» . www.gnu.org.
  35. ^ «Компиляторы и инструменты OpenMP» . openmp.org . www.openmp.org . Проверено 29 октября 2019 г.
  36. ^ ab «Поддержка OpenMP — документация Clang 12». clang.llvm.org . Проверено 23 октября 2020 г.
  37. ^ «GOMP — реализация OpenMP для GCC — Проект GNU — Фонд свободного программного обеспечения (FSF)» . gcc.gnu.org . Архивировано из оригинала 27 февраля 2021 г. Проверено 23 октября 2020 г.
  38. ^ «Поддержка OpenMP *» . Интел . Проверено 23 октября 2020 г.
  39. ^ аб Амриткар, Амит; Тафти, Данеш; Лю, Руй; Куфрин, Рик; Чепмен, Барбара (2012). «Параллелизм OpenMP для систем жидкость и жидкость-частицы». Параллельные вычисления . 38 (9): 501. doi :10.1016/j.parco.2012.05.005.
  40. ^ Амриткар, Амит; Деб, Сурья; Тафти, Данеш (2014). «Эффективное параллельное моделирование CFD-DEM с использованием OpenMP» . Журнал вычислительной физики . 256 : 501. Бибкод : 2014JCoPh.256..501A. дои : 10.1016/j.jcp.2013.09.007.
  41. ^ Поддержка ускорителя OpenMP для графических процессоров
  42. ^ Обнаружение и предотвращение условий гонки OpenMP в C++
  43. ^ «Алексей Колосов, Евгений Рыжков, Андрей Карпов 32 ловушки OpenMP для разработчиков C++». Архивировано из оригинала 7 июля 2017 г. Проверено 15 апреля 2009 г.
  44. ^ Стивен Блэр-Чаппел, корпорация Intel, «Став экспертом по параллельному программированию за девять минут», презентация на конференции ACCU 2010
  45. ^ Чен, Юронг (15 ноября 2007 г.). «Многоядерное программное обеспечение». Журнал технологий Intel . 11 (4). дои : 10.1535/itj.1104.08.
  46. ^ «Результат OMPM2001» . СПЕЦ. 28 января 2008 г.
  47. ^ «Результат OMPM2001» . СПЕЦ. 01 апреля 2003 г. Архивировано из оригинала 25 февраля 2021 г. Проверено 28 марта 2008 г.

дальнейшее чтение

Внешние ссылки