Главная Обратная связь

Дисциплины:






Программирование МВС с общей памятью. Процессы и потоки в POSIX



+: не нужно перепроектировать проект, хорошая переносимость.

-: проблема масштабируемости; проблема увеличения числа процессов.

Процессы и потоки в POSIX.

Решают 2 проблемы:

1) Поток как «облегченный» процесс (light-weight process). Создание потока может занимать меньше 10% времени создания «полноценного» потока.

2) Упрощение обмена информацией между параллельными активными потоками. Потоки одного процесса разделяют адресное пространство процесса.

Процессы:

Обзор процесса:

-сегмент кодов; - сегмент данных; - динамический сегмент; - сегмент стека

Фазы работы процесса:

Прикладная (пользовательская) – имеет доступ к сегментам;

Системная – доступ к системным структурам данных.

Потоки: threads

Общие части потока Раздельные части
Коды команд процесса Набор регистров, включая РС и указатель стека
Сегмент данных Стек (хранит лок, дин. Переменные и адреса возвратов и подпрограмм)
Открытые файлы (дескрипторы) Идентификатор потока
Обработчик сигналов, настройки для обработки сигналов Маска сигналов
Текущий рабочий каталог приоритет
Идентификатор пользователя группы Errno (номер ошибки)

 

Создание потоков:

- при запуске программы вызовем exeс, создается 1 поток – начальный поток (initial thread)

- добавочные потоки создаются thread_create

- задается функция, которая вызывается при запуске потока – начальная функция потока

- возвращает id порожденного потока pthread_t

Завершение потоков:

- явное завершение потока pthread_exit

- неявное – возврат из начальной функции потока

Pthread_self – возвращает id потока

Pthread_join – ожидание завершения потока

Pthread_detach – «отсоединение» потока (по завершению все ресурсы освобождаются, никакой другой процесс не может ждать его завершения)

 

16. OpenMP: Общие понятия. Область применения.

Интерфейс OpenMP предназначен для программирования параллельных вычислений на традиционных алгоритмических языках (С\С++б Fortran), выполняемых на системах с общим пространством памяти (SMP). Его основную часть составляют набор директив, библиотечных функций и переменных окружения. В OpenMP заложена идея «инкрементального распараллеливания», когда разработчик не создает новую программу, просто добавляем в текст последовательной программы OpenMP-директивы. При этом система программирования OpenMP предоставляет разработчику большие возможности по контролю над поведением параллельного приложения.

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



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

 

17. Директивы OpenMP: Директивы для определения параллельной области.

Директивы OpenMP для С\С++ имеют следующий формат:

#pragma omp <имя директивы> [список параметров]

Пример директивы OpenMP.

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

Как известно, в семействе языков С директива #pragma предназначена для управления специфическими возможностями компилятора. Ключевое слово omp используется для того, чтобы исключить случайные совпадения имен директив OpenMP с другими именами.

Параметры директив (directive clauses) можно условно разделить на две категории. Одни из них влияют на ход вычислительного процесса ипозволяют учесть особенности распараллеливаемой задачи и многопроцессорной системы, в которой она будет выполняться. Например, с их помощью можно разрешить создание параллельной области только при выполнении заданного условия, назначить количество нитей в регионе или количество итераций, выполняемых в нитях. Другие параметры, их примерно половина, определяют видимость переменных в параллельном регионе и специальные действия, которые должны выполняться над ними в начале и в конце сферы действия параметра. Он может содержать только те имена, которые описаны в исходном тексте стандартными средствами С\С++ и используются в ассоциированном с директивой операторе или блоке.

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

В общем случае директивы OpenMP можно разделить на 3 типа:

1)директивы для определения параллельной области

2)директивы для распределения вычеслений

3) директивы синхронизации

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

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

Для задания параллельной области программы используется директива parallel. Это основная директива OpenMP.

Директива parallel имеет следующий формат

#pragma omp parallel [список параметров…] newline

structured_block

параметры

if (scalar_expression)

private (list)

shared (list)

default (shared|none)

firstprivate (list)

reduction (operator: list)

copyin (list)

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

Количество нитей в параллельной области может задаваться ( в порядке убывания старшинства)

1. функцией API omp_set_num_threads()

2. через переменную окружения OMP_NUM_HREADS

3. реализацией

По умолчанию количество нитей одинаковое. Для активизации динамического режима можно использовать функцию omp_set_dynamic или переменную окружения OM P_DYNAMIC.

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

Пример использования директивы parallel.

#include <omp.h>

main () {

int threads, tid;

/* создание параллельной области */

#pragma omp parallel private (ntthreads, tid)

{

/*печать номера потока */

tid = omp_get_thread_num();

printf (“hello world from thread = %d/n”, tid);

if (tid == 0) {

nthreads – omp_get_num_threads ();

printf (“Number of threads = %d/n”, nthreads);

}

} /*завершение параллельной области*/

 

 

18. OpenMP: Директивы для распределения вычислений внутри параллельной области: Директива for.

Существуют 3 директивы для распределения вычислений в параллельной области:

1) for – распределение итераций между нитями

2) sections – распараллеливание раздельных фрагментов кода (функциональное распараллеливание)

3)single – директива для указания последовательного выполнения кода.

В сфере действия директив for, sections и single нельзя использовать все остальные директивы OpenMP, что ограничивает возможности управления вычислительным процессом в параллельном регионе. Для снятия этих ограничений описание региона должно начаться с директивы parallel. Формально сферой ее действия является блок, но он может содержать вложенные блоки директивы, как формирующие структуру региона, так и управляющие процессом вычислений. Кроме того, директива parallel имеет параметры, которые позволяют по усмотрению программиста выбирать количество нитей, выполняемых в параллельном регионе. При этом начало выполнения директив по умолчанию является синхронным.

Директива for.

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

Директива for имеет следующий формат:

#pragma omp for [список параметров] newline

цикл_for

параметры

schedule (type [,chunk])

ordered

private (list)

firstprivate (list)

lastprivate (list)

shared (list)

reduction (operator: list)

nowait

Распределение итераций цикла регулируется параметром schedule. Он может принимать следующие значения:

1) static – итерации делятся на блоки по chunk итераций и статически разделяются между нитями. Если параметр chunk не определен, итерации делятся между нитями равномерно и непрерывно.

2) dynamic – распределение итерационных блоков осуществляется динамически (по умолчанию chunk=1)

3)guided – размер итерационного блока уменьшает экспоненциально при каждом распределении; chunk определяет минимальный размер блока (по умолчанию chunk=1)

4)runtime – правило распределения определяется переменной окрущения

OMP_SCHEDULE (ghb использовании runtime параметр chunk задаваться не должен)

Пример распараллеливания цикла с помощью директивы for.

#include <omp.h>

#define CHUNK 100

#define NMAX 1000

main () {

int i, n, chunk;

float a [NMAX], b [NMAX], с [NMAX] ;

/*Инициализация*/

for (i=0; i< NMAX; i++)

a[i] = b[i] = i*1.0;

n = NMAX;

chunk = CHUNK;

#pragma omp parallel shared (a,b,c,n,chunk) private (i)

{

#pragma omp for schedule (dynamic, chunk) nowait

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

c[i] = a[i] + b[i];

} /* end of parallel section */

}

 

 

19. OpenMP: Директивы для распределения вычислений внутри параллельной области: Директива sections. Директива single.

Директива sections формирует нити из отдельных блоков, расположенных в исходной программе последовательно друг за другом. Перед каждым преобразуемым в нить блоков указывается вспомагательная директива section.

При этом:

1)каждый блок выполняется однократно

2)разные блоки выполняются разными потоками

3)заверщение директивы sections по умолчанию синхронизируется

4)директивы section должны использоваться только в статическом контексте

Директива sections имеет следующий формат:

#pragma omp sections [список параметров…] newline

{

#pragma omp section newline

structured_block

#pragma omp section newline

structured_block

}

список параметров

private (list)

firstprivate (list)

lastprivate (list)

reduction (operator: list)

nowait

Пример распараллеливания с помощью sections

#include <omp.h>

#define NMAX 1000

main ()

int i, n;

float a[NMAX], b[NMAX], c[NMAX];

/* инициализация */

for (i=0; i< NMAX;i++)

a[i]=b[i]=i*1.0;

n= NMAX;

#pragma omp parallel shared (a, b, c, n,) private(i)

{

#pragma omp section

for (i=0; i<n/2; i++)

c[i]=a[i]+b[i];

#pragma omp section

for (i=n/2; i<n; i++)

c[i]=a[i]+b[i];

} /* завершение sections */

} /* завершение параллельной области*/

Директива single

Директива single задает блок, который должен быть выполнен только одним потоком; все остальные потоки ожидают завершения выполнения фрагмента (если не указан параметр nowait)

Директива single имеет следующий формат

#pragma omp single [список параметров…] newline

structured_block

список параметров

private (list)

firstprivate (list)

nowait

 

20. OpenMP: Директивы для распределения вычислений внутри параллельной области: Объединение директив parallel и for (sections).

В случае, если параллельная область содержит только одну директиву for (или sections), возможно объединение этих директив в одну.

Пример объединения директив parallel и for

#include <omp.h>

#define CHUNK 100

#define NMAX 1000

main ()

{

int i, n, chunk;

float a [NMAX], b [NMAX], с [NMAX ];

/* инициализация */

for (i=0, i< NMAX; i++)

a[i]=b[i]=i*1.0;

n= NMAX;

chunk=CHUNK;

#pragma omp parallel for shared (a, b, c, n) private (i) schedule (static, chunk)

for (i=o; i<n; i++)

c[i]=a[i]+b[i];

}

 

 





sdamzavas.net - 2019 год. Все права принадлежат их авторам! В случае нарушение авторского права, обращайтесь по форме обратной связи...