Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpora_ROD_1.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1 Мб
Скачать
☆

2. Интерфейс OpenMp. Интерфейс OpenMp

Интерфейс OpenMP задуман как стандарт для программирования на масштабируемых SMP-системах (модель общей памяти). В стандарт OpenMP входят спецификации набора директив компилятора, процедур и переменных среды.

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

Спецификация OpenMP для C/C++, содержит следующую функциональность:

• Директивы OpenMP начинаются с комбинации символов "#pragma omp". Директивы можно разделить на 3 категории: определение параллельной секции, разделение работы, синхронизация.

• Компилятор с поддержкой OpenMP определяет макрос "_OPENMP".

• Распараллеливание применяется к for-циклам, для этого используется директива "#pragma omp for".

• Типы и функции OpenMP определены во включаемом файле <omp.h>.

Программная модель OpenMP представляет собой fork-join параллелизм, в котором главный поток по необходимости порождает группы потоков при вхождении программы в параллельные области приложения.

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

Приведем с использованием OpenMP пример программы вычисления числа π. Формула для вычисления π та же, что для MPI.

#include <stdio.h>

#include < omp.h>

double f(double y) {return(4.0/(1.0+y*y));}

void main() {

double w, x, sum, pi;

int i, n = 1000000;

w = 1.0/n;

sum = 0.0;

#pragma omp parallel for private(x) shared(w) reduction(+:sum)

for(i=0; i < n; i++) {

x = w*(i-0.5);

sum = sum + f(x);

}

pi = w*sum;

printf("pi = %f\n", pi);

}

Программа начинается как единственный процесс на головном процессоре. Он исполняет все операторы вплоть до первой конструкции типа #pragma omp. В рассматриваемом примере это оператор parallel for, при исполнении которого порождается множество процессов с соответствующим каждому процессу окружением.

В случае симметричного мультипроцессинга SMP на всех процессорах процессорной системы исполняется один экземпляр операционной системы, которая отвечает за распределение прикладных процессов (задач, потоков) между отдельными процессорами. Распараллеливание применяется к for-циклам, для этого используется директива "#pragma omp for", по которой ОС раздает процессорам (ядрам) личный экземпляр программы, как в SPMD, попросту передает один и тотже отрезок программы на заданное число процессоров. Распараллеливание применяется к for-циклам, для этого используется директива "#pragma omp for", по котоой ОС раздает ппроцессорам (ядрам) личный экземпляр программы, как в SPMD.

В рассматриваемом примере окружение состоит из локальной (PRIVATE) переменной х, переменной sum редукции (REDUCTION) и одной разделяемой (SHARED) переменной w. Переменные х и sum локальны в каждом процессе без разделения между несколькими процессами. Переменная w располагается в головном процессе. Оператор REDUCTION имеет в качестве атрибута операцию, которая применяется к локальным копиям параллельных процессов в конце каждого процесса для вычисления значения переменной в головном процессе. Переменная цикла i является локальной в каждом процессе, так как именно с уникальным значением этой переменной порождается каждый процесс. Параллельные процессы завершаются оператором END DO, выступающим как синхронизирующий барьер для порожденных процессов. После завершения всех процессов продолжается только головной процесс.

Директивы OpenMP с точки зрения C являются комментариями и начинаются с комбинации символов #pragma, поэтому приведенная выше программа может без изменений выполняться на последовательной ЭВМ в обычном режиме.

Распараллеливание в OpenMP выполняется явно при помощи вставки в текст программы специальных директив, а также вызова вспомогательных функций. При использовании OpenMP предполагается SPMD-модель (Single Program Multiple Data) параллельного программирования, в рамках которой для всех параллельных нитей используется один и тот же код.

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

Задача - Привести пример графа предшествования операций и дать соответствующие определения.

Показывает, какие процессы будут планироваться, и в какой последовательности.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]