Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 02.10.2012 | Доступ: свободный | Студентов: 1744 / 191 | Длительность: 17:47:00
Специальности: Программист
Лекция 4:

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

4.1.3. Структура OpenMP

Конструктивно в составе технологии OpenMP можно выделить:

  • Директивы,
  • Библиотеку функций,
  • Набор переменных окружения.

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

4.1.4. Формат директив OpenMP

Стандарт предусматривает использование OpenMP для алгоритмических языков C90, C99, C++, Fortran 77, Fortran 90 и Fortran 95. Далее описание формата директив OpenMP и все приводимые примеры программ будут представлены на языке C; особенности использования технологии OpenMP для языка Fortran будут даны в п. 5.8.1. В самом общем виде формат директив OpenMP может быть представлен в следующем виде:

#pragma omp <имя_директивы> [<параметр>[[,] <параметр>]...]
      

Начальная часть директивы (#pragma omp) является фиксированной, вид директивы определяется ее именем (имя_директивы), каждая директива может сопровождаться произвольным количеством параметров (на английском языке для параметров директивы OpenMP используется термин clause).

Для иллюстрации приведем пример директивы:

#pragma omp parallel default(shared) 
      \ private(beta,pi)
      

Пример показывает также, что для задания директивы может быть использовано несколько строк программы – признаком наличия продолжения является знак обратного слеша "\".

4.2. Выделение параллельно-выполняемых фрагментов программного кода

Итак, параллельная программа, разработанная с использованием OpenMP, представляется в виде набора последовательных (однопотоковых) и параллельных (многопотоковых) фрагментов программного кода (см. рис. 4.2).

4.2.1. Директива parallel для определения параллельных фрагментов

Для выделения параллельных фрагментов программы следует использовать директиву parallel:

#pragma omp parallel [<параметр> ...] <блок_программы>
      

Для блока (как и для блоков всех других директив OpenMP) должно выполняться правило "один вход – один выход", т. е. передача управления извне в блок и из блока за пределы блока не допускается.

Директива parallel является одной из основных директив OpenMP. Правила, определяющие действия директивы, состоят в следующем:

  • Когда программа достигает директиву parallel, создается набор (team) из N потоков; исходный поток программы является основным потоком этого набора (master thread) и имеет номер 0.
  • Программный код блока, следующий за директивой, дублируется или может быть разделен при помощи директив между потоками для параллельного выполнения.
  • В конце программного блока директивы обеспечивается синхронизация потоков – выполняется ожидание окончания вычислений всех потоков; далее все потоки завершаются – дальнейшие вычисления продолжает выполнять только основной поток (в зависимости от среды реализации OpenMP потоки могут не завершаться, а приостанавливаться до начала следующего параллельного фрагмента – такой подход позволяет снизить затраты на создание и удаление потоков).
4.2.2. Пример первой параллельной программы

Подчеркнем чрезвычайно важный момент – оказывается, даже такого краткого рассмотрения возможностей технологии OpenMP достаточно для разработки пусть и простых, но параллельных программ. Приведем практически стандартную первую программу, разрабатываемую при освоению новых языков программирования – программу, осуществляющую вывод приветственного сообщения "Hello World !" Итак:

#include <omp.h>
main () {
  /* Выделение параллельного фрагмента*/
#pragma omp parallel
  { printf("Hello World !\n");
  }/* Завершение параллельного фрагмента */
}

      
4.1. Первая параллельная программа на OpenMP

В приведенной программе файл omp.h содержит определения именованных констант, прототипов функций и типов данных OpenMP – подключение этого файла является обязательным, если в программе используются функции OpenMP. При выполнении программы по директиве parallel будут созданы потоки (по умолчанию их количество совпадает с числом имеющихся вычислительных элементов системы – процессоров или ядер), каждый поток выполнит программный блок, следуемый за директивой, и, как результат, программа выведет сообщение "Hello World !" столько раз, сколько будет иметься потоков.

4.2.3. Основные понятия параллельной программы: фрагмент, область, секция

После рассмотрения примера важно отметить также, что параллельное выполнение программы будет осуществляться не только для программного блока, непосредственно следующего за директивой parallel, но и для всех функций, вызываемых из этого блока (см. рис. 4.3). Для обозначения этих динамически возникающих параллельно выполняемых участков программного кода в OpenMP используется понятие параллельных областей (parallel region) – ранее, в предшествующих версиях стандарта, использовался термин динамический контекст (dynamic extent).

Область видимости директив OpenMP

Рис. 4.3. Область видимости директив OpenMP

Ряд директив OpenMP допускает использование как непосредственно в блоках директивы, так и в параллельных областях. Такие директивы носят наименование отделяемых директив (orphaned directives).

Для более точного понимания излагаемого учебного материала сведем воедино введенные термины и понятия (в скобках даются названия, используемые в стандарте 2.5):

  • Параллельный фрагмент (parallel construct) – блок программы, управляемый директивой parallel; именно параллельные фрагменты, совместно с параллельными областями, представляют параллельно-выполняемую часть программы; в предшествующих стандартах для обозначения данного понятия использовался термин лексический контекст (lexical extent) директивы parallel.
  • Параллельная область (parallel region) – параллельно выполняемые участки программного кода, динамическивозникающие в результате вызова функций из параллельных фрагментов – см. рис. 4.3.
  • Параллельная секция (parallel section)– часть параллельного фрагмента, выделяемая для параллельного выполнения при помощи директивы section – см. раздел 5.6.
4.2.4. Параметры директивы parallel

Приведем перечень параметров директивы parallel:

  • if (scalar_expression)
  • private (list)
  • shared (list)
  • default (shared | none)
  • firstprivate (list)
  • reduction (operator: list)
  • copyin (list)
  • num_threads (scalar_expression)

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

4.2.5. Определение времени выполнения параллельной программы

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

Получение текущего момента времени выполнения программы обеспечивается при помощи функции:

double omp_get_wtime(void),

результат вызова которой есть количество секунд, прошедших от некоторого определенного момента времени в прошлом. Этот момент времени в прошлом, от которого происходит отсчет секунд, может зависеть от среды реализации OpenMP, а для ухода от такой зависимости функцию omp_get_wtime следует использовать только для определения длительности выполнения тех или иных фрагментов кода параллельных программ. Возможная схема применения функции omp_get_wtime может состоять в следующем:

double t1, t2, dt; 
t1 = omp_get_wtime (); 
… 
t2 = omp_get_wtime (); 
dt = t2 – t1;
      

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

double omp_get_wtick(void),
      

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

Дмитрий Остапенко
Дмитрий Остапенко

поддерживаю выше заданые вопросы

 

Павел Каширин
Павел Каширин

Скачал архив и незнаю как ничать изучать материал. Видео не воспроизводится (скачено очень много кодеков, различных плееров -- никакого эффекта. Максимум видно часть изображения без звука). При старте ReplayMeeting и Start в браузерах google chrome, ie возникает script error с невнятным описанием. В firefox ситуация еще интереснее. Выводится: 

Meet Now: Кукаева Светлана Александровна. 

Meeting Start Time: 09.10.2012, 16:58:04
Meeting Stop Time: 09.10.2012, 18:45:18
Recording Duration:01:47:14

Downloading...

Your Web browser is not configured to play Windows Media audio/video files.

Make sure the features are enabled and available.