Что такое OpenMP

Автор работы: Пользователь скрыл имя, 26 Декабря 2011 в 20:22, реферат

Описание

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

Работа состоит из  1 файл

Стандарт интерфейса приложений для параллельных систем с общей памятью.doc

— 102.50 Кб (Скачать документ)
  1. Переменная распараллеливаемого цикла объявлена как общая.

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

  1. Отсутствие слова for в директиве parallel for

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

  1. Изменение числа нитей в параллельной области программы.

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

  1. Снятие замка нитью, которая его не устанавливала.

   Замок может быть снят только нитью, установившей его.

  1. Изменение переменной распараллеленного цикла внутри него.

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

   Из перечисленных ошибок наиболее частыми и трудно отслеживаемыми являются ошибки 1 и 4. Но поскольку отличить их друг от друга во время выполнения программы в большинстве случаев невозможно, то следует их объединить в одну группу. Назовем ее ошибками общей переменной.

   Приведенный список ошибок не является полным и  поэтому следует сказать еще  о паре ошибок, которые могут возникнуть в OpenMP-программе:

  • Ошибка инициализации. Суть этой ошибки заключается в том, что в программе может возникнуть ситуация, когда происходит чтение переменной, которой еще не присвоили начальное значение. Технология OpenMP только увеличивает число возможных причин этой ошибки. Дело в том, что приватные переменные могут быть определены по-разному. Обычная приватная переменная (private) при входе в область, где она, таким образом, определена, не имеет начального значения. Однако, если сделать ее firstprivate, то кроме того, что она становится приватной, так ей еще будет присвоено значение, которое переменная имела до данной области. В OpenMP существуют разные параметры директив, которые аналогичным образом определяют передачу значений от исходных приватным переменным и от приватных исходным переменным. Поэтому, если программист неправильно задал тип приватной переменной, то, скорее всего, проявится именно эта ошибка.
  • Ошибка взаимной блокировки (deadlock). Это классическая ошибка, которая возникает, когда несколько нитей сначала захватывают в собственное пользование некоторые ресурсы, а затем пытаются захватить ресурсы, захваченные другими нитями. В результате все нити блокируются и программа виснет. Простейшим примером взаимной блокировки в OpenMP является случай, когда в одной критической секции находится другая, но с таким же именем. В этом случае нить, когда дойдет до второй критической секции, заблокирует сама себя. Этот вид ошибок искать не очень сложно, т.к. найти место зависания программы обычно не составляет особого труда.
 

   Отладка параллельных программ 

   Процесс отладки параллельных программ можно  условно поделить на традиционную и  автоматическую.

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

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

   С чего начать 

   Параллелизовать программу можно несколькими  способами. Во-первых, следует определить, нужна ли параллелизация. Некоторые  алгоритмы не годятся для параллелизации. Если создается новый проект, можно  выбрать алгоритм, который может  быть параллелизован. До начала попыток параллелизации очень важно убедиться, что код выполняется правильно в последовательном режиме. Определите временные характеристики при последовательном выполении, по которым можно будет принять решение о целесообразности параллелизации.

   Скомпилируйте последовательную версию в нескольких режимах оптимизации. Вообще говоря, компилятор может выполнить гораздо  более серьезную оптимизацию, чем  сам программист.

   Когда программа готова для параллелизации, можно применить ряд функций  и средств Sun Studio, которые помогут достигнуть цели. Они кратко описаны ниже. 

   Автоматическая  параллелизация 

   Можно попробовать применить ключ автоматической параллелизации компилятора (-xautopar). Доверив  параллелизацию компилятору, программист  может параллелизовать программу без каких-либо усилий со своей стороны. Кроме того, автоматический параллелизатор может помочь определить фрагменты кода, которые можно параллелизовать с помощью прагм OpenMP, и особенности, которые могут помешать параллелизации (например, зависимости между повторениями тела цикла). Комментарии компилятора можно просмотреть, скомпилировав программу с ключом -g и использовав служебную программу er_src(1) из состава Sun Studio, например, следующим образом:

   % cc -g -xautopar -c source.c

   % er_src source.o 

   Автоопределение области действия 

   Одним из наиболее распространенных типов  ошибок в программировании с использованием OpenMP являются ошибки в определении  области действия, когда область  действия переменной указывается неверно, например, переменная определяется как общая (частная), в то время как ее нужно определить как частную (общую). Функция автоопределения области действия в компиляторах Sun Studio освобождает программиста от задачи определения областей действия переменных. Поддерживаются два расширения OpenMP: оператор __auto и оператор default(__auto). Подробности приведены в Руководстве пользователя по OpenMP. 

   Отладчик dbx 

   Отладчик Sun Studio, dbx, поддерживает работу с потоками и может использоваться для отладки  программы, использующей OpenMP. Для отладки программы, использующей OpenMP, следует, во-первых, скомпилировать программу без какой-либо оптимизации, использовав ключи компилятора -xopenmp=noopt -g, затем запустить dbx для отладки полученного исполнимого модуля. С помощью dbx можно устанавливать точки останова внутри области параллельности и выполнять код в области параллельности в пошаговом режиме, проверять переменные, являющиеся частными для потока, и так далее. 

   Анализатор  производительности 

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

   Положительные стороны 

  • Поэтапное (инкрементальное) распараллеливание
    • Можно распараллеливать последовательные программы поэтапно, не меняя их структуру
  • Единственность разрабатываемого кода
    • Нет необходимости поддерживать последовательный и параллельный вариант программы, поскольку директивы игнорируются обычными компиляторами (в общем случае)
  • Эффективность
    • Учет и использование возможностей систем с общей памятью
  • Стандартизованность (переносимость), поддержка в наиболее распространенных языках (C/C++, Fortran) и платформах (Windows, Unix)
 

   Ключевые  элементы 

   Ключевыми элементами OpenMP являются: 

  • конструкции для создания потоков (директива parallel),
  • конструкции распределения работы между потоками (директивы DO/for и section),
  • конструкции для управления работой с данными (выражения shared и private),
  • конструкции для синхронизации потоков (директивы critical, atomic и barrier),
  • процедуры библиотеки поддержки времени выполнения (например, omp_get_thread_num),
  • переменные окружения (например, OMP_NUM_THREADS).
 

   Примеры программ 

   Ниже  приведены примеры программ с  использованием директив OpenMP: 

   1. Fortran

   В этой программе на языке Fortran создается заранее неизвестное число потоков (оно определяется переменной окружения OMP_NUM_THREADS перед запуском программы), каждый из которых выводит приветствие вместе со своим номером. Главный поток (имеющий номер 0) также выводит общее число потоков, но только после того, как все они «пройдут» директиву BARRIER.

         PROGRAM HELLO

         INTEGER ID, NTHRDS

         INTEGER OMP_GET_THREAD_NUM, OMP_GET_NUM_THREADS

   C$OMP PARALLEL PRIVATE(ID)

         ID = OMP_GET_THREAD_NUM()

         PRINT *, 'HELLO WORLD FROM THREAD', ID

   C$OMP BARRIER

         IF ( ID .EQ. 0 ) THEN

           NTHRDS = OMP_GET_NUM_THREADS()

           PRINT *, 'THERE ARE', NTHRDS, 'THREADS'

         END IF

   C$OMP END PARALLEL

         END 

   2. Си

   В этой программе два массива (a и b) складываются параллельно десятью потоками.

   #include <stdio.h>

   #include <omp.h>

    

   #define N 100

    

   int main(int argc, char *argv[])

   {

     float a[N], b[N], c[N];

     int i;

     omp_set_dynamic(0);      // запретить библиотеке openmp менять число потоков во время исполнения

     omp_set_num_threads(10); // установить число потоков в 10

    

     // инициализируем массивы

     for (i = 0; i < N; i++)

     {

         a[i] = i * 1.0;

         b[i] = i * 2.0;

     }

    

     // вычисляем сумму массивов

   #pragma omp parallel shared(a, b, c) private(i)

     {

   #pragma omp for

       for (i = 0; i < N; i++)

         c[i] = a[i] + b[i];

     }

     printf ("%f\n", c[10]);

     return 0;

   } 

   Существующие  реализации 

   OpenMP поддерживается многими современными  компиляторами.

  • Компиляторы Sun Studio поддерживают официальную спецификацию — OpenMP 2.5 — с улучшенной производительностью под ОС Solaris; поддержка Linuxзапланирована на следующий релиз.
  • Visual C++ 2005 поддерживает OpenMP в редакциях Professional и Team System.
  • GCC 4.2 поддерживает OpenMP, а некоторые дистрибутивы (такие как Fedora Core gcc) включили поддержку в свои версии GCC 4.1.
  • Intel C++ Compiler, включая версию Intel Cluster OpenMP для программирования в системах с распределённой памятью.
  • IBM XL compiler
  • PGI (Portland group)
  • Pathscale
  • HP
  • PascalABC.NET

Информация о работе Что такое OpenMP