>
>
Технология OpenMP

Андрей Карпов
Статей: 674

Технология OpenMP

Статья содержит краткое описание технологии OpenMP.

OpenMP

OpenMP (Open Multi-Processing) — это набор директив компилятора, библиотечных процедур и переменных окружения, которые предназначены для программирования многопоточных приложений на многопроцессорных системах с общей памятью (SMP-системах).

Первый стандарт OpenMP был разработан в 1997 г. как API, ориентированный на написание легко переносимых многопоточных приложений. Сначала он был основан на языке Fortran, но позднее включил в себя и языки Си и Си++.

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

Разработку спецификации OpenMP ведут несколько крупных производителей вычислительной техники и программного обеспечения, чья работа регулируется некоммерческой организацией "OpenMP Architecture Review Board" (ARB) [1].

В OpenMP используется модель параллельного выполнения "ветвление-слияние". Программа OpenMP начинается как единственный поток выполнения, называемый начальным потоком. Когда поток встречает параллельную конструкцию, он создает новую группу потоков, состоящую из себя и некоторого числа дополнительных потоков, и становится главным в новой группе. Все члены новой группы (включая главный) выполняют код внутри параллельной конструкции. В конце параллельной конструкции имеется неявный барьер. После параллельной конструкции выполнение пользовательского кода продолжает только главный поток. В параллельный регион могут быть вложены другие параллельные регионы, в которых каждый поток первоначального региона становится основным для своей группы потоков. Вложенные регионы могут в свою очередь включать регионы более глубокого уровня вложенности.

Число потоков в группе, выполняющихся параллельно, можно контролировать несколькими способами. Один из них - использование переменной окружения OMP_NUM_THREADS. Другой способ — вызов процедуры omp_set_num_threads(). Ещё один способ — использование выражения num_threads в сочетании с директивой parallel.

OpenMP и другие технологии параллельного программирования

На данный момент считается, что наиболее гибким, переносимым и общепринятым интерфейсом параллельного программирования является MPI (интерфейс передачи сообщений). Однако модель передачи сообщений:

  • недостаточно эффективна на SMP-системах;
  • относительно сложна в освоении, так как требует мышления в "невычислительных" терминах.

POSIX-интерфейс для организации нитей (Pthreads) поддерживается широко (практически на всех UNIX-системах), однако по многим причинам не подходит для практического параллельного программирования:

  • нет поддержки Fortran;
  • слишком низкий уровень;
  • нет поддержки параллелизма по данным;
  • механизм нитей изначально разрабатывался не для целей организации вычислительного параллелизма.

OpenMP можно рассматривать как высокоуровневую надстройку над Pthreads (или аналогичными библиотеками нитей). Перечислим преимущества, которые OpenMP даёт разработчику.

  • За счет идеи "инкрементального распараллеливания" OpenMP идеально подходит для разработчиков, желающих быстро распараллелить свои вычислительные программы с большими параллельными циклами. Разработчик не создаёт новую параллельную программу, а просто последовательно добавляет в текст последовательной программы OpenMP-директивы.
  • При этом OpenMP — достаточно гибкий механизм, предоставляющий разработчику большие возможности контроля над поведением параллельного приложения.
  • Предполагается, что OpenMP-программа на однопроцессорной платформе может быть использована в качестве последовательной программы, т.е. нет необходимости поддерживать последовательную и параллельную версии. Директивы OpenMP просто игнорируются последовательным компилятором, а для вызова процедур OpenMP могут быть подставлены заглушки (stubs), текст которых приведен в спецификациях.
  • Одним из достоинств OpenMP его разработчики считают поддержку так называемых "orphan" (оторванных) директив, то есть директивы синхронизации и распределения работы могут не входить непосредственно в лексический контекст параллельной области.

OpenMP и инструментарий

На данный момент технология OpenMP поддерживается большинством компиляторов языка Си/Си++. Несколько хуже дело обстоит с инструментами тестирования параллельных OpenMP программ. Инструменты анализа, проверки и оптимизации параллельных программ хотя и существуют давно, до недавнего времени были мало востребованы при разработке прикладного программного обеспечения. Поэтому они часто являются менее удобными, чем иные инструментальные средства разработки.

Наиболее полно процесс разработки параллельных OpenMP программ поддержан в пакете Intel Parallel Studio. Имеется инструмент предварительного анализа кода для выявления участков, которые потенциально можно эффективно распараллелить. Имеется хорошо оптимизирующий компилятор с поддержкой OpenMP. Имеется профилировщик и инструмент динамического анализа для выявления параллельных ошибок.

Библиографический список