OpenMP - OpenMP

OpenMP
Логотип OpenMP
Оригинальный автор (ы)Совет по обзору архитектуры OpenMP[1]
Разработчики)Совет по обзору архитектуры OpenMP[1]
Стабильный выпуск
5.1 / 13 ноября 2020 г.; 13 дней назад (2020-11-13)
Операционная системаКроссплатформенность
ПлатформаКроссплатформенность
ТипРасширение на C, C ++, и Фортран; API
ЛицензияРазличный[2]
Интернет сайтopenmp.org

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

OpenMP управляется некоммерческий технологии консорциум Совет по обзору архитектуры OpenMP (или OpenMP ARB), совместно определенными широким кругом ведущих поставщиков компьютерного оборудования и программного обеспечения, включая Рука, AMD, IBM, Intel, Cray, HP, Fujitsu, Nvidia, NEC, Красная Шапка, Инструменты Техаса, и Корпорация Oracle.[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, а в 2002 была выпущена версия 2.0 спецификаций C / C ++. Версия 2.5 - это комбинированная спецификация C / C ++ / Fortran, выпущенная в 2005 году.

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

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

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

Текущая версия - 5.1, выпущенная в ноябре 2020 года.

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

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

Схема конструкций OpenMP

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

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

Создание потока

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

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

#включают <stdio.h>#включают <omp.h>int основной(пустота){    #pragma omp parallel    printf("Привет мир. п");    вернуть 0;}

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

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

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

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

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

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

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

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

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

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

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

int основной(int argc, char **argv){    int а[100000];    #pragma omp parallel for    для (int я = 0; я < 100000; я++) {        а[я] = 2 * я;    }    вернуть 0;}

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

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

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

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

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

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

Статьи

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

Пункты атрибутов совместного использования данных
  • общий: данные, объявленные вне параллельной области, являются общими, что означает, что они видны и доступны всем потокам одновременно. По умолчанию все переменные в области разделения работы являются общими, кроме счетчика итераций цикла.
  • частный: данные, объявленные в параллельной области, являются частными для каждого потока, что означает, что каждый поток будет иметь локальную копию и использовать ее как временную переменную. Частная переменная не инициализируется, и значение не поддерживается для использования за пределами параллельной области. По умолчанию счетчики итераций цикла в конструкциях цикла OpenMP являются частными.
  • по умолчанию: позволяет программисту указать, что область видимости данных по умолчанию в параллельной области будет либо общий, или никто для C / C ++ или общий, первый частный, частный, или никто для Фортрана. В никто опция заставляет программиста объявлять каждую переменную в параллельной области, используя предложения атрибутов совместного использования данных.
  • первый частный: любить частный кроме инициализации исходного значения.
  • lastprivate: любить частный за исключением того, что исходное значение обновляется после построения.
  • сокращение: безопасный способ присоединения к работе всех потоков после построения.
Условия синхронизации
  • критический: вложенный блок кода будет выполняться только одним потоком за раз, а не одновременно несколькими потоками. Часто используется для защиты общих данных от условия гонки.
  • атомный: обновление памяти (запись или чтение-изменение-запись) в следующей инструкции будет выполнено атомарно. Это не делает атомарным весь оператор; только обновление памяти атомарно. Компилятор может использовать специальные аппаратные инструкции для лучшей производительности, чем при использовании критический.
  • заказал: структурированный блок выполняется в том порядке, в котором итерации выполнялись бы в последовательном цикле
  • барьер: каждый поток ждет, пока все другие потоки команды не достигнут этой точки. Конструкция разделения работы имеет в конце неявную барьерную синхронизацию.
  • Нет, подождите: указывает, что потоки, завершающие назначенную работу, могут продолжаться, не дожидаясь завершения всех потоков в группе. В отсутствие этого предложения потоки сталкиваются с барьерной синхронизацией в конце конструкции разделения работы.
Пункты планирования
  • расписание (тип, чанк): Это полезно, если конструкция разделения работы представляет собой цикл выполнения или цикла. Итерация (и) в конструкции распределения работы назначается потокам в соответствии с методом планирования, определенным в этом пункте. Есть три типа расписания:
  1. статический: Здесь всем потокам выделяются итерации перед выполнением итераций цикла. По умолчанию итерации делятся между потоками поровну. Однако указание целого числа для параметра кусок выделит количество последовательных итераций в конкретном потоке.
  2. динамичный: Здесь некоторые из итераций распределяются по меньшему количеству потоков. Как только конкретный поток завершает выделенную ему итерацию, он возвращается, чтобы получить еще один из оставшихся итераций. Параметр кусок определяет количество непрерывных итераций, которые одновременно выделяются потоку.
  3. управляемый: Большой кусок непрерывных итераций выделяется каждому потоку динамически (как указано выше). Размер блока экспоненциально уменьшается с каждым последующим распределением до минимального размера, указанного в параметре. кусок
IF контроль
  • если: Это заставит потоки распараллелить задачу только при выполнении условия. В противном случае блок кода выполняется последовательно.
Инициализация
  • первый частный: данные являются частными для каждого потока, но инициализируются с использованием значения переменной с тем же именем из основного потока.
  • lastprivate: данные являются личными для каждого потока. Значение этих частных данных будет скопировано в глобальную переменную с тем же именем за пределами параллельной области, если текущая итерация является последней итерацией в параллельном цикле. Переменная может быть как первый частный и lastprivate.
  • threadprivate: Данные являются глобальными, но во время выполнения они являются частными в каждой параллельной области. Разница между threadprivate и частный - это глобальная область видимости, связанная с threadprivate, и сохраненное значение в параллельных регионах.
Копирование данных
  • копирование: похожий на первый частный для частный переменные, threadprivate переменные не инициализируются, если не используются копирование для передачи значения из соответствующих глобальных переменных. Нет копирование требуется, потому что значение переменной threadprivate поддерживается на протяжении всего выполнения программы.
  • copyprivate: используется с не замужем для поддержки копирования значений данных из частных объектов в один поток ( не замужем thread) к соответствующим объектам в других потоках в команде.
Сокращение
  • сокращение (оператор | внутренний: список): переменная имеет локальную копию в каждом потоке, но значения локальных копий будут суммированы (уменьшены) в глобальную общую переменную. Это очень полезно, если конкретная операция (указанная в оператор для этого конкретного предложения) для переменной выполняется итеративно, так что ее значение на конкретной итерации зависит от ее значения на предыдущей итерации. Шаги, ведущие к операционному приращению, распараллеливаются, но потоки обновляют глобальную переменную потокобезопасным способом. Это потребуется при распараллеливании численное интегрирование функций и дифференциальные уравнения, как типичный пример.
Другие
  • промывать: Значение этой переменной восстанавливается из регистра в память для использования этого значения вне параллельной части.
  • мастер: Выполняется только главным потоком (потоком, который разветвлял все остальные во время выполнения директивы 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 ++ из Портлендская группа также поддерживает 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]
  • Многопроцессорные вычисления («МПК».)

Несколько компиляторов поддерживают 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:

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

За и против

Плюсы:

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

Минусы:

Ожидания производительности

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

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

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

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

Контрольные точки

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

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

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

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

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

использованная литература

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

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