Статья содержит краткое описание технологии 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.
На данный момент считается, что наиболее гибким, переносимым и общепринятым интерфейсом параллельного программирования является MPI (интерфейс передачи сообщений). Однако модель передачи сообщений:
POSIX-интерфейс для организации нитей (Pthreads) поддерживается широко (практически на всех UNIX-системах), однако по многим причинам не подходит для практического параллельного программирования:
OpenMP можно рассматривать как высокоуровневую надстройку над Pthreads (или аналогичными библиотеками нитей). Перечислим преимущества, которые OpenMP даёт разработчику.
На данный момент технология OpenMP поддерживается большинством компиляторов языка Си/Си++. Несколько хуже дело обстоит с инструментами тестирования параллельных OpenMP программ. Инструменты анализа, проверки и оптимизации параллельных программ хотя и существуют давно, до недавнего времени были мало востребованы при разработке прикладного программного обеспечения. Поэтому они часто являются менее удобными, чем иные инструментальные средства разработки.
Наиболее полно процесс разработки параллельных OpenMP программ поддержан в пакете Intel Parallel Studio. Имеется инструмент предварительного анализа кода для выявления участков, которые потенциально можно эффективно распараллелить. Имеется хорошо оптимизирующий компилятор с поддержкой OpenMP. Имеется профилировщик и инструмент динамического анализа для выявления параллельных ошибок.
0