- •Вычислительные процессы. Формальная модель. Свойства процесса.
- •2. Система процессов. Независимые процессы. Взаимодействие процессов.
- •Показатели параллельных вс и вычислений
- •4. Классы параллельных вс
- •5. Синхронная и асинхронная организация обмена сообщениями. Rdma.
- •Mpi: Стандарт mpi. Общие понятия. Области связи и коммуникаторы.
- •Общие процедуры mpi: Инициализация, Завершение.
- •Общие процедуры mpi: Определение общего числа параллельных процессов в группе. Определение номера процесса в группе.
- •Прием/передача сообщений между отдельными процессами (связь "точка-точка").
- •Посылка сообщения
- •Прием сообщения
- •Посылка и прием сообщения:
- •Mpi: Групповые (коллективные) взаимодействия. Рассылка целого сообщения процессам. Сборка данных от процессов. Групповые (коллективные) взаимодействия
- •Рассылка целого сообщения процессам
- •Сборка данных от процессов
- •Mpi: Групповые (коллективные) взаимодействия: Рассылка частей сообщения процессам. Сборка частей сообщения с процессов. Рассылка частей сообщения процессам
- •Выполнение глобальных операций с возвратом результатов во все процессы
- •Mpi: Синхронизация процессов. Синхронизация процессов
- •Mpi: Виртуализация топологии.
- •Декартова топология
- •Топология графа
- •Программирование мвс с общей памятью. Процессы и потоки в posix
- •OpenMp: Общие понятия. Область применения.
- •17. Директивы OpenMp: Директивы для определения параллельной области.
- •18. OpenMp: Директивы для распределения вычислений внутри параллельной области: Директива for.
- •19. OpenMp: Директивы для распределения вычислений внутри параллельной области: Директива sections. Директива single.
- •20. OpenMp: Директивы для распределения вычислений внутри параллельной области: Объединение директив parallel и for (sections).
- •Проблема тупиков в параллельных программных системах. Виды тупиков. Методы борьбы с тупиками в параллельных программных системах.
- •22.Централизованный метод обнаружения тупиков в параллельных программных системах
- •23. Децентрализованный метод обнаружения тупиков в параллельных программных системах
- •24.Предотвращение тупиков в параллельных программных системах
- •Синхронизация логического времени в параллельных программных системах
- •Синхронизация физического времени в параллельных программных системах
- •Распределение процессов по процессорам. Критерии и подходы. Распределение статической системы процессов.
- •28. Распределение процессов по процессорам. Централизованный метод “Up-Down”
- •29. Распределение процессов по процессорам. Иерархический алгоритм.
- •30. Распределение процессов по процессорам. Стохастические алгоритмы.
- •31. Формальные модели параллельных вычислений
- •Модель мультипотоковых вычислений Блумова-Лейзерсона
- •Планирование мультипотоковых вычислений. «Жадный планировщик».
- •Планирование мультипотоковых вычислений. «Занятые листья».
- •Планирование мультипотоковых вычислений. «Похитетель работ».
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