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

Системные API
Сокеты – независимый от протокола интерфейс, который позволяет организовать взаимодействие между процессами в сети
Впервые – BSD 4.2
TCP - гарантированная доставка в потоке
UDP – негарантированная дейтаграмная доставка
RAW – Прямой доступ к заголовкам протоколов
UNIX – сокеты на локальной машине
С сокетами работать также как и с файлами

Сокет
Серверный процесс
socket() – создание сокета
bind() – назначение адреса
listen() – перевод в режим ожидания входных соединений
accept() – прием входного соединения
Клиентский процесс
socket() – создание сокета
bind() – назначение локального адреса (не обязательно)
connect() – соединение с сервером
Для соединенных сокетов
recv(), read() – получение данных
Send(), write() – отправка данных

Диаграмма работы с |
|
сокетами |
Клиент |
Сервер |
socket() Создаем сокет
bind()
Назначаем адрес и порт cluster.univ.kiev.ua:22
listen()
Переводим в режим «слушать» На входящие соединения
|
|
|
|
|
|
|
Соединенный |
|
|
|
|
|
|
|
|
|||||
accept() |
||||||
сокет с другим |
|
|
|
|||
|
|
|
Ожидаем входящее |
|||
|
|
|
||||
клиентом |
|
|
|
|||
|
|
|
соединение |
|||
|
|
|
|
|||
|
|
|
|
|||
|
|
|
|
|
|
socket() Создаем сокет
connect() Соединение с cluster.univ.kiev.ua:22
Обмен данными По сети
возвращаем соединенный сокет

Синхронный и асинхронный обмен
Синхронный вызов –
функции send(), recv(), accept(), connect() блокируются пока не будет выполнена операция
Пока функция не завершится процесс ожидает
При этом снижается эффективность распараллеливания
Асинхронный вызов –
функции send(), recv(), accept(), connect() начинают обмен и передают процессу управление
Процесс сразу же начинает выполнять свои работу
В случае успешного завершения ввода-вывода или ошибки процессу посылается сигнал или процесс сам проверяет состояние операции ввода-вывода
Эффективность параллельной обработки значительно выше

API для асинхронных операций ввода-вывода
select(), poll() – проверка состояния сокетов
Функция возвращает может ли блокирующий вызов завершиться без блокировки
Non-block IO – неблокирующий вызов
Сокет переводится в неблокирующее состояние
Функции завершаются сразу же и возвращают состояние операции
Async IO – асинхронный ввод- вывод
Сокет переводится в соответствующее состояние
При возможности неблокирующего ввода-вывода процессу отправляется сигнал

Сравнение синхронного и асинхронного ввода-вывода
Синхронный
Простота программирования
Меньшее количество ошибок
Неэффективен для параллельных программ
Обычно все операции с общей памятью - синхронны
Асинхронный
Сложнее программировать
Больше ошибок
Очень эффективен для параллельных программ
При обмене сообщениями позволяет выполнять вычисления одновременно с передачей

Интерфейсы параллельного программирования
Часто при написании параллельных программ приходится выполнять сложные операции обмена данными
Передача от одного процесса к другому
Передача от одного процесса всем остальным
Суммирование данных на всех процессах
…
Для этого необходимо разрабатывать свои протоколы и каждый раз программировать сокеты не удобно
Были разработаны специальные интерфейсы, которые рассчитаны на быстрый обмен данными между процессами параллельных программ

Message Passing Interface (MPI)
MPI - стандарт интерфейса (middleware) обмена сообщениями для компьютеров с распределенной памятью
MPI программа состоит из нескольких процессов, которые взаимодействуют между собой с помощью вызовов библиотечных функций MPI
MPI скрывает от пользователя низкоуровневые детали программирования, такие как программирование сокетов, обработка ошибок приема-передачи, сериализацию и др.
MPI предоставляет функции для осуществления взаимодействия точка-точка, коллективных взаимодействий, других операций ввода-вывода

Диаграмма соответвия между сокетами, MPI и др
Пользовательская программа
Middleware – MPI, PVM, RPC, CORBA
|
Интерфейс сокетов |
|
Интерфейсы |
||||
|
|
|
|
|
взаимодействия с |
||
|
|
|
|
|
общей памятью |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ядро |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Аппаратное обеспечение

Основные определения
Процесс
Программа, которая выполняет свой код
Процесс характеризуется только своим номером в группе
Группы процессов
Процессы можно группировать по любому признаку
Коммуникаторы
Группы процессов, которые используются для определения номера при взаимодействиях
Вначале определен MPI_COMM_WORLD
Новые коммуникаторы можно создавать используя существующие
Топологии
Соответствие номера процесса в коммуникаторе узлу топологии