Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kursovaya_rabota.docx
Скачиваний:
25
Добавлен:
21.09.2019
Размер:
564.8 Кб
Скачать

1.Теоретична частина. Варіант 3. Описати стандарти OpenMp I mpi, як основні засоби програмування для многопроцесорних систем.

1.1.OpenMР

OpenMP стандарт програмного інтерфейсу додатків для паралельних систем з загальною пам'яттю. Підтримує мови C, C + +, Фортран.

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

Рис. 1.1. Модель паралельної програми в OpenMP

Модель паралельної програми в OpenMP можна сформулювати наступним чином:

• Програма складається з послідовних і паралельних секцій (рис. 1,1).

• У початковий момент часу створюється головна нитка, яка виконує послідовні секції програми.

• При вході в паралельну секцію виконується операція fork, що породжує сімейство ниток. Кожна нитка має свій унікальний числовий ідентифікатор (Головної нитки відповідає 0). При розпаралелювання циклів всі паралельні нитки виконують один код. У загальному випадку нитки можуть виконувати різні фрагменти коду.

• При виході з паралельної секції виконується операція join. Завершується виконання всіх ниток, крім головної.

OpenMP складають наступні компоненти:

• Директиви компілятора - використовуються для створення потоків, розподілу роботи між потоками і їх синхронізації. Директиви включаються у вихідний текст програми.

• Підпрограми бібліотеки - використовуються для встановлення та визначення атрибутів потоків. Виклики цих підпрограм включаються у вихідний текст програми.

• Змінні оточення - використовуються для управління поведінкою паралельної програми. Змінні оточення задаються для середовища виконання паралельної програми відповідними командами (наприклад, командами оболонки в операційних системах UNIX). Використання директив компілятора і підпрограм бібліотеки підпорядковується правилам, які розрізняються для різних мов програмування. Сукупність таких правил називається прив'язкою до мови.

Прив'язка до мови 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; 21

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.1.1 Директиви OpenMp

Далі наводиться перелік директив OpenMP. Описи директив OpenMP орієнтовані на специфікацію версії 2.5.

parallel

end parallel

private;

shared;

default;

firstprivate;

reduction;

if;

copyin;

num_threads.

sections

end sections

Обрамляє паралельну секцію програми. Вкладені секції програми, що задаються директивами section, розподіляються між нитками. З даною директивоюможуть використовуватися наступні оператори:

private;

firstprivate;

lastprivate;

reduction;

nowait.

single

end single

Обрамляє блок програми, який повинен виконуватися однією ниткою. З даною директивою можуть використовуватися наступні оператори:

private;

firstprivate;

copyprivate;

nowait.

Визначає межі паралельної секції програми. З даною директивою можуть використовуватися наступні оператори (їх опис дається далі):

workshare

end workshare

Ділить блок на частини, виконання яких розподіляється між нитками таким чином, що кожна частина виконується один раз. Блок може містити тільки такі конструкції:

• привласнення масивів;

• скалярні присвоювання;

FORALL;

WHERE;

atomic;

critical;

parallel.

parallel do

цикл do

end parallel do

Об'єднує директиви parallel і do.

parallel sections

...

end parallel sections

Об'єднує директиви parallel і sections.

parallel workshare ... end parallel workshare Об'єднує директиви parallel і workshare.

master

...

end master

Обрамляє блок програми, який повинен виконуватися тільки головною ниткою.

critical [(блокування)]

... end critical [(блокування)]

Обрамляє блок програми, доступ до якого в будь-який момент часу може отримати тільки одна нитка (критична секція). Блокування - необов'язкове ім'я критичної секції. Квадратні дужки вказують, що ім'я не є обов'язковим і може бути опущено.

barrier Директива бар'єрної синхронізації ниток. Кожна нитка, виконання якої досягло даної точки, призупиняє своє виконання до тих пір, поки всі нитки не досягнуть даної точки.

atomic Оголошує операцію атомарної (при виконанні атомарної операції одночасний доступ до пам'яті за записом різних ниток заборонений). Застосовується тільки до оператора, безпосередньо наступного після даної директиви. Він може мати наступний вигляд:

x = x {+ | - | * | / |. AND. |. OR. |. EQV. |. NEQV.} скалярное_выражение_не_содержащее_x • x = скалярное_выражение_не_содержащее_x {+ | - | * | / |. AND. |. OR. |. EQV. |. NEQV.} X • x = {MAX | MIN | IAND | IOR | IEOR} (x, скалярное_выражение_не_содержащее_x) • x = {MAX | MIN | IAND | IOR | IEOR} (Скалярное_выражение_не_со держащее_x, x) flush [(список змінних)]

Дана директива задає точку синхронізації, в якій значення змінних, зазначених у списку і видимих ​​з даної нитки, записуються в пам'ять. Цим забезпечується узгодження вмісту пам'яті, доступного різним ниткам.

ordered

...

end ordered

Забезпечує збереження того порядку виконання ітерацій циклу, який відповідає послідовному виконанню програми.

threadprivate (список common-блоків)

Визначає common-блоки, перераховані в списку, локальними.

1.1.2 Оператори OpenMP Оператори OpenMP використовуються спільно з директивами. private (список змінних) Оголошує змінні зі списку локальними.

firstprivate (список змінних)

Оголошує змінні зі списку локальними і ініціалізує їх значеннями з блоку програми, що передує даній директиві.

lastprivate (список змінних)

Оголошує змінні зі списку локальними і призначає їм значення з того блоку програми, який був виконаний останнім.

copyprivate (список змінних)

Після завершення виконання блоку, заданого директивою single, значення локальних змінних зі списку розподіляються між іншими нитками. 

nowait

Скасовує бар'єрну синхронізацію при завершенні виконання паралельної секції.

shared (список змінних)

Оголошує змінні зі списку загальними для всіх ниток.

default (private | shared | none)

Даний оператор дозволяє змінити правила визначення області видимості змінних, діють за умовчанням. Варіант private використовується тільки в мові Fortran. reduction (операція | вбудована функція: список змінних) Оператор приведення значень локальних змінних зі списку за допомогою зазначеної операції або вбудованої функції мови. Операція редукції застосовується до декільком значенням і повертає одне значення.

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