OpenMP
OpenMP - стандарт программного интерфейса приложений для параллельных систем с общей памятью. Поддерживает языки C, C++, Фортран.
Модель программы в 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); }