Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Интерфейс прикладного программирования (API) OpenMP ( Open Multi-Processing ) поддерживает несколько платформ с разделяемой памятью MultiProcessing программирования на C , C ++ и Fortran , [3] на многих платформах, набор инструкций архитектуры и операционных систем , включая Solaris , AIX , 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 является реализацией многопоточности , способ распараллеливание при котором первичный поток (серия инструкций , выполняемых последовательно) Сервер порождает заданное число суб -threads , и система делит задачу среди них. Затем потоки выполняются одновременно , а среда выполнения распределяет потоки между разными процессорами.

Раздел кода, который предназначен для параллельного выполнения, помечен соответствующим образом директивой компилятора, которая заставит потоки формироваться до выполнения раздела. [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, а в 2002 была выпущена версия 2.0 спецификаций C / C ++. Версия 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.1, выпущенная в ноябре 2020 года.

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

Основные элементы [ править ]

Схема конструкций 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 " );  возврат  0 ; }

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

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

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

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

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

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

(Является ли printfпотокобезопасным, зависит от реализации. С ++ std::cout, с другой стороны, всегда потокобезопасен.)

Конструкции для совместной работы [ править ]

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

  • omp for или omp do : используются для разделения итераций цикла между потоками, также называемые конструкциями цикла.
  • разделы : назначение последовательных, но независимых блоков кода разным потокам
  • single : указание блока кода, который выполняется только одним потоком, в конце подразумевается барьер
  • master : аналогично single, но блок кода будет выполняться только главным потоком, и в конце концов, никаких препятствий не будет.

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

int  main ( int  argc ,  char  ** argv ) {  int  a [ 100000 ]; #pragma OMP параллели  для  ( Int  я  =  0 ;  я  <  100000 ;  я ++ )  {  [ я ] = 2 * я ; }      возврат  0 ; }

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

Вариант директив [ править ]

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

  • Metadirective является исполняемой директивой , которая условно решает другую директиву во время компиляции путем выбора из нескольких вариантов директивы на основе признаков , которые определяют состояние OpenMP или контекст.
  • Объявить вариант директива имеет аналогичную функциональность как metadirective , но выбирает функцию вариант на колл-сайта на основе контекста или определенных пользователем условий.

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

// адаптация кода с помощью директив предварительной обработкиint  v1 [ N ],  v2 [ N ],  v3 [ N ]; #if defined (nvptx)  #pragma omp целевые группы распространяют карту параллельного цикла (to: v1, v2) map (from: v3)  for  ( int  i =  0 ;  i <  N ;  i ++ )  v3 [ i ]  =  v1 [ я ]  *  v2 [ я ];  #else  #pragma omp target parallel loop map (to: v1, v2) map (from: v3)  for  ( int я =  0 ;  я <  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  я =  0 ;  я <  N ;  я ++ )  v3 [ я ]  =  v1 [ я ]  *  v2 [ я ];

Пункты [ править ]

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

Пункты атрибутов совместного использования данных
  • shared : данные, объявленные вне параллельной области, являются общими, то есть видимыми и доступными для всех потоков одновременно. По умолчанию все переменные в области разделения работы являются общими, кроме счетчика итераций цикла.
  • private : данные, объявленные в параллельной области, являются частными для каждого потока, что означает, что каждый поток будет иметь локальную копию и использовать ее как временную переменную. Частная переменная не инициализируется, и значение не поддерживается для использования за пределами параллельной области. По умолчанию счетчики итераций цикла в конструкциях цикла OpenMP являются частными.
  • default : позволяет программисту указать, что область видимости данных по умолчанию в параллельной области будет либо общей , либо отсутствующей для C / C ++, либо общей , firstprivate , private или none для Fortran. Параметр none заставляет программиста объявлять каждую переменную в параллельной области, используя предложения атрибутов совместного использования данных.
  • firstprivate : как частный, но инициализирован исходным значением.
  • lastprivate : как и private, за исключением того, что исходное значение обновляется после построения.
  • сокращение : безопасный способ объединения работы со всеми потоками после построения.
Условия синхронизации
  • критично : вложенный блок кода будет выполняться только одним потоком за раз, а не одновременно несколькими потоками. Он часто используется для защиты общих данных от состояния гонки .
  • атомарно : обновление памяти (запись или чтение-изменение-запись) в следующей инструкции будет выполняться атомарно. Это не делает атомарным весь оператор; только обновление памяти атомарно. Компилятор может использовать специальные аппаратные инструкции для повышения производительности, чем при использовании критического .
  • заказанный : структурированный блок выполняется в том порядке, в котором итерации будут выполняться в последовательном цикле
  • барьер : каждый поток ждет, пока все другие потоки команды не достигнут этой точки. Конструкция разделения работы имеет в конце неявную барьерную синхронизацию.
  • nowait : указывает, что потоки, завершающие назначенную работу, могут продолжаться, не дожидаясь завершения всех потоков в группе. В отсутствие этого предложения потоки сталкиваются с барьерной синхронизацией в конце конструкции разделения работы.
Пункты планирования
  • schedule (type, chunk) : это полезно, если конструкция разделения работы представляет собой цикл do-loop или for-loop. Итерация (и) в конструкции распределения работы назначается потокам в соответствии с методом планирования, определенным в этом пункте. Есть три типа расписания:
  1. static : здесь всем потокам выделяются итерации перед выполнением итераций цикла. По умолчанию итерации делятся между потоками поровну. Однако указание целого числа для блока параметров выделит количество последовательных итераций для определенного потока.
  2. динамический : здесь некоторые итерации выделяются меньшему количеству потоков. Как только конкретный поток завершает выделенную ему итерацию, он возвращается, чтобы получить еще один из оставшихся итераций. Параметр фрагмент определяет число последовательных итераций, которые выделены в тему в то время.
  3. guided : большой кусок непрерывных итераций выделяется каждому потоку динамически (как указано выше). Размер блока экспоненциально уменьшается с каждым последующим распределением до минимального размера, указанного в блоке параметров.
IF контроль
  • if : это заставит потоки распараллелить задачу только при выполнении условия. В противном случае блок кода выполняется последовательно.
Инициализация
  • firstprivate : данные являются частными для каждого потока, но инициализируются с использованием значения переменной с тем же именем из главного потока.
  • lastprivate : данные являются частными для каждого потока. Значение этих частных данных будет скопировано в глобальную переменную с тем же именем за пределами параллельной области, если текущая итерация является последней итерацией в параллельном цикле. Переменная может быть как firstprivate, так и lastprivate .
  • threadprivate : данные являются глобальными, но во время выполнения они являются частными в каждой параллельной области. Разница между threadprivate и private - это глобальная область видимости, связанная с threadprivate, и сохраняемое значение в параллельных регионах.
Копирование данных
  • copyin : аналогично firstprivate для частных переменных, переменные threadprivate не инициализируются, если только не используется copyin для передачи значения из соответствующих глобальных переменных. Нет copyout не требуется , так как значение переменной threadprivate сохраняется в течение выполнения всей программы.
  • copyprivate : используется с single для поддержки копирования значений данных из частных объектов в одном потоке ( одном потоке) в соответствующие объекты в других потоках в группе.
Снижение
  • сокращение (operator | intrinsic: list) : переменная имеет локальную копию в каждом потоке, но значения локальных копий будут суммированы (уменьшены) в глобальную общую переменную. Это очень полезно, если конкретная операция (указанная в операторе для этого конкретного предложения) с переменной выполняется итеративно, так что ее значение на определенной итерации зависит от ее значения на предыдущей итерации. Шаги, ведущие к операционному приращению, распараллеливаются, но потоки обновляют глобальную переменную потокобезопасным способом. Это может потребоваться при распараллеливании численного интегрирования функций и дифференциальных уравнений , например.
Другие
  • flush : значение этой переменной восстанавливается из регистра в память для использования этого значения вне параллельной части
  • master : выполняется только главным потоком (потоком, который разветвлял все остальные во время выполнения директивы OpenMP). Нет неявного барьера; другим членам команды (темам) связываться не требуется.

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

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

Переменные среды [ править ]

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

Реализации [ править ]

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

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

  • GCC 4.3.1
  • Компилятор Mercurium
  • Компиляторы Intel Fortran и C / C ++ версий 11.0 и 11.1, Intel C / C ++ и Fortran Composer XE 2011 и Intel Parallel Studio.
  • Компилятор IBM XL [20]
  • Sun Studio 12 update 1 содержит полную реализацию OpenMP 3.0 [21]
  • Многопроцессорные вычисления ( «MPC» .)

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

  • GCC 4.7 [22]
  • Компиляторы Intel Fortran и C / C ++ 12.1 [23]
  • Компиляторы IBM XL C / C ++ для AIX и Linux, V13.1 [24] и компиляторы IBM XL Fortran для AIX и Linux, V14.1 [25]
  • LLVM / Clang 3.7 [26]
  • Компиляторы Absoft Fortran v. 19 для Windows, Mac OS X и Linux [27]

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

  • GCC 4.9.0 для C / C ++, GCC 4.9.1 для Fortran [22] [28]
  • Компиляторы Intel Fortran и C / C ++ 15.0 [29]
  • IBM XL C / C ++ для Linux, V13.1 (частично) [24] и XL Fortran для Linux, V15.1 (частично) [25]
  • LLVM / Clang 3.7 (частично) [26]

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

  • GCC 6 для C / C ++ [30]
  • Компиляторы Intel Fortran и C / C ++ 17.0, 18.0, 19.0 [31]
  • LLVM / Clang 12 [32]

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

  • GCC 9 для C / C ++ [33]
  • Компиляторы Intel Fortran и C / C ++ 19.1 [34]
  • LLVM / Clang 12 [32]

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

  • iPat / OMP
  • Параллельное ПО
  • ПЛУТОН
  • РОЗА (каркас компилятора)
  • S2P от КПИТ Cummins Infosystems Ltd.

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

  • Intel VTune Profiler - профилировщик для архитектур x86 CPU и X e GPU
  • Intel Advisor - инструмент для помощи в проектировании и анализа кодов OpenMP и MPI
  • Allinea Distributed Debugging Tool (DDT) - отладчик для кодов OpenMP и MPI
  • Allinea MAP - профилировщик для кодов OpenMP и MPI
  • TotalView - отладчик от Rogue Wave Software для OpenMP, MPI и последовательных кодов
  • ompP - профилировщик для OpenMP
  • ВАМПИР - профилировщик для OpenMP и MPI кода

Плюсы и минусы [ править ]

Плюсы:

  • Переносимый многопоточный код (в C / C ++ и других языках обычно приходится вызывать специфичные для платформы примитивы, чтобы получить многопоточность).
  • Просто: не нужно иметь дело с передачей сообщений, как это делает MPI .
  • Размещение и декомпозиция данных выполняется автоматически с помощью директив.
  • Масштабируемость сопоставима с MPI в системах с общей памятью. [35]
  • Инкрементальный параллелизм: может работать над одной частью программы одновременно, никаких серьезных изменений в коде не требуется.
  • Унифицированный код для последовательных и параллельных приложений: конструкции OpenMP обрабатываются как комментарии при использовании последовательных компиляторов.
  • Операторы исходного (последовательного) кода, как правило, не нужно изменять при распараллеливании с OpenMP. Это снижает вероятность непреднамеренного внесения ошибок.
  • Оба крупнозернистый и мелкозернистый параллелизм возможны.
  • В нестандартных мультифизических приложениях, которые не придерживаются только режима вычислений SPMD , как это происходит в сильно связанных системах жидкость-частицы, гибкость OpenMP может иметь большое преимущество в производительности по сравнению с MPI . [35] [36]
  • Может использоваться на различных ускорителях, таких как GPGPU [37] и FPGA .

Минусы:

  • Риск появления трудных для отладки ошибок синхронизации и состояний гонки . [38] [39]
  • По состоянию на 2017 год эффективно работает только на многопроцессорных платформах с общей памятью (см., Однако, Intel Cluster OpenMP и другие платформы с распределенной общей памятью ).
  • Требуется компилятор, поддерживающий OpenMP.
  • Масштабируемость ограничена архитектурой памяти.
  • Нет поддержки сравнения и замены . [40]
  • Отсутствует надежная обработка ошибок.
  • Недостаток детализированных механизмов для управления отображением потока на процессор.
  • Высокий шанс случайно написать ложный код совместного доступа.

Ожидаемые результаты [ править ]

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

  • Если существует зависимость, процесс должен дождаться вычисления данных, от которых он зависит.
  • Когда несколько процессов совместно используют непараллельный ресурс проверки (например, файл для записи), их запросы выполняются последовательно. Следовательно, каждый поток должен ждать, пока другой поток не освободит ресурс.
  • Большая часть программы не может быть распараллелена OpenMP, а это означает, что теоретический верхний предел ускорения ограничен в соответствии с законом Амдала .
  • N процессоров в симметричной многопроцессорной обработке (SMP) могут иметь вычислительную мощность в N раз больше, но пропускная способность памяти обычно не увеличивается в N раз. Довольно часто исходный путь к памяти совместно используется несколькими процессорами, и может наблюдаться снижение производительности, когда они конкурируют за пропускную способность совместно используемой памяти.
  • Многие другие распространенные проблемы, влияющие на окончательное ускорение параллельных вычислений, также относятся к OpenMP, например, накладные расходы на балансировку нагрузки и синхронизацию.
  • Оптимизация компилятора может быть не такой эффективной при вызове OpenMP. Обычно это может привести к тому, что однопоточная программа OpenMP будет работать медленнее, чем тот же код, скомпилированный без флага OpenMP (который будет полностью последовательным).

Сходство темы [ править ]

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

Контрольные показатели [ править ]

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

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

  • OmpSCR: Репозиторий исходного кода OpenMP

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

  • Набор микротестов EPCC OpenMP / MPI
  • Параллельный тест NAS
  • Barcelona OpenMP Task Suite - это набор приложений, которые позволяют тестировать реализации задач OpenMP.
  • Серия SPEC
    • SPEC OMP 2012
    • Набор тестов SPEC ACCEL для тестирования API целевой разгрузки OpenMP 4
    • Тест SPEChpc® 2002
  • Коды эталонных тестов ASC Sequoia
  • Тесты CORAL
  • Родиния делает упор на ускорители.
  • Пакет тестов на основе проблем

Тесты корректности включают:

  • Пакет проверки OpenMP
  • Набор для проверки и проверки OpenMP
  • DataRaceBench - это набор тестов, предназначенный для систематической и количественной оценки эффективности инструментов обнаружения гонки данных OpenMP.
  • AutoParBench - это набор тестов для оценки компиляторов и инструментов, которые могут автоматически вставлять директивы OpenMP.

См. Также [ править ]

  • Часовня (язык программирования)
  • Силк
  • Силк Плюс
  • Интерфейс передачи сообщений
  • Параллелизм (информатика)
  • Гетерогенная системная архитектура
  • Параллельные вычисления
  • Модель параллельного программирования
  • Потоки POSIX
  • Унифицированный параллельный C
  • X10 (язык программирования)
  • Параллельная виртуальная машина
  • Массовая синхронная параллель
  • Grand Central Dispatch
  • Разделенное глобальное адресное пространство
  • ГПГПУ
  • CUDA  - Nvidia
  • Осьминог
  • OpenCL
  • OpenACC
  • SequenceL
  • Эндуро / X

Ссылки [ править ]

  1. ^ a b c "О OpenMP ARB и" . OpenMP.org. 2013-07-11. Архивировано из оригинала на 2013-08-09 . Проверено 14 августа 2013 .
  2. ^ a b «Компиляторы и инструменты OpenMP» . OpenMP.org. Ноябрь 2019 . Проверено 5 марта 2020 .
  3. ^ a b Ганье, Авраам Зильбершатц, Питер Баер Галвин, Грег (2012-12-17). Понятия операционной системы (9-е изд.). Хобокен, Нью-Джерси: Уайли. С. 181–182. ISBN 978-1-118-06333-0.
  4. ^ Учебное пособие по OpenMP на Supercomputing 2008
  5. ^ Использование OpenMP - Портативное параллельное программирование с общей памятью - Скачать примеры книг и обсудить
  6. ^ Коста, JJ; и другие. (Май 2006 г.). «Эффективное выполнение приложений OpenMP на универсальном SDSM». Журнал параллельных и распределенных вычислений . 66 (5): 647–658. DOI : 10.1016 / j.jpdc.2005.06.018 .
  7. ^ Basumallik, Айон; Мин, Сын-Джай; Эйгенманн, Рудольф (2007). Программирование систем распределенной памяти [sic] с использованием OpenMP . Труды 2007 IEEE International Параллельное и распределенное симпозиум обработки . Нью-Йорк: IEEE Press. С. 1–8. CiteSeerX 10.1.1.421.8570 . DOI : 10.1109 / IPDPS.2007.370397 . ISBN  978-1-4244-0909-9.Препринт доступен на домашней странице Чэнь Динг ; см., в частности, Раздел 3 о переводе OpenMP в MPI.
  8. ^ Ван, Цзюэ; Ху, Чанцзюнь; Чжан, Цзилинь; Ли, Цзяньцзян (май 2010 г.). «Компилятор OpenMP для архитектур с распределенной памятью» . Наука Китай Информационные науки . 53 (5): 932–944. DOI : 10.1007 / s11432-010-0074-0 .(По состоянию на 2016 год программное обеспечение KLCoMP, описанное в этом документе, не является общедоступным)
  9. ^ Cluster OpenMP (продукт, который раньше был доступен для компилятора Intel C ++ версий с 9.1 по 11.1, но был удален в 13.0)
  10. ^ Ayguade, Эдуард; Копти, Наваль; Дюран, Алехандро; Хефлингер, Джей; Линь, Юань; Массайоли, Федерико; Су, Эрнесто; Унникришнан, Прия; Чжан, Гуансун (2007). Предложение по параллелизму задач в OpenMP (PDF) . Proc. Международный семинар по OpenMP.
  11. ^ «Интерфейс прикладных программ OpenMP, версия 3.0» (PDF) . openmp.org. Май 2008 . Проверено 6 февраля 2014 .
  12. ^ LaGrone, Джеймс; Арибуки, Айодунни; Аддисон, Коди; Чепмен, Барбара (2011). Реализация задач OpenMP во время выполнения . Proc. Международный семинар по OpenMP. С. 165–178. CiteSeerX 10.1.1.221.2775 . DOI : 10.1007 / 978-3-642-21487-5_13 . 
  13. ^ «Выпущен OpenMP 4.0 API» . OpenMP.org. 2013-07-26. Архивировано из оригинала на 2013-11-09 . Проверено 14 августа 2013 .
  14. ^ «Интерфейс прикладных программ OpenMP, версия 4.0» (PDF) . openmp.org. Июль 2013 . Проверено 6 февраля 2014 .
  15. ^ «Учебное пособие - Параллельное выполнение циклов с OpenMP» . 2009-07-14.
  16. ^ Visual C ++ Editions, Visual Studio 2005
  17. ^ Visual C ++ Editions, Visual Studio 2008
  18. ^ Visual C ++ Editions, Visual Studio 2010
  19. ^ Дэвид Уортингтон, «Intel обращается к жизненному циклу разработки с помощью Parallel Studio». Архивировано 15 февраля 2012 г.в Wayback Machine , SDTimes, 26 мая 2009 г. (по состоянию на 28 мая 2009 г.)
  20. ^ «XL C / C ++ для функций Linux» (по состоянию на 9 июня 2009 г.)
  21. ^ "Технологическая сеть Oracle для разработчиков Java | Технологическая сеть Oracle | Oracle" . Developers.sun.com . Проверено 14 августа 2013 .
  22. ^ a b "openmp - GCC Wiki" . Gcc.gnu.org. 2013-07-30 . Проверено 14 августа 2013 .
  23. ^ Отправлено Патриком Кеннеди ... в пт, 02.09.2011 - 11:28 (2011-09-06). «Компиляторы Intel® C ++ и Fortran теперь поддерживают спецификацию OpenMP * 3.1 | Intel® Developer Zone» . Software.intel.com . Проверено 14 августа 2013 .
  24. ^ a b https://www.ibm.com/support/docview.wss?uid=swg27007322&aid=1
  25. ^ a b http://www-01.ibm.com/support/docview.wss?uid=swg27007323&aid=1
  26. ^ a b «Примечания к выпуску Clang 3.7» . llvm.org . Проверено 10 октября 2015 .
  27. ^ "Домашняя страница Absoft" . Проверено 12 февраля 2019 .
  28. ^ «Серия выпусков GCC 4.9 - Изменения» . www.gnu.org.
  29. ^ «Возможности OpenMP * 4.0 в Intel Compiler 15.0» . Software.intel.com. 2014-08-13.
  30. ^ «Серия выпусков GCC 6 - Изменения» . www.gnu.org.
  31. ^ «Компиляторы и инструменты OpenMP» . openmp.org . www.openmp.org . Проверено 29 октября 2019 года .
  32. ^ a b «Поддержка OpenMP - документация Clang 12» . clang.llvm.org . Проверено 23 октября 2020 .
  33. ^ «GOMP - реализация OpenMP для GCC - проект GNU - Фонд свободного программного обеспечения (FSF)» . gcc.gnu.org . Проверено 23 октября 2020 .
  34. ^ «Поддержка OpenMP *» . Intel . Проверено 23 октября 2020 .
  35. ^ а б Амриткар, Амит; Тафти, Данеш; Лю, Руи; Куфрин, Рик; Чепмен, Барбара (2012). «Параллелизм OpenMP для жидкостных систем и жидкостных твердых частиц». Параллельные вычисления . 38 (9): 501. DOI : 10.1016 / j.parco.2012.05.005 .
  36. ^ Амриткар, Амит; Деб, Сурья; Тафти, Данеш (2014). «Эффективное параллельное моделирование CFD-DEM с использованием OpenMP» . Журнал вычислительной физики . 256 : 501. Bibcode : 2014JCoPh.256..501A . DOI : 10.1016 / j.jcp.2013.09.007 .
  37. ^ Поддержка OpenMP Accelerator для графических процессоров
  38. ^ Обнаружение и предотвращение условий гонки OpenMP в C ++
  39. ^ Алексей Колосов, Евгений Рыжков, Андрей Карпов 32 ловушки OpenMP для разработчиков на C ++
  40. ^ Стивен Блэр-Чаппелл, Intel Corporation, Стать экспертом по параллельному программированию за девять минут, презентация наконференции ACCU 2010
  41. ^ Chen, Yurong (2007-11-15). «Многоядерное программное обеспечение». Intel Technology Journal . 11 (4). DOI : 10.1535 / itj.1104.08 .
  42. ^ "Результат OMPM2001" . СПЕЦ. 2008-01-28.
  43. ^ "Результат OMPM2001" . СПЕЦ. 2003-04-01.

Дальнейшее чтение [ править ]

  • Куинн Майкл Дж., Параллельное программирование на C с помощью MPI и OpenMP McGraw-Hill Inc. 2004. ISBN 0-07-058201-7 
  • Р. Чандра, Р. Менон, Л. Дагум, Д. Кор, Д. Майдан, Дж. Макдональд, Параллельное программирование в OpenMP. Морган Кауфманн, 2000. ISBN 1-55860-671-8 
  • Р. Эйгенманн (редактор), М. Восс (редактор), Параллельное программирование с общей памятью OpenMP: Международный семинар по приложениям и инструментам OpenMP, WOMPAT 2001, Вест-Лафайет, Индиана, США, 30–31 июля 2001 г. (Конспект лекций на компьютере Наука). Springer 2001. ISBN 3-540-42346-X 
  • Б. Чепмен, Г. Йост, Р. ван дер Пас, Д. Кук (предисловие), Использование OpenMP: параллельное программирование переносимой общей памяти. MIT Press (31 октября 2007 г.). ISBN 0-262-53302-2 
  • Параллельная обработка через MPI и OpenMP, М. Фирузиаан, О. Номменсен. Linux Enterprise, 10/2002
  • Статья в журнале MSDN об OpenMP
  • SC08 OpenMP Tutorial (PDF) - Практическое введение в OpenMP, Mattson and Meadows, от SC08 (Остин)
  • Спецификации OpenMP
  • Параллельное программирование на Fortran 95 с использованием OpenMP (PDF)

Внешние ссылки [ править ]

  • Официальный веб-сайт , содержащий последние спецификации OpenMP, ссылки на ресурсы, оживленный набор форумов, где можно задать вопросы и на которые ответят эксперты и разработчики OpenMP.
  • OpenMPCon , веб-сайт конференции разработчиков OpenMP
  • IWOMP , веб-сайт ежегодного международного семинара по OpenMP
  • Пользователи OpenMP в Великобритании , веб-сайт группы и конференции пользователей OpenMP в Великобритании
  • IBM Octopiler с поддержкой OpenMP
  • Блэз Барни, сайт Ливерморской национальной лаборатории имени Лоуренса на OpenMP
  • Объединение OpenMP и MPI (PDF)
  • Смешивание MPI и OpenMP
  • Измеряйте и визуализируйте параллелизм OpenMP с помощью планировщика маршрутизации C ++, вычисляющего коэффициент ускорения
  • Советник Intel