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, так и Message Passing Interface (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 ; поддержка Fortran 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 parallel printf ( "Привет, мир. \n " ); return 0 ; }     

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

$  gcc  -fopenmp  привет.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 ; i ++ ) { a [ i ] = 2 * i ; }                 вернуть 0 ; } 

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

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

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

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

// адаптация кода с использованием директив предварительной обработкиint v1 [ N ], v2 [ N ], v3 [ N ]; #if defined(nvptx) #pragma omp target commands distribution parallel for map(to:v1,v2) map(from:v3) for ( int i = 0 ; i < N ; i ++ ) v3 [ i ] = v1 [ i ] * v2 [ i ]; #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 metadirective \  when(device={arch(nvptx)}: целевые команды распределяют параллельно для)\  default(целевой параллельный для) for ( int i = 0 ; i < N ; i ++ ) v3 [ i ] = v1 [ i ] * v2 [ i ];                 

Положения

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

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

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

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

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

Метод изменения функций выполнения приложений 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 OS (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. 2013-07-11. Архивировано из оригинала 2013-08-09 . Получено 2013-08-14 .
  2. ^ ab "OpenMP Compilers & Tools". OpenMP.org. Ноябрь 2019 г. Получено 2020-03-05 .
  3. ^ ab Gagne, Abraham Silberschatz, Peter Baer Galvin, Greg (2012-12-17). Концепции операционной системы (9-е изд.). Hoboken, NJ: Wiley. стр. 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. doi :10.1016/j.jpdc.2005.06.018. hdl : 2117/370260 .
  7. ^ Basumallik, Ayon; Min, Seung-Jai; Eigenmann, Rudolf (2007). «Программирование распределенных систем памяти с использованием OpenMP». 2007 IEEE International Parallel and Distributed Processing Symposium . Нью-Йорк: IEEE Press. стр. 1–8. CiteSeerX 10.1.1.421.8570 . doi :10.1109/IPDPS.2007.370397. ISBN  978-1-4244-0909-9. S2CID  14237507.Препринт доступен на домашней странице Чэнь Дина; особенно см. Раздел 3 о переводе OpenMP в MPI.
  8. ^ Ван, Цзюэ; Ху, Чанцзюнь; Чжан, Цзилинь; Ли, Цзяньцзян (май 2010 г.). «Компилятор OpenMP для архитектур с распределенной памятью». Science China Information Sciences . 53 (5): 932–944. doi : 10.1007/s11432-010-0074-0 .(По состоянию на 2016 год программное обеспечение KLCoMP, описанное в этой статье, по-видимому, не является общедоступным)
  9. ^ Cluster OpenMP (продукт, который был доступен для Intel C++ Compiler версий 9.1–11.1, но был исключен из 13.0)
  10. ^ Айгуаде, Эдуард; Копти, Навал; Дюран, Алехандро; Хёфлингер, Джей; Линь, Юань; Массайоли, Федерико; Су, Эрнесто; Унникришнан, Прия; Чжан, Гуансонг (2007). Предложение по параллелизму задач в OpenMP (PDF) . Труды Международного семинара по OpenMP.
  11. ^ "OpenMP Application Program Interface, Version 3.0" (PDF) . openmp.org. Май 2008 . Получено 2014-02-06 .
  12. ^ ЛаГрон, Джеймс; Арибуки, Айодунни; Аддисон, Коди; Чепмен, Барбара (2011). Реализация задач OpenMP во время выполнения . Учеб. Международный семинар по OpenMP. стр. 165–178. CiteSeerX 10.1.1.221.2775 . дои : 10.1007/978-3-642-21487-5_13. 
  13. ^ "OpenMP 4.0 API Released". OpenMP.org. 2013-07-26. Архивировано из оригинала 2013-11-09 . Получено 2013-08-14 .
  14. ^ "OpenMP Application Program Interface, Version 4.0" (PDF) . openmp.org. Июль 2013 . Получено 2014-02-06 .
  15. ^ «Спецификация OpenMP 5.2».
  16. ^ «OpenMP ARB выпускает технический отчет 12».
  17. ^ «C — Как использовать printf() в нескольких потоках».
  18. ^ "std::cout, std::wcout - cppreference.com".
  19. ^ "Учебник – Параллельные циклы с OpenMP". 2009-07-14.
  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++ for Linux Features", (дата обращения: 9 июня 2009 г.)
  25. ^ "Oracle Technology Network для разработчиков Java | Oracle Technology Network | Oracle". Developers.sun.com . Получено 14 августа 2013 г.
  26. ^ ab "openmp – GCC Wiki". Gcc.gnu.org. 2013-07-30 . Получено 2013-08-14 .
  27. ^ Кеннеди, Патрик (06.09.2011). "Компиляторы Intel® C++ и Fortran теперь поддерживают спецификацию OpenMP* 3.1 | Intel® Developer Zone". Software.intel.com . Получено 14.08.2013 .
  28. ^ ab "Возможности компиляторов IBM XL C/C++". IBM . 13 декабря 2018 г.
  29. ^ ab "Возможности компиляторов IBM XL Fortran". 13 декабря 2018 г.
  30. ^ ab "Clang 3.7 Release Notes". llvm.org . Получено 2015-10-10 .
  31. ^ "Absoft Home Page" . Получено 2019-02-12 .
  32. ^ "GCC 4.9 Release Series – Изменения". www.gnu.org.
  33. ^ "Возможности OpenMP* 4.0 в компиляторе Intel 15.0". Software.intel.com. 2014-08-13. Архивировано из оригинала 2018-11-16 . Получено 2014-11-10 .
  34. ^ "GCC 6 Release Series - Изменения". www.gnu.org.
  35. ^ "Компиляторы и инструменты OpenMP". openmp.org . www.openmp.org . Получено 29 октября 2019 г. .
  36. ^ ab "Поддержка OpenMP — документация Clang 12". clang.llvm.org . Получено 2020-10-23 .
  37. ^ "GOMP — реализация OpenMP для GCC - GNU Project - Free Software Foundation (FSF)". gcc.gnu.org . Архивировано из оригинала 2021-02-27 . Получено 2020-10-23 .
  38. ^ "Поддержка OpenMP*". Intel . Получено 2020-10-23 .
  39. ^ ab Амриткар, Амит; Тафти, Данеш; Лю, Руи; Куфрин, Рик; Чепмен, Барбара (2012). «Параллелизм OpenMP для жидких и жидко-частичных систем». Параллельные вычисления . 38 (9): 501. doi :10.1016/j.parco.2012.05.005.
  40. ^ Амриткар, Амит; Деб, Сурья; Тафти, Данеш (2014). "Эффективное параллельное моделирование CFD-DEM с использованием OpenMP" . Журнал вычислительной физики . 256 : 501. Bibcode : 2014JCoPh.256..501A. doi : 10.1016/j.jcp.2013.09.007.
  41. ^ Поддержка ускорителя OpenMP для графических процессоров
  42. ^ Обнаружение и предотвращение состояний гонки OpenMP в C++
  43. ^ "Алексей Колосов, Евгений Рыжков, Андрей Карпов 32 ловушки OpenMP для разработчиков C++". Архивировано из оригинала 2017-07-07 . Получено 2009-04-15 .
  44. ^ Стивен Блэр-Чаппелл, корпорация Intel, «Станьте экспертом по параллельному программированию за девять минут», презентация на конференции ACCU 2010
  45. ^ Чэнь, Юронг (15.11.2007). "Многоядерное программное обеспечение". Журнал технологий Intel . 11 (4). doi :10.1535/itj.1104.08.
  46. ^ "Результат OMPM2001". СПЕЦИФИКАЦИЯ. 2008-01-28.
  47. ^ "OMPM2001 Result". SPEC. 2003-04-01. Архивировано из оригинала 2021-02-25 . Получено 2008-03-28 .

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

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