OpenMP
![]() | |
Оригинальный автор(ы) | Совет по обзору архитектуры OpenMP [1] |
---|---|
Разработчик(и) | Совет по обзору архитектуры OpenMP [1] |
Стабильная версия | 5.2
/ ноябрь 2021 г |
Операционная система | Кросс-платформенный |
Платформа | Кросс-платформенный |
Тип | Расширение для C , C++ и Fortran ; API |
Лицензия | Различный [2] |
Веб-сайт | опенмп |
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 являются конструкции для создания потоков, распределения рабочей нагрузки (совместного использования работы), управления средой данных, синхронизации потоков, процедур выполнения на уровне пользователя и переменных среды.
В C/C++ OpenMP использует #pragmas . Специальные прагмы OpenMP перечислены ниже.
Создание темы [ править ]
Прагма omp Parallel используется для создания дополнительных потоков для параллельного выполнения работы, заключенной в конструкции. Исходный поток будет обозначен как главный поток с идентификатором потока 0.
Пример (программа C): Отображение «Hello, world». использование нескольких потоков.
#include <stdio.h>
#include <omp.h>
int main(void)
{
#pragma omp parallel
printf("Hello, world.\n");
return 0;
}
Используйте флаг -fopenmp для компиляции с использованием GCC:
$ gcc -fopenmp hello.c -o hello -ldl
Вывод на компьютере с двумя ядрами и, следовательно, двумя потоками:
Hello, world.
Hello, world.
Однако вывод также может быть искажен из-за состояния гонки, вызванного тем, что два потока совместно используют стандартный вывод .
Hello, wHello, woorld.
rld.
Ли printf
является атомарным, зависит от базовой реализации [17] в отличие от C++11 std::cout
, который по умолчанию является потокобезопасным. [18]
работы Конструкции разделения
Используется для указания того, как назначить независимую работу одному или всем потокам.
- omp for или omp do : используется для разделения итераций цикла между потоками, также называемых конструкциями цикла.
- разделы : назначение последовательных, но независимых блоков кода разным потокам.
- single : указание блока кода, который выполняется только одним потоком, в конце подразумевается барьер
- master : аналогично синглу, но блок кода будет выполняться только главным потоком, и в конце не будет подразумеваться никакого барьера.
Пример: инициализировать значение большого массива параллельно, используя каждый поток для выполнения части работы.
int main(int argc, char **argv)
{
int a[100000];
#pragma omp parallel for
for (int i = 0; i < 100000; i++) {
a[i] = 2 * i;
}
return 0;
}
Этот пример поразительно параллелен и зависит только от значения я . OpenMP Parallel for flag сообщает системе OpenMP разделить эту задачу между ее рабочими потоками. Каждый поток получит уникальную и закрытую версию переменной. [19] Например, при наличии двух рабочих потоков одному потоку может быть передана версия i , который работает от 0 до 49999, а второй получает версию от 50000 до 99999.
Варианты директив [ править ]
Вариантные директивы — одна из основных функций, представленных в спецификации OpenMP 5.0, призванная помочь программистам улучшить переносимость производительности. Они позволяют адаптировать прагмы OpenMP и пользовательский код во время компиляции. Спецификация определяет признаки для описания активных конструкций OpenMP, исполнительных устройств и функций, предоставляемых реализацией, селекторы контекста на основе признаков и определяемых пользователем условий, а также метадирективы и директивы объявления, позволяющие пользователям программировать одну и ту же область кода с вариантными директивами.
- Метадиректива — это исполняемая директива, которая условно преобразуется в другую директиву во время компиляции путем выбора из нескольких вариантов директивы на основе характеристик, определяющих условие или контекст OpenMP.
- Директива объявления варианта имеет те же функции, что и метадиректива , но выбирает вариант функции на месте вызова на основе контекста или условий, определяемых пользователем.
Механизм, предоставляемый двумя вариантными директивами для выбора вариантов, более удобен в использовании, чем предварительная обработка C/C++, поскольку он напрямую поддерживает выбор вариантов в OpenMP и позволяет компилятору OpenMP анализировать и определять окончательную директиву на основе вариантов и контекста.
// code adaptation using preprocessing directives
int v1[N], v2[N], v3[N];
#if defined(nvptx)
#pragma omp target teams distribute 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
// code adaptation using metadirective in OpenMP 5.0
int v1[N], v2[N], v3[N];
#pragma omp target map(to:v1,v2) map(from:v3)
#pragma omp metadirective \
when(device={arch(nvptx)}: target teams distribute parallel for)\
default(target parallel for)
for (int i= 0; i< N; i++)
v3[i] = v1[i] * v2[i];
Пункты [ править ]
Поскольку OpenMP — это модель программирования с общей памятью, большинство переменных в коде OpenMP по умолчанию видны всем потокам. Но иногда частные переменные необходимы, чтобы избежать условий гонки , и возникает необходимость передавать значения между последовательной частью и параллельной областью (блоком кода, выполняемым параллельно), поэтому управление средой данных вводится в виде предложений атрибутов совместного использования данных путем добавления их к директива OpenMP. Различаются следующие виды оговорок:
- Предложения атрибутов совместного использования данных
- общий : данные, объявленные за пределами параллельного региона, являются общими, что означает, что они видимы и доступны всем потокам одновременно. По умолчанию все переменные в области совместного использования работы являются общими, за исключением счетчика итераций цикла.
- Private : данные, объявленные в параллельном регионе, являются частными для каждого потока, что означает, что каждый поток будет иметь локальную копию и использовать ее в качестве временной переменной. Частная переменная не инициализируется, и ее значение не сохраняется для использования за пределами параллельного региона. По умолчанию счетчики итераций цикла в конструкциях цикла OpenMP являются частными.
- default : позволяет программисту указать, что область данных по умолчанию в параллельном регионе будет либо общей , либо никакой для C/C++, либо общей , firstprivate , частной или никакой для Фортрана. Опция none заставляет программиста объявлять каждую переменную в параллельной области, используя предложения атрибутов совместного использования данных.
- firstprivate : аналогично частному, за исключением того, что инициализируется исходным значением.
- Lastprivate : аналогично частному, за исключением того, что исходное значение обновляется после создания.
- сокращение : безопасный способ объединения работы всех потоков после создания.
- Положения о синхронизации
- критично : вложенный блок кода будет выполняться только одним потоком за раз, а не одновременно несколькими потоками. Он часто используется для защиты общих данных от условий гонки .
- атомарный : обновление памяти (запись или чтение-изменение-запись) в следующей инструкции будет выполняться атомарно. Это не делает все утверждение атомарным; только обновление памяти является атомарным. Компилятор может использовать специальные аппаратные инструкции для повышения производительности, чем при использовании критического .
- упорядоченный : структурированный блок выполняется в том порядке, в котором итерации будут выполняться в последовательном цикле.
- барьер : каждый поток ждет, пока все остальные потоки команды не достигнут этой точки. В конце конструкции разделения работы имеется неявная барьерная синхронизация.
- nowait : указывает, что потоки, выполняющие назначенную работу, могут продолжить работу, не дожидаясь завершения всех потоков в команде. В отсутствие этого пункта потоки сталкиваются с барьерной синхронизацией в конце конструкции разделения работы.
- Положения о расписании
- расписание (тип, фрагмент) : это полезно, если конструкция разделения работы представляет собой цикл do или for. Итерации в конструкции разделения работы назначаются потокам в соответствии с методом планирования, определенным в этом пункте. Три типа планирования:
- static : здесь всем потокам выделяются итерации, прежде чем они выполнят итерации цикла. По умолчанию итерации распределяются между потоками поровну. параметра Однако указание целого числа для фрагмента приведет к выделению количества последовательных итераций фрагмента для конкретного потока.
- динамический : здесь некоторые итерации распределяются по меньшему количеству потоков. Как только конкретный поток завершает выделенную ему итерацию, он возвращается, чтобы получить еще одну из оставшихся итераций. параметра Чанк определяет количество последовательных итераций, выделяемых потоку одновременно.
- направляемый : большой кусок последовательных итераций распределяется для каждого потока динамически (как указано выше). Размер чанка уменьшается экспоненциально с каждым последующим распределением до минимального размера, указанного в параметре chunk.
- ЕСЛИ контроль
- if : это приведет к тому, что потоки будут распараллеливать задачу только в том случае, если условие выполнено. В противном случае блок кода выполняется последовательно.
- Инициализация
- firstprivate : данные являются частными для каждого потока, но инициализируются с использованием значения переменной с тем же именем из главного потока.
- Lastprivate : данные являются частными для каждого потока. Значение этих личных данных будет скопировано в глобальную переменную с тем же именем за пределами параллельного региона, если текущая итерация является последней итерацией в распараллеленном цикле. Переменная может быть как firstprivate , так иlastprivate .
- threadprivate : данные являются глобальными, но они являются частными в каждом параллельном регионе во время выполнения. Разница между threadprivate и Private заключается в глобальной области видимости, связанной с threadprivate, и сохраняемом значении в параллельных регионах.
- Копирование данных
- copyin : аналогично firstprivate для частных переменных, переменные threadprivate не инициализируются, если только не используется copyin для передачи значения из соответствующих глобальных переменных. не Копирование требуется, поскольку значение переменной threadprivate сохраняется на протяжении всего выполнения всей программы.
- copyprivate : используется с single для поддержки копирования значений данных из частных объектов в одном потоке ( одиночном потоке) в соответствующие объекты в других потоках в команде.
- Снижение
- сокращение (оператор | встроенный: список) : переменная имеет локальную копию в каждом потоке, но значения локальных копий будут суммироваться (уменьшаться) в глобальную общую переменную. Это очень полезно, если конкретная операция (указанная в операторе для этого конкретного предложения) над переменной выполняется итеративно, так что ее значение на конкретной итерации зависит от ее значения на предыдущей итерации. Шаги, ведущие к операционному приращению, распараллеливаются, но потоки обновляют глобальную переменную потокобезопасным способом. Это потребуется при распараллеливании численного интегрирования функций и дифференциальных уравнений , как общий пример.
- Другие
- flash : значение этой переменной восстанавливается из регистра в память для использования этого значения вне параллельной части.
- master : выполняется только главным потоком (поток, который отделил все остальные во время выполнения директивы 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:
- GCC 4.3.1
- Меркурий будет составлен
- Компиляторы Intel Fortran и C/C++ версий 11.0 и 11.1, Intel C/C++ и Fortran Composer XE 2011 и Intel Parallel Studio.
- компилятор IBM XL [24]
- Обновление 1 Sun Studio 12 содержит полную реализацию OpenMP 3.0. [25]
- Многопроцессорные вычисления
Несколько компиляторов поддерживают OpenMP 3.1:
- ССЗ 4.7 [26]
- Компиляторы Intel Fortran и C/C++ 12.1 [27]
- Компиляторы IBM XL C/C++ для AIX и Linux, V13.1 [28] и компиляторы IBM XL Fortran для AIX и Linux, V14.1 [29]
- LLVM/Клан 3.7 [30]
- Компиляторы Absoft Fortran v. 19 для Windows, Mac OS X и Linux [31]
Компиляторы, поддерживающие OpenMP 4.0:
- GCC 4.9.0 для C/C++, GCC 4.9.1 для Fortran [26] [32]
- Компиляторы Intel Fortran и C/C++ 15.0 [33]
- IBM XL C/C++ для Linux, V13.1 (частичная) [28] & XL Fortran для Linux, V15.1 (частично) [29]
- LLVM/Clang 3.7 (частичный) [30]
Несколько компиляторов, поддерживающих OpenMP 4.5:
Частичная поддержка OpenMP 5.0:
Автоматически распараллеливающие компиляторы, генерирующие исходный код, аннотированный директивами OpenMP:
- iPat/OMP
- Параллельное ПО
- ПЛУТОН
- ROSE (фреймворк компилятора)
- S2P от КПИТ Cummins Infosystems Ltd.
- КомПар
- ПрагБывший
Некоторые профилировщики и отладчики явно поддерживают OpenMP:
- Intel VTune Profiler — профилировщик для процессоров x86 и X и Архитектуры графических процессоров
- Intel Advisor — инструмент для помощи в проектировании и анализа кодов OpenMP и MPI.
- Allinea Distributed Debugging Tool (DDT) – отладчик для кодов OpenMP и MPI.
- Allinea MAP – профилировщик кодов OpenMP и MPI
- TotalView — отладчик от Rogue Wave Software для OpenMP, MPI и последовательных кодов
- ompP – профили для OpenMP
- VAMPIR — профилировщик кода OpenMP и MPI.
Плюсы и минусы [ править ]
Этот раздел нуждается в дополнительных цитатах для проверки . ( февраль 2017 г. ) |
Плюсы:
- Переносимый многопоточный код (в C/C++ и других языках обычно приходится вызывать примитивы, специфичные для платформы, чтобы обеспечить многопоточность).
- Просто: не нужно заниматься передачей сообщений, как это делает MPI .
- Размещение и декомпозиция данных выполняются автоматически с помощью директив.
- Масштабируемость, сравнимая с MPI в системах с общей памятью. [39]
- Инкрементный параллелизм: может работать над одной частью программы одновременно, никаких кардинальных изменений в коде не требуется.
- Унифицированный код как для последовательных, так и для параллельных приложений: конструкции OpenMP рассматриваются как комментарии при использовании последовательных компиляторов.
- Исходные (последовательные) операторы кода, как правило, не требуют изменения при распараллеливании с OpenMP. Это снижает вероятность непреднамеренного появления ошибок.
- как крупнозернистый, так и мелкозернистый параллелизм. Возможен
- В нерегулярных мультифизических приложениях, которые не придерживаются исключительно режима вычислений SPMD , как это происходит в тесно связанных системах жидкость-частица, гибкость OpenMP может иметь большое преимущество в производительности по сравнению с MPI . [39] [40]
- Может использоваться на различных ускорителях, таких как GPGPU. [41] и ПЛИС .
Минусы:
- Риск появления сложных для отладки ошибок синхронизации и состояний гонки . [42] [43]
- По состоянию на 2017 год [update] эффективно работает только на многопроцессорных платформах с общей памятью (см., однако, Intel Cluster OpenMP, заархивированный 16 ноября 2018 г. на Wayback Machine и других платформах с распределенной общей памятью ).
- Требуется компилятор, поддерживающий OpenMP.
- Масштабируемость ограничена архитектурой памяти.
- Нет поддержки сравнения и замены . [44]
- Надежная обработка ошибок отсутствует.
- Не хватает детальных механизмов для управления сопоставлением потоков и процессоров.
- Высокая вероятность случайного написания ложного кода обмена .
Ожидаемые результаты [ править ]
Можно было бы ожидать в N раз ускорения при запуске программы, распараллеленной с использованием OpenMP, на платформе N процессора. Однако это происходит редко по следующим причинам:
- Если существует зависимость, процесс должен ждать, пока не будут вычислены данные, от которых он зависит.
- Когда несколько процессов совместно используют непараллельный проверочный ресурс (например, файл для записи), их запросы выполняются последовательно. Следовательно, каждый поток должен ждать, пока другой поток не освободит ресурс.
- Большая часть программы не может быть распараллелена OpenMP, а это означает, что теоретический верхний предел ускорения ограничен законом Амдала .
- N процессоров в симметричной многопроцессорной обработке (SMP) могут иметь в N раз большую вычислительную мощность, но пропускная способность памяти обычно не увеличивается в N раз. Довольно часто исходный путь к памяти используется несколькими процессорами, и может наблюдаться снижение производительности, когда они конкурируют за полосу пропускания общей памяти.
- Многие другие распространенные проблемы, влияющие на окончательное ускорение параллельных вычислений, также применимы к OpenMP, например, балансировка нагрузки и накладные расходы на синхронизацию.
- Оптимизация компилятора может быть не столь эффективной при вызове OpenMP. Обычно это может привести к тому, что однопоточная программа OpenMP будет работать медленнее, чем тот же код, скомпилированный без флага OpenMP (который будет полностью последовательным).
Сходство темы [ править ]
Некоторые поставщики рекомендуют устанавливать привязку к процессору для потоков OpenMP, чтобы связать их с определенными ядрами процессора. [45] [46] [47] Это сводит к минимуму затраты на миграцию потоков и переключение контекста между ядрами. Это также улучшает локальность данных и уменьшает трафик согласованности кэша между ядрами (или процессорами).
Тесты [ править ]
Для демонстрации использования OpenMP, проверки его производительности и оценки правильности было разработано множество тестов.
Простые примеры
- OmpSCR: репозиторий исходного кода OpenMP
Тесты производительности включают в себя:
- Параллельный тест NAS
- Barcelona OpenMP Task Suite — набор приложений, позволяющих тестировать реализации задач OpenMP.
- Серия СПЕЦ
- СПЕЦ ОМП 2012
- Набор тестов SPEC ACCEL тестирует API целевой разгрузки OpenMP 4
- Тест SPEChpc 2002.
- КОРАЛОВЫЕ эталоны
- Экзафлопсные прокси-приложения
- Родиния сосредоточилась на ускорителях.
- Пакет тестов на основе проблем
К критериям правильности относятся:
- Пакет проверки OpenMP
- Набор тестов для проверки и проверки OpenMP
- DataRaceBench — это набор тестов, предназначенный для систематической и количественной оценки эффективности инструментов обнаружения гонок данных OpenMP.
- AutoParBench — это набор тестов для оценки компиляторов и инструментов, которые могут автоматически вставлять директивы OpenMP.
См. также [ править ]
Ссылки [ править ]
- ^ Jump up to: Перейти обратно: а б с «О OpenMP АРБ и» . OpenMP.org. 11 июля 2013 г. Архивировано из оригинала 9 августа 2013 г. Проверено 14 августа 2013 г.
- ^ Jump up to: Перейти обратно: а б «Компиляторы и инструменты OpenMP» . OpenMP.org. Ноябрь 2019 года . Проверено 5 марта 2020 г.
- ^ Jump up to: Перейти обратно: а б Ганье, Авраам Зильбершац, Питер Баер Гэлвин, Грег (17 декабря 2012 г.). Концепции операционной системы (9-е изд.). Хобокен, Нью-Джерси: Уайли. стр. 181–182. ISBN 978-1-118-06333-0 .
{{cite book}}
: CS1 maint: несколько имен: список авторов ( ссылка ) - ^ Учебное пособие по OpenMP и суперкомпьютерам 2008 г.
- ^ Использование OpenMP - Портативное параллельное программирование с общей памятью - Загрузите примеры книг и обсудите
- ^ Коста, Джей Джей; и др. (май 2006 г.). «Эффективный запуск приложений OpenMP на всеобщем SDSM». Журнал параллельных и распределенных вычислений . 66 (5): 647–658. дои : 10.1016/j.jpdc.2005.06.018 . HDL : 2117/370260 .
- ^ Басумаллик, Айон; Мин, Сын Джай; Эйгенманн, Рудольф (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.
- ^ Ван, Цзюэ; Ху, Чан Цзюнь; Чжан, Цзилинь; Ли, ЦзяньЦзян (май 2010 г.). «Компилятор OpenMP для архитектур с распределенной памятью» . Наука Китай Информационные науки . 53 (5): 932–944. дои : 10.1007/s11432-010-0074-0 . (По состоянию на 2016 год [update] программное обеспечение KLCoMP, описанное в этом документе, не является общедоступным)
- ^ Cluster OpenMP (продукт, который раньше был доступен для компилятора Intel C++ версий с 9.1 по 11.1, но был исключен в версии 13.0)
- ^ Эгюад, Эдуард; Копти, Наваль; Дюран, Алехандро; Хефлингер, Джей; Линь, Юань; Массайоли, Федерико; Су, Эрнесто; Унникришнан, Прия; Чжан, Гуаньсун (2007). Предложение по параллелизму задач в OpenMP (PDF) . Учеб. Международный семинар по OpenMP.
- ^ «Интерфейс прикладного программного обеспечения OpenMP, версия 3.0» (PDF) . openmp.org. Май 2008 года . Проверено 6 февраля 2014 г.
- ^ ЛаГрон, Джеймс; Арибуки, Йодун; Аддисон, Коди; Чепмен, Барбара (2011). Реализация задач OpenMP во время выполнения . Учеб. Международный семинар по OpenMP. стр. 100-1 165–178. CiteSeerX 10.1.1.221.2775 . дои : 10.1007/978-3-642-21487-5_13 .
- ^ «Выпущен API OpenMP 4.0» . OpenMP.org. 26 июля 2013 г. Архивировано из оригинала 09.11.2013 . Проверено 14 августа 2013 г.
- ^ «Интерфейс прикладного программного обеспечения OpenMP, версия 4.0» (PDF) . openmp.org. Июль 2013 года . Проверено 6 февраля 2014 г.
- ^ «Спецификация OpenMP 5.2» .
- ^ «OpenMP ARB выпускает технический отчет 12» .
- ^ «C — Как использовать printf() в нескольких потоках» .
- ^ «std::cout, std::wcout — cppreference.com» .
- ^ «Учебное пособие. Параллельное выполнение циклов с OpenMP» . 14 июля 2009 г.
- ^ Выпуски Visual C++, Visual Studio 2005.
- ^ Выпуски Visual C++, Visual Studio 2008.
- ^ Выпуски Visual C++, Visual Studio 2010.
- ^ Дэвид Уортингтон, «Intel рассматривает жизненный цикл разработки с помощью Parallel Studio». Архивировано 15 февраля 2012 г. в Wayback Machine , SDTimes, 26 мая 2009 г. (по состоянию на 28 мая 2009 г.).
- ^ «Функции XL C/C++ для Linux» (по состоянию на 9 июня 2009 г.)
- ^ «Технологическая сеть Oracle для разработчиков Java | Технологическая сеть Oracle | Oracle» . Developers.sun.com . Проверено 14 августа 2013 г.
- ^ Jump up to: Перейти обратно: а б «openmp — GCC Wiki» . Gcc.gnu.org. 30 июля 2013 г. Проверено 14 августа 2013 г.
- ^ Кеннеди, Патрик (6 сентября 2011 г.). «Компиляторы Intel® C++ и Fortran теперь поддерживают спецификацию OpenMP* 3.1 | Intel® Developer Zone» . Software.intel.com . Проверено 14 августа 2013 г.
- ^ Jump up to: Перейти обратно: а б «Возможности компиляторов IBM XL C/C++» . ИБМ . 13 декабря 2018 г.
- ^ Jump up to: Перейти обратно: а б «Возможности компиляторов IBM XL Fortran» . 13 декабря 2018 г.
- ^ Jump up to: Перейти обратно: а б «Примечания к выпуску Clang 3.7» . llvm.org . Проверено 10 октября 2015 г.
- ^ «Главная страница Absoft» . Проверено 12 февраля 2019 г.
- ^ «Серия выпусков GCC 4.9 – Изменения» . www.gnu.org.
- ^ «Функции OpenMP* 4.0 в компиляторе Intel 15.0» . Программное обеспечение.intel.com. 13 августа 2014 г. Архивировано из оригинала 16 ноября 2018 г. Проверено 10 ноября 2014 г.
- ^ «Серия выпусков GCC 6 — Изменения» . www.gnu.org.
- ^ «Компиляторы и инструменты OpenMP» . openmp.org . www.openmp.org . Проверено 29 октября 2019 г.
- ^ Jump up to: Перейти обратно: а б «Поддержка OpenMP — документация Clang 12» . clang.llvm.org . Проверено 23 октября 2020 г.
- ^ «GOMP — реализация OpenMP для GCC — Проект GNU — Фонд свободного программного обеспечения (FSF)» . gcc.gnu.org . Архивировано из оригинала 27 февраля 2021 г. Проверено 23 октября 2020 г.
- ^ «Поддержка OpenMP*» . Интел . Проверено 23 октября 2020 г.
- ^ Jump up to: Перейти обратно: а б Амриткар, Амит; Тафти, Данеш; Лю, Руй; Куфрин, Рик; Чепмен, Барбара (2012). «Параллелизм OpenMP для систем жидкость и жидкость-частицы». Параллельные вычисления . 38 (9): 501. doi : 10.1016/j.parco.2012.05.005 .
- ^ Амриткар, Амит; Деб, Сурья; Тафти, Данеш (2014). «Эффективное параллельное моделирование CFD-DEM с использованием OpenMP» . Журнал вычислительной физики . 256 : 501. Бибкод : 2014JCoPh.256..501A . дои : 10.1016/j.jcp.2013.09.007 .
- ^ Поддержка ускорителя OpenMP для графических процессоров
- ^ Обнаружение и предотвращение условий гонки OpenMP в C++
- ^ «Алексей Колосов, Евгений Рыжков, Андрей Карпов 32 ловушки OpenMP для C++-разработчиков» . Архивировано из оригинала 7 июля 2017 г. Проверено 15 апреля 2009 г.
- ^ Стивен Блер-Чаппел, корпорация Intel, «Став экспертом по параллельному программированию за девять минут», презентация на ACCU 2010 конференции
- ^ Чен, Юронг (15 ноября 2007 г.). «Многоядерное программное обеспечение». Журнал технологий Intel . 11 (4). дои : 10.1535/itj.1104.08 .
- ^ «Результат OMPM2001» . СПЕЦ. 28 января 2008 г.
- ^ «Результат OMPM2001» . СПЕЦ. 01 апреля 2003 г. Архивировано из оригинала 25 февраля 2021 г. Проверено 28 марта 2008 г.
Дальнейшее чтение [ править ]
- Куинн Майкл Дж. Параллельное программирование на C с помощью MPI и OpenMP McGraw-Hill Inc. 2004. ISBN 0-07-058201-7
- Р. Чандра, Р. Менон, Л. Нидл, Д. Кор, Д. Мэйдан, Дж. Макдональд. http://dx.doi.org/10.1037/0033-295X.103.2.211 Параллельное программирование в OpenMP, Морган Кауфманн, 2000. ISBN 1-55860-671-8
- Р. Эйгенманн (редактор), М. Восс (редактор), Параллельное программирование с общей памятью OpenMP: Международный семинар по приложениям и инструментам OpenMP, WOMPAT 2001, Вест-Лафайет, Индиана, США, 30–31 июля 2001 г. (Конспекты лекций на компьютере). Наука). Спрингер 2001. ISBN 3-540-42346-X
- Б. Чепмен, Г. Йост, Р. ван дер Пас, DJ Kuck (предисловие), Использование OpenMP: параллельное программирование с портативной общей памятью. MIT Press (31 октября 2007 г.). ISBN 0-262-53302-2
- Том Дикин и Тимоти Дж. Мэттсон: Программирование графического процессора с помощью OpenMP: переносимость производительности графических процессоров , MIT Press, ISBN 978-0-262547536 (7 ноября 2023 г.).
- Параллельная обработка через MPI и OpenMP, М. Фирузиан, О. Номменсен. Линукс Энтерпрайз, 10/2002
- Статья журнала MSDN об OpenMP
- Учебное пособие по SC08 OpenMP, архивировано 19 марта 2013 г. на Wayback Machine (PDF) — практическое введение в OpenMP, Mattson и Meadows, от SC08 (Остин)
- Спецификации OpenMP , заархивированные 2 марта 2021 г. на Wayback Machine.
- Мигель Херманс: Параллельное программирование на Фортране 95 с использованием OpenMP (19 апреля 2002 г.) (PDF) (OpenMP версии 1 и версии 2)