При использовании многопроцессорных вычислительных систем с общей памятью
обычно предполагается, что имеющиеся в составе системы процессоры обладают
равной производительностью, являются равноправными при доступе к общей памяти, и
время доступа к памяти является одинаковым (при одновременном доступе нескольких
процессоров к одному и тому же элементу памяти очередность и синхронизация
доступа обеспечивается на аппаратном уровне). Многопроцессорные системы
подобного типа обычно именуются симметричными мультипроцессорами (symmetric
multiprocessors, SMP).

Перечисленному выше набору
предположений удовлетворяют также активно развиваемые в последнее время многоядерные процессоры, в которых каждое ядро представляет практически независимо
функционирующее вычислительное устройство.
Следует отметить, что общий доступ к данным может быть обеспечен и при
физически распределенной памяти (при этом, естественно, длительность доступа уже
не будет одинаковой для всех элементов памяти). Такой подход именуется как
неоднородный доступ к памяти (non-uniform
memory access or NUMA).
В
самом общем виде системы с общей памятью могут быть представлены в виде модели
параллельного компьютера с произвольным доступом к памяти (parallel random-access machine –
PRAM).
Обычный подход при организации вычислений для многопроцессорных
вычислительных систем с общей памятью – создание новых параллельных приложений
на основе обычных последовательных программ, в которых или автоматически
компилятором, или непосредственно программистом выделяются участки независимых
друг от друга вычислений. Возможности автоматического анализа программ для
порождения параллельных вычислений достаточно ограничены, и второй подход
является преобладающим. При этом для разработки параллельных программ могут
применяться как новые алгоритмические языки, ориентированные на параллельное
программирование, так и уже имеющиеся языки программирования, расширенные
некоторым набором операторов для параллельных вычислений.
Широко применяемый подход состоит и в использовании библиотек,
обеспечивающих определенный программный интерфейс (application programming interface, API) для разработки параллельных
программ. В рамках такого подхода наиболее известны Windows Thread
API и PThead API. Однако оба варианта
API
являются достаточно сложными в использовании и имеют низкоуровневый
характер.
Все перечисленные выше подходы приводят к необходимости значительной
переработки существующего программного обеспечения, и это в серьезно затрудняет
широкое распространение параллельных вычислений. Как результат, в последнее
время активно развивается еще один подход к разработке параллельных программ,
когда указания программиста по организации параллельных вычислений добавляются в
программу при помощи тех или иных внеязыковых средств языка программирования –
например, в виде директив или комментариев, которые обрабатываются специальным
препроцессором до начала компиляции программы. При этом исходный текст программы
остается неизменным, и по нему, в случае, когда препроцессор не задействован,
компилятор построит последовательный программный код. Препроцессор же, будучи
примененным, заменяет директивы параллелизма на некоторый дополнительный
программный код (как правило, в виде обращений к процедурам какой-либо
параллельной библиотеки).
Рассмотренный выше подход является основой технологии OpenMP, широко
применяемой в настоящее время для организации параллельных вычислений на
многопроцессорных системах с общей памятью. В рамках данной технологии директивы
параллелизма используются для выделения в программе параллельных
фрагментов, в которых последовательный исполняемый код может быть разделен
на несколько раздельных потоков выполнения (threads). Далее эти потоки могут
исполняться на разных процессорах (процессорных ядрах) вычислительной системы. В
результате такого подхода программа представляется в виде набора
последовательных (однопотоковых) и параллельных (многопотоковых)
участков программного кода. Подобный принцип организации параллелизма получил
наименование "вилочного" (fork-join) или пульсирующего
параллелизма.

При разработке технологии OpenMP был учтен
накопленный опыт по разработке параллельных программ для систем с общей памятью.
Опираясь на стандарт X3Y5 и учитывая возможности PThreads
API, в
технологии OpenMP в
значительной степени упрощена форма записи директив и добавлены новые
функциональные возможности. Для привлечения к разработке OpenMP самых
опытных специалистов и для стандартизации подхода на самых ранних этапах
выполнения работ был сформирован Международный комитет по OpenMP (the OpenMP Architectural
Review Board, ARB). Первый стандарт OpenMP API применительно к
языку Fortran был принят в 1997 г., для алгоритмического языка C – в 1998 г.
Последняя версия стандарта OpenMP для языков C и Fortran была опубликована в 2005 г.
(см. www.openmp.org).
Важные положительные моменты этой технологии:
-
Сложность разработки параллельной программы с
использованием технологии OpenMP в значительной степени согласуется со
сложностью решаемой задачи – распараллеливание сравнительно простых
последовательных программ, как правило, не требует значительных усилий (порою
достаточно включить в последовательную программу всего лишь несколько директив
OpenMP); это позволяет, в частности, разрабатывать параллельные программы и
прикладным разработчикам, не имеющим большого опыта в параллельном
программировании.
-
Технология OpenMP обеспечивает возможность
поэтапной (инкрементной) разработки параллельных программы –
директивы OpenMP могут добавляться в последовательную программу
постепенно (поэтапно), позволяя уже на ранних этапах разработки получать
параллельные программы, готовые к применению; при этом важно отметить, что
программный код получаемых последовательного и параллельного вариантов
программы является единым, что в значительной степени упрощает проблему
сопровождения, развития и совершенствования программ.
-
OpenMP позволяет в значительной степени снизить остроту
проблемы переносимости параллельных программ между разными компьютерными
системами – параллельная программа, разработанная на алгоритмическом языке C
или Fortran с использованием технологии OpenMP, как правило, будет работать
для разных вычислительных систем с общей памятью.