Санкт-Петербургский государственный университет
Опубликован: 11.02.2010 | Доступ: свободный | Студентов: 530 / 93 | Оценка: 4.41 / 4.44 | Длительность: 08:19:00
Специальности: Программист
Лекция 2:

OpenMP

< Лекция 1 || Лекция 2: 123456 || Лекция 3 >
Аннотация: В данной лекции даются основные сведения об инструментальном средстве параллельного программирования - OpenMP

OpenMP - стандарт программного интерфейса приложений для параллельных систем с общей памятью. Поддерживает языки C, C++, Фортран.

Модель программы в OpenMP

Модель параллельной программы в OpenMP

увеличить изображение
Рис. 2.1. Модель параллельной программы в OpenMP

Модель параллельной программы в OpenMP можно сформулировать следующим образом:

  • Программа состоит из последовательных и параллельных секций (рис. 2.1).
  • В начальный момент времени создается главная нить, выполняющая последовательные секции программы.
  • При входе в параллельную секцию выполняется операция fork,порождающая семейство нитей. Каждая нить имеет свой уникальный числовой идентификатор (главной нити соответствует 0). При распараллеливании циклов все параллельные нити исполняют один код. В общем случае нити могут исполнять различные фрагменты кода.
  • При выходе из параллельной секции выполняется операция join.Завершается выполнение всех нитей, кроме главной.

OpenMP составляют следующие компоненты:

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

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

Привязка к языку Fortran

В программах на языке Fortran директивы компилятора, имена подпрограмм и переменных окружения начинаются с OMP. Формат директивы компилятора:

{!|C|*}$OMP директива [оператор_1[, оператор_2, ...]]

Директива начинается в первой (фиксированный формат записи текста языка Fortran 77 ) или произвольной (свободный формат) позиции строки. Допускается продолжение директивы в следующей строке, в этом случае действует стандартное в данной версии языка правило для обозначения строки продолжения (непробельный символ в шестой позиции для фиксированного формата записи и амперсанд для свободного формата).

Пример программы на языке Fortran с использованием OpenMP

program omp_example
integer i, k, N
real*4 sum, h, x
print *, "Please, type in N:"
read *, N
h = 1.0 / N
sum = 0.0
C$OMP PARALLEL DO SCHEDULE(STATIC) REDUCTION(+:sum)
do i = 1, N
x = i  * h
sum = sum + 1.e0  * h /   (1.e0 + x**2)
enddo
print *,   4.0  * sum end

Привязка к языку C

В программах на языке C прагмы, имена функций и переменных окружения OMP начинаются с omp, omp или OMP. Формат директивы:

#pragma omp директива [оператор_1[, оператор_2, ...]]

В OpenMP -программе используется заголовочный файл omp.h.

Пример программы на языке С с использованием OpenMP

#include "omp.h" #include <stdio.h> double f(double x) {
return 4.0  / (1 + x * x);
}
main() {
const long N = 100000;
long i;
double h, sum, x; sum = 0;
h = 1.0  / N;
#pragma omp parallel shared(h) {
#pragma omp for private(x) reduction(+:sum) for  (i = 0;  i < N;  i++) 
{ x = h * (i + 0.5); 
sum = sum + f(x);
}
}
printf("PI = %f\n",  sum / N);
}
< Лекция 1 || Лекция 2: 123456 || Лекция 3 >