
- •Технологии
- •План
- •Литература
- •Особенности технологий для параллельных вычислений
- •Требования к параллельным вычислениям
- •Модели параллельных вычислений
- •Топологии параллельных систем
- •Примеры топологий
- •Классы параллельных систем
- •Цель созданий программных технологий параллельных
- •Создание параллельных программ в модели с общей
- •Создание параллельных программ с обменом
- •Языки программирования с поддержкой параллелизма
- •Процессы
- •Составные части процесса
- •Память
- •Файловая система
- •Порождение процессов
- •Доступ к файловой системе
- •Работа с файловой
- •Память общего доступа
- •Конфликты при обращении к общим ресурсам: a – общая переменная
- •Семафоры
- •Синхронизация с помощью семафоров
- •Сигналы
- •Потоки
- •Стандарт OpenMP
- •Пример OpenMP
- •Обмен сообщениями
- •Системные API
- •Сокет
- •Диаграмма работы с
- •Синхронный и асинхронный обмен
- •API для асинхронных операций ввода-вывода
- •Сравнение синхронного и асинхронного ввода-вывода
- •Интерфейсы параллельного программирования
- •Message Passing Interface (MPI)
- •Диаграмма соответвия между сокетами, MPI и др
- •Основные определения
- •Разработка и запуск MPI программ
- •Пример MPI программы
- •Результат работы MPI программы
- •Реализации MPI
- •Parallel Virtual Machine (PVM)
- •Основные компоненты
- •Основные операции
- •Принцип создания параллельных программ
- •Пример запуска машины PVM
- •Пример PVM программы
- •Языки рассчитанные на параллельное
- •Вопросы ?

Работа с файловой |
|
|
системой |
|
Процесс 2 |
Процесс 1 |
|
|
Открываем |
|
|
файл, канал, сокет |
|
|
open(), pipe(), socket() |
|
запись write() |
|
pipe |
|
|
Чтение read() |
|
|
|
|
запись write() |
сокет |
|
Чтение read() |
|
|
|
|
По сети |
Закрываем файл |
Обычный файл |
Процесс 3 |
|
||
close() |
|
|
|
|
запись write() |
|
На диск |
Чтение read() |
|
|

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

Конфликты при обращении к общим ресурсам: a – общая переменная
|
Процесс1 |
: считываем |
a=1 |
|
Процесс1 |
: увеличивает a на 1 |
a=2 |
Процесс 1: записывает a назад a=2
|
Процесс2 |
: считываем |
a=2 |
|
Процесс2 |
: увеличивает a на 1 |
a=3 |
Процесс 2: записывает a назад a=3
|
Процесс1 : считываем |
a=1 |
|
Процесс2 : считываем |
a=1 |
|
Процесс1 : увеличивает a на 1 |
a=2 |
|
Процесс2 : увеличивает a на 1 |
a=2 |
Процесс 2: записывает a назад a=2
Процесс 1: записывает a назад a=2

Семафоры
Семафор – совместно используемая атомарная целочисленная переменная
В каждый момент времени изменять значение семафора может только один процесс
Значение семафорам может увеличиваться или уменьшатся на целое число (обычно на 1)
Уменьшение
Если значение семафора становится меньше нуля, то процесс, который выполнил такую операцию останавливается, пока значение семафора не станет >=0
Увеличение
Всегда проходит успешно
Проверка на нуль
Если значение семафора равно 0, то процесс продолжает выполнение
Если не равно нулю, то процесс останавливается, пока значение на станет равным 0

Синхронизация с помощью семафоров
Процесс 1
Создать семафор
Присвоить семафору 1
Уменьшить семафор на 1 (семафор<=0)
Обратится к совместно используемым ресурсам
Увеличить семафор на 1
Процесс 2
Уменьшить семафор на 1 (семафор<=0)
Обратится к совместно используемым ресурсам
Увеличить семафор на 1

Сигналы
Сигнал – аналог прерывания
Асинхронное событие – неизвестно когда произойдет
Один процесс может послать другому сигнал с определенным номером
Процесс может сигнал перехватить, игнорировать или выполнить действие по умолчанию

Потоки
Часть процесса, которая выполняется параллельно другими частями процесса
Все ресурсы потоков - общие
Для создания потоков используется аналог функции fork, которой передается функция потока
Pthread – стандарт на API для создания потоков

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

Пример OpenMP
int main (void){ int i;
int k = 0;
#pragma omp parallel for default(shared) private(i) \ reduction(+:k)
for (i =0; i<=1000000; i++) k+=func(i);
cout << k<<endl; return 0;
}

Обмен сообщениями
Когда процессы работают на разных машинах, то доступ к одним и тем же данным невозможен
Необходимо организовать передачу данных между процессами параллельной программы
Данные передаются атомарными порциями – сообщениями
Атомарность – сообщение обрабатывается как одно целое