В первых параллельных вычислительных системах, когда

реклама
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 1 из 133
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РЕСПУБЛИКИ КАЗАХСТАН
ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ имени ШАКАРИМА ГОРОДА СЕМЕЙ
Документ СМК 3 уровня
УМКД
УМКД
УМКД
Рабочая учебная программа
дисциплины «Паралельные
вычисления» для студентов
Редакция №1 от
03.09.2013
042-39.1.142/02-2013
УЧЕБНО-МЕТОДИЧЕСКИИ КОМПЛЕКС
ДИСЦИПЛИНЫ
«Параллельные вычисления»
для специальности 5В060200 – «Информатика »
УЧЕБНО-МЕТОДИЧЕСКИЕ МАТЕРИАЛЫ
Семей
2014
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
СОДЕРЖАНИЕ
1.
2.
3.
4.
Глоссарий
Лекции
Лабораторные занятия
Самостоятельная работа студента
Страница 2 из 133
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 3 из 133
1. Глоссарий
MPP-системы строится из процессорных узлов, содержащих процессор,
локальный блок оперативной памяти, коммуникационный процессор
или сетевой адаптер, иногда - жесткие диски и/или другие устройства
ввода/вывода.
Векторно-конвейерные
классу SIMD-систем.
вычислительные
системы относятся
к
Вычислительная система MIMD содержит много процессоров, которые
(как правило, асинхронно) выполняют разные команды над разными
данными.
Вычислительная система SIMD содержит много процессоров, которые
синхронно (как правило) выполняют одну и ту же команду над разными
данными.
Вычислительная система SISD представляет собой
однопроцессорную ЭВМ фон-неймановской архитектуры.
классическую
Вычислительная системы MISDisd существуют различные точки зрения.
По одно них – за всю историю развития вычислительной техники
системы MISD не были созданы.
Классификации Флина охватывает только два классификационных признака
– тип потока команд и тип потока данных.
Кластерные системы (вычислительные кластеры) представляют собой
более дешевый вариант MPP-систем
Структуру
вычислительной
системы можно
определить
как
совокупность аппаратных средств ЭВМ с указанием основных связей между
ними.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 4 из 133
2. ЛЕКЦИИ
Лекция 1. Архитектура параллельных вычислительных систе.
Основные классы параллельных вычислительных систем.
Классификация параллельных вычислительных систем
-
Классификация Флина;
Классификация по типу строения оперативной памяти;
Классификация по типу коммуникационной сети;
Классификация по степени однородности.
Под архитектурой
вычислительной
системы понимаются
абстрактное представление ЭВМ с точки зрения программиста. Полное
описание архитектуры системы включает в себя:
- основные форматы представления данных;
- способы адресации данных в программе;
- состав аппаратных средств вычислительной машины, характеристики
этих средств, принципы организации вычислительного процесса.
В курсе рассматриваются только последние аспекты архитектуры
вычислительной системы.
Структуру вычислительной системы можно определить как
совокупность аппаратных средств ЭВМ с указанием основных связей между
ними.
Имеется много различных классификаций вычислительных систем.
Рассмотрим наиболее часто используемые классификации.
Классификация Флина
Наибольшее
распространение
получила
классификация
вычислительных систем, предложенная в 1966 г. профессором
Стенфордского университета М.Д.Флином (M.J.Flynn) - классификация
Флина. Эта классификация охватывает только два классификационных
признака – тип потока команд и тип потока данных (см. Рис.1, 2).
Рис. 1. К классификации Флина. Классификация по типу потока
команд.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 5 из 133
В одиночном потоке команд в один момент времени может
выполняться только одна команда. В этом случае эта единственная команда
определяет в данный момент времени работу всех или, по крайней мере,
многих устройств вычислительной системы.
Во множественном потоке команд в один момент времени может
выполняться много команд. В этом случае каждая из таких команд
определяет в данный момент времени работу только одного или лишь
нескольких (но не всех) устройств вычислительной системы.
В одиночном потоке последовательно выполняются отдельные
команды, во множественном потоке – группы команд.
Рис. 2. К классификации Флина. Классификация по типу потока
данных.
Одиночный поток данных обязательно предполагает наличие в
вычислительной системе только одного устройства оперативной памяти и
одного процессора. Однако при этом процессор может быть как угодно
сложным, так что процесс обработки каждой единицы информации в потоке
может требовать выполнения многих команд.
Множественный поток данных состоит из многих зависимых или
независимых одиночных потоков данных.
В соответствии со сказанным, все вычислительные системы делятся на
четыре типа:
- SISD (ОКОД);
- MISD (МКОД);
- SIMD (ОКМД);
- MIMD (МКМД).
Вычислительная система SISD представляет собой классическую
однопроцессорную ЭВМ фон-неймановской архитектуры.
На вычислительную системы MISD существуют различные точки
зрения. По одно них – за всю историю развития вычислительной техники
системы MISD не были созданы. По другой точке зрения (менее
распространенной, чем первая) к MISD-системам относятся векторно-
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 6 из 133
конвейерные вычислительные системы. Мы будем придерживаться первой
точки зрения.
Вычислительная система SIMD содержит много процессоров,
которые синхронно (как правило) выполняют одну и ту же команду над
разными данными. Системы SIMD делятся на два больших класса:
- векторно-конвейерные вычислительные системы;
- векторно-параллельные
вычислительные системы или матричные
вычислительные системы.
Вычислительная система MIMD содержит много процессоров,
которые (как правило, асинхронно) выполняют разные команды над разными
данными. Подавляющее большинство современных суперЭВМ имеют
архитектуру MIMD (по крайней мере, на верхнем уровне иерархии).
Системы MIMD часто называют многопроцессорными системами. Детально
классификация этих систем рассмотрена в параграфе 3.
Рассмотренная классификации Флина позволяет по принадлежности
компьютера к классу SIMD или MIMD сделать сразу понятным базовый
принцип его работы. Часто этого бывает достаточно. Недостатком
классификации Флина является "переполненность" класс MIMD.
Классификация по типу строения оперативной памяти.
По типу строения оперативной памяти системы разделяются на
системы с общей (разделяемой) памятью, системы с распределенной
памятью и системы с физически распределенной, а логически
общедоступной памятью (гибридные системы).
В вычислительных системах с общей памятью (Common Memory
Systems или Shared Memory Systems) значение, записанное в память одним
изпроцессоров, напрямую доступно для другого процессора. Общая память
обычно имеет высокую пропускную способность памяти (bandwidth) и
низкую латентность памяти (latency) при передачи информации между
процессорами, но при условии, что не происходит одновременного
обращения нескольких процессоров к одному и тому же элементу памяти. К
общей памяти доступ разных процессорами системы осуществляется, как
правило, за одинаковое время. Поэтому такая память называется еще UMAпамятью (Unified Memory Access) — памятью с одинаковым временем
доступа. Система с такой памятью носит название вычислительной
системы с одинаковым временем доступа к памяти . Системы с общей
памятью называются также сильносвязанными вычислительными системами.
В вычислительных
системах
с
распределенной
памятью (Distributed Memory Systems) каждый процессор имеет свою
локальную память с локальным адресным пространством. Для систем с
распределенной памятью характерно наличие большого числа быстрых
каналов, которые связывают отдельные части этой памяти с отдельными
процессорами. Обмен информацией между частями распределенной памяти
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 7 из 133
осуществляется обычно относительно медленно. Системы с распределенной
памятью называются также слабосвязанными вычислительными системами.
Вычислительные системы с гибридной памятью - (Non-Uniform
Memory Access Systems) имеют память, которая физически распределена по
различным частям системы, но логически разделяема (образует единое
адресное пространство). Такая память называется еще логически общей
(разделяемой) памятью(logically shared memory). В отличие от UMA-систем,
в NUMA-системах время доступа к различным частям оперативной
памяти различно.
Заметим, что память современных параллельных систем является
многоуровневой, иерархической, что порождает проблему ее когерентности.
Классификация по типу коммуникационной сети.
Классификация
параллельных
вычислительных
систем
по
типу коммуникационной сети рассмотрена в следующем параграфе. Заметим
лишь, что по количеству уровней иерархии коммуникационной среды
различают системы с одноуровневой коммутационной сетью (один уровень
коммутации) и системы с иерархической коммутационной сетью (когда
группы процессоров объединены с помощью одной системы коммутации, а
внутри каждой группы используется другая).
Классификация по степени однородности
По степени однородности различают однородные (гомогенные) и
неоднородные (гетерогенные) вычислительные системы. Обычно при этом
имеется в виду тип используемых процессоров.
В однородных
вычислительных
системах (гомогенных
вычислительных
системах)
используются
одинаковые процессоры,
в неоднородных
вычислительных
системах (гетерогенных
вычислительных системах) – процессоры различных типов. Вычислительная
система, содержащая какой-либо специализированный вычислитель
(например, Фурье-процессор), относится к классу неоднородных
вычислительных систем.
В настоящее время большинство высокопроизводительных систем
относятся к классу однородных систем с общей памятью или к классу
однородных систем с распределенной памятью.
Рассмотренные
классификационные
признаки
параллельных
вычислительных систем не исчерпывают всех возможных их характеристик.
Существует, например, еще разделение систем по степени согласованности
режимов работы (синхронные и асинхронные вычислительные системы), по
способу обработки (с пословной обработкой и ассоциативные
вычислительные системы), по жесткости структуры (системы с
фиксированной структурой и системы с перестраиваемой структурой), по
управляющему потоку (системы потока команд -instruction flow и системы
потока данных — data flow) и т.п.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 8 из 133
Современные высокопроизводительные системы имеют, как правило,
иерархическую структуру. Например, на верхнем уровне иерархии система
относится к классу MIMD, каждый процессор которой представляет собой
систему MIMD или систему SIMD.
Отметим также тенденцию к построению распределенных систем с
программируемой структурой. В таких системах нет общего ресурса,
отказ которого приводил бы к отказу системы в целом – средства
управления, обработки и хранения информации распределены по составным
частям системы. Такие системы обладают способностью автоматически
реконфигурироваться в случае выхода из строя отдельных их частей.
Средства реконфигурирования позволяют также программно перестроить
систему с целью повышения эффективности решения на этой системе данной
задачи или класса задач.
Классификация вычислительных систем по Флину
Перечислите
классификационные
признаки,
используемые
в
классификации
вычислительных
систем
Флина,
а
также
типы вычислительных систем по этой классификации.
Ответ
Классификации Флина охватывает только два классификационных
признака – тип потока команд и тип потока данных.
В одиночном потоке команд в один момент времени может выполняться
только одна команда. В этом случае эта единственная команда определяет
в данный момент времени работу всех или, по крайней мере, многих
устройств вычислительной системы.
Во множественном потоке команд в один момент времени может
выполняться много команд. В этом случае каждая из таких команд
определяет в данный момент времени работу только одного или лишь
нескольких (но не всех) устройств вычислительной системы.
Одиночный поток данных обязательно предполагает наличие в
вычислительной системе только одного устройства оперативной памяти и
одного процессора. Однако при этом процессор может быть как угодно
сложным, так что процесс обработки каждой единицы информации в
потоке может требовать выполнения многих команд.
Множественный поток данных состоит из многих зависимых или
независимых одиночных потоков данных.
В соответствии с классификацией Флина различают следующие четыре
класса
вычислительных
система: SISD (ОКОД); MISD (МКОД); SIMD (ОКМД); MIMD (МКМД).
SISD-система представляет
собой
классическую
однопроцессорную ЭВМ фон неймановской архитектуры.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 9 из 133
На MISD-систему существуют различные точки зрения. По одно них – за
всю историю развития вычислительной техники MISD-системы не были
созданы. По другой точке зрения (менее распространенной, чем первая) к
MISD-системам
относятся векторно-конвейерные
вычислительные
системы.
SIMD-система содержит много процессоров, которые синхронно (как
правило) выполняют одну и ту же команду над разными данными. SIMDсистемы делятся на два больших класса: векторно-конвейерные
вычислительные
системы; векторно-параллельные
вычислительные
системы.
MIMD-система содержит много процессоров, которые (как правило,
асинхронно) выполняют разные команды над разными данными.
Подавляющее
большинство
современных
суперЭВМ
имеют
архитектуру MIMD (по крайней мере, на верхнем уровне иерархии). MIMDсистемы часто называют многопроцессорными системами.
Классификация вычислительных систем по типу строения памяти
Назовите три основных класса параллельных вычислительных систем в
зависимости от типа строения их оперативной памяти.
Ответ
По типу строения оперативной памяти системы разделяются на
следующие
классы: вычислительные
системы
с
общей
памятью; вычислительные системы с распределенной памятью; системы с
физически распределенной, а логически общедоступной памятью (гибридные
системы).
1) В вычислительных системах с общей памятью (Common Memory
Systems или Shared Memory Systems) значение, записанное в память одним
из процессоров, напрямую доступно для другого процессора. Общая память
обычно имеет высокую пропускную способность памяти (bandwidth) и
низкую латентность памяти (latency) при передачи информации между
процессорами, но при условии, что не происходит одновременного
обращения нескольких процессоров к одному и тому же элементу памяти. К
общей памяти доступ разных процессорами системы осуществляется, как
правило, за одинаковое время. Поэтому такая память называется еще
UMA–память (Unified Memory Access) — памятью с одинаковым временем
доступа. Системы с такой памятью называются UMA-системами.
Системы с общей памятью называются также сильносвязанными
системами. Вычислительные системыс общей памятью Вычислительные
системы с общей памятью называются мультипроцессорными
вычислительными системами или мультипроцессорами.
2) В системах с распределенной памятью (Distributed Memory Systems)
каждый процессор имеет свою локальную память с локальным адресным
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 10 из 133
пространством. Для систем с распределенной памятью характерно наличие
большого числа быстрых каналов, которые связывают отдельные части
этой памяти с отдельными процессорами. Обмен информацией между
частями распределенной памяти осуществляется обычно относительно
медленно. Системы с распределенной памятью называются также
слабосвязанными системами.Вычислительные системы с распределенной
памятью
называются мультикомпьютерными
вычислительными
системами или мультикомпьютерами.
3) Системы с гибридной памятью - NUMA-системы (Non-Uniform
Memory Access Systems) имеют память, которая физически распределена по
различным частям системы, но логически разделяема (образует единое
адресное пространство). Такая память называется еще логически общей
(разделяемой) памятью (logically shared memory). В отличие от UMAсистем, в NUMA-системах время доступа к различным частям оперативной
памяти различно.
Лекция 2. Векторно-конвейерные системы и векторно-параллельные
(SIMD-системы)
- Векторно-конвейерные вычислительные системы;
- Векторно-параллельные системы.
Векторно-конвейерные вычислительные системы относятся к
классу SIMD-систем. Основные принципы, заложенные в архитектуру
векторно-конвейерных систем:
- конвейерная организация обработки потока команд;
- введение в систему команд набора векторных операций, которые
позволяют оперировать с целыми массивами данных.
Длина
обрабатываемых
векторов
в
современных векторноконвейерных системах составляет, как правило, 128 или 256 элементов.
Основное
назначение
векторных
операций
состоит
в распараллеливании выполнения операторов цикла, в которых обычно
сосредоточена большая часть вычислительной работы.
Первый векторно-конвейерный компьютер Cray-1 появился в 1976
году. Архитектура этого компьютера оказалась настолько удачной, что он
положил начало целому семейству компьютеров.
Современные векторно-конвейерные системы имеют иерархическую
структуру:
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 11 из 133
- на
нижнем
уровне
иерархии
расположены конвейеры
операций (например, конвейер (pipeline) сложения вещественных чисел,
конвейер умножения таких же чисел и т.п.);
- некоторая
совокупность конвейеров
операций объединяется
в конвейерное функциональное устройство;
- векторно-конвейерный
процессор содержит
ряд конвейерных
функциональных устройств;
- несколько векторно-конвейерных
процессоров (2-16),
объединенных
общей памятью, образуют вычислительный узел;
- несколько таких узлов объединяются с помощью коммутаторов, образуя
либо NUMA-систему либо MPP-систему.
Типичными
представителями
такой
архитектуры
являются компьютеры CRAY J90/T90, CRAY SV1, NEC SX-4/SX-5. Уровень
развития микроэлектронных технологий не позволяет в настоящее время
производить однокристальные векторно-конвейерные процессоры, поэтому
эти системы довольно громоздки и чрезвычайно дороги.
Каждая часть конвейера операций называется ступенью конвейера
операций, а общее число ступеней - длиной конвейера операций.
Пример 1
Рассмотрим следующий 4-х ступенчатый конвейер операций сложения
вещественных чисел
Таблица 1
Номер ступени
Наименование
1
Вычитание порядков
2
Сдвиг одной из мантисс
3
Сложение мантисс
4
Нормализация
Положим,
что
выполняется
вещественных чисел
этих векторов приведена на рис. 1
сложение
двух
-векторов
. Диаграмма сложения
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 12 из 133
Рис. 1. К примеру 1. Временная диаграмма сложения (n*1)-векторов
вещественных чисел X ,Y на 4-х ступенчатом конвейере операции
сложения.
В векторно-конвейерных системах в рамках одного конвейерного
функционального устройства широко используется (т.е. аппаратно
поддерживается)зацепление конвейеров операций. Покажем суть этой
процедуры на примере.
Пример 2
Положим, что в некоторой прикладной программе, исполняемой
на векторно-конвейерной системе , необходимо вычислить
(1)
где
-векторы вещественных чисел, под произведением и
делением векторов понимается их покомпонентное умножение и деление,
соответственно. Иными словами, операции, указанные в выражении (1),
понимаются в смысле
(2)
Положим
также,
что конвейерное
устройство данной векторно-конвейерной
следующие конвейеры операций:
- конвейер сложения вещественных чисел;
- конвейер умножения вещественных чисел;
- конвейер деления вещественных чисел
функциональное
системы имеет
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 13 из 133
Тогда для повышения скорости вычисления компонент вектора E
целесообразно использовать зацепление указанных конвейеров (см. рис. 2). В
результате, можно сказать, получается новый конвейер, который выполняет
сложную операцию (2)
Рис. 2. К примеру 2. К зацеплению конвейеров.
Конвейер операций не следует путать с конвейером команд, в котором
при исполнении одной команды готовится к исполнению несколько
следующих команд. Так же, как в конвейере операций каждая часть
конвейера команд называется ступенью конвейера команд, а общее число
ступеней – длиной конвейера команд. Конвейеры команд широко
используются в современных процессорах. Так процессор Intel 486 имеет 5ти ступенчатый конвейер выполнения целочисленных команд, ступенями
которого являются следующие операции:
- предвыборка (команда извлекается из КЭШ-памяти и размещается в
одном из двух 16-байтовых буферах);
- декодирование;
- генерация адреса;
- исполнение в АЛУ;
- запись результата в КЭШ-память.
Процессор Pentium 2 (суперскалярная архитектура) имеет два 8-ми
ступенчатых конвейера целочисленных команд.
Кроме конвейеров в векторно-конвейерных системах для ускорения
работы используют различные механизмы адресации, операции с
автоинкрементом (автодекрементом) адреса, механизмы ускоренной выборки
и записи (многопортовая память, память с расслоением и т.д.), отдельное
адресное обрабатывающее устройство, отдельное скалярное устройство для
выполнения скалярных операций и пр..
Недостатком векторно-конвейерных
систем является
невысокая
загрузка процессорных элементов. Высокая производительность достигается
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 14 из 133
только на операциях с длинными векторами. На скалярных операциях и при
обработке векторов и матриц невысокой размерности значительная часть
устройств может простаивать. В целом, векторно-конвейерные системы
характеризуются высокой производительностью при полной загрузке их
вычислительных устройств, которая имеет место только при решении
определенного, достаточно узкого, круга задач.
В
качестве
примера векторно-конвейерной
системы приведем
легендарную супер-ЭВМ CYBER-205 фирмы CDC. CYBER-205 имеет
следующие конвейерные функциональные устройства:
- одно конвейерное функциональное устройство «скалярных» операций с
конвейерами
- сложения (5-ти ступенчатый);
- умножения (5-ти ступенчатый);
- логических операций сложения (3-х ступенчатый);
- цикла;
- извлечения корня;
- деления;
- 1, 2 или 4 конвейерных функциональных устройства «векторных»
операций с конвейерами
- сложения;
- умножения;
- сдвига;
- логических операций;
- задержки.
В качестве примера современной супер-ЭВМ, использующей векторноконвейерные процессоры, приведем японскую систему Fujitsu-VPP5000. На
верхнем
уровне
Fujitsu-VPP5000
имеет MPP архитектуру. Производительность одного процессора системы
составляет 9.6 Гфлопс, пиковая производительность системы может
достигать 1249 Гфлопс, максимальная емкость памяти - 8 Тб. Система
масштабируется до 512 узлов.
Векторно-параллельные системы.
Как
и векторно-конвейерные
системы, векторно-параллельная
вычислительная система обычно имеет иерархическую структуру. На
нижнем уровне иерархии находятся векторно-параллельные процессоры,
представляющие собой совокупность скалярных процессоров (процессорных
элементов), которые объединены некоторой коммуникационной сетью и в
каждом такте синхронно выполняют одну и ту же команду над разными
данными. На верхнем уровне иерархии векторно-параллельные процессоры
объединяются
общей
памятью
или
коммуникационной
сетью,
образуя NUMA-систему либо MPP систему.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 15 из 133
Векторно-параллельные процессоры имеют в своих системах команд
специальные векторные (матричные) операции, такие, как векторное и
матричное сложение, умножение вектора на матрицу, умножение матрицы на
константу, вычисление скалярного произведения, свертки и т.д. При
выполнении векторных операций различные компоненты векторов и матриц
обрабатываются параллельно на различных процессорных элементах.
Основными
компонентами векторно-параллельного
процессора являются
- совокупность скалярных процессоров (Р);
- совокупность модулей оперативной памяти (М);
- коммуникационная среда;
- устройство общего управления.
Выделим две группы векторно-параллельных процессоров: процессоры с
одинаковым числом скалярных процессоров и модулей памяти; векторные
процессоры с различным количеством скалярных процессоров и модулей
памяти.
В векторно-параллельном
процессоре с
одинаковым
числом
скалярных процессоров и модулей памяти каждый скалярный процессор
подключается к своему модулю памяти (см. рис. 3). Команда, выдаваемая
устройством управления, содержит одинаковый адрес для всех скалярных
процессоров. С помощью специального «флага» можно запретить
выполнение команды на данном скалярном процессоре – «маскирование
команды».
В векторно-параллельном
процессоре с
различным
количество
скалярных процессоров и модулей памяти (см. рис. 4) основной проблемой
является проблема исключения конфликтов при обращении к памяти
(поскольку к одному модулю памяти могут одновременно обращаться в
переделе все скалярные процессоры). Для преодоления этой проблемы в
системах этого класса используют изощренные схемы хранения массивов
данных.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 16 из 133
Рис. 3. Структура векторно-параллельного процессора с одинаковым
числом скалярных процессоров и модулей памяти.
Рис. 4. Структура векторно-параллельного процессора с различным
количеством скалярных процессоров и модулей памяти.
В историческом плане наиболее известной векторно-параллельной
системой является ILLIAC-IV (Burroughs). ЭВМ имела 64 процессора,
объединенных в 8*8 плоскую решетку. Пиковая производительность
равнялась 100 Мфлопс.
Недостатком векторно-параллельных систем, как и векторно-конвейерных
систем, является низкая, как правило, загрузка процессорных элементов.
Высокая производительность векторно-параллельных систем достигается
только на векторных операциях, в то время как на скалярных операциях, а
также при обработке векторов и матриц небольшой размерности,
значительная часть процессорных элементов может простаивать.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 17 из 133
Программирование векторно-параллельных систем сложнее, чем векторноконвейерных систем. В целом, векторно-параллельные системы, как и
векторно-конвейерные
системы,
характеризуются
высокой
производительностью только при полной загрузке их вычислительных
устройств, которая достигается при решении достаточно узкого класса задач.
В качестве примера достаточно современной векторно-параллельной
системы приведем вычислительную систему nCube-3 (1995 г.). Система
nCube-3 масштабируется от 8 до 64 К процессорных блоков, объединенных
коммуникационной сетью типа «гиперкуб» (размерностью от 3D до 16D).
Максимальная производительность nCube-3 составляет несколько TFLOPS.
Процессоры системы могут быть объединены в группы, каждая из которых
может решать свою задачу (MIMD-режим).
Назовите основные классы SIMD-вычислительных систем.
Ответ
Основными классами SIMD-вычислительных систем являются векторноконвейерные системы и векторно-параллельные системы.
Основными принципами, заложенными в архитектуру векторноконвейерных систем, являются конвейерная организация обработки потока
команд и введение в систему команд набора векторных операций, которые
позволяют оперировать с целыми массивами данных. Основу векторноконвейерных систем составляют конвейеры операций (арифметических и
иных), например, конвейеры сложения, умножения и деления вещественных
чисел.
Основу векторно-параллельных
систем составляют векторнопараллельные
процессоры,
представляющие
собой
совокупность
скалярных процессоров (процессорных элементов), которые объединены
некоторой коммуникационной сетью и в каждом такте синхронно
выполняют одну и ту же команду над разными данными. Векторнопараллельные процессоры имеют в своих системах команд специальные
векторные (матричные) операции, такие, как векторное и матричное
сложение, умножение вектора на матрицу, умножение матрицы на
константу, вычисление скалярного произведения, свертки и т.д. При
выполнении векторных операций различные компоненты векторов и матриц
обрабатываются параллельно на различных процессорных элементах.
Лекция 3. Многопроцессорные системы (MIMD-системы)
- Мультипроцессоры;
- Мультикомпьютеры;
- Кластерные системы (вычислительные кластеры);
- SMP-системы;
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 18 из 133
- MPP-системы;
- NUMA-системы.
Как уже отмечалось, MIMD-система содержит много процессоров,
которые (как правило, асинхронно) выполняют разные команды над
разными
данными.
Подавляющее
большинство
современных
высокопроизводительных ЭВМ на верхнем уровне иерархии имеют
архитектуру MIMD.
Для MIMD-систем в настоящее время общепризнанна классификация,
основанная на используемых способах организации оперативной памяти в
этих
системах.
По
этой
классификации,
прежде
всего,
различают мультипроцессорные
вычислительные
системы (или мультипроцессоры)
или вычислительные
системы
с
разделяемой памятью (multiprocessors, common memory systems, sharedmemory
systems)
и мультикомпьютерные
вычислительные
системы(мультикомпьютеры)
или вычислительные
системы
с
распределенной памятью (multicomputers, distributed memory systems).
Структура мультипроцессорной и мультикомпьютерной систем приведена
рис. 1, где
- процессор,
- модуль памяти.
Рис. 1. а) - структура мультипроцессора; б) – структура
мультикомпьютера.
Мультипроцессоры.
В мультипроцессорах адресное пространство
всех процессоров
является единым. Это значит, что если в программах нескольких процессоров
мультипроцессора встречается одна и та же переменная, то для получения
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 19 из 133
или изменения значения этой переменной эти процессоры будут обращаться
в одну физическую ячейку общей памяти. Это обстоятельство имеет как
положительные, так и отрицательные последствия.
С одной стороны, не нужно физически перемещать данные между
коммутирующими программами, что исключает затраты времени на
межпроцессорный обмен.
С
другой
стороны,
так
как
одновременное
обращение
нескольких процессоров к общим данным может привести к получению
неверных
результатов,
необходимы
системы
синхронизации
параллельных процессов и обеспечения когерентности памяти. Поскольку
процессорам необходимо очень часто обращаться к общей памяти,
требования к пропускной способности коммуникационной среды
чрезвычайно высоки.
Последнее
обстоятельство
ограничивает
число
процессоров
в мультипроцессорах несколькими десятками. Остроту проблемы доступа к
общей памяти частично удается снять разделением памяти на блоки, которые
позволяют распараллелить обращения к памяти от различных процессоров.
Отметим
еще
одно
преимущество мультипроцессоров –
мультипроцессорная система функционирует под управлением единственной
копией операционной системы (обычно, UNIX-подобной) и не требует
индивидуальной настройки каждого процессорного узла.
Однородные мультипроцессоры с равноправным (симметричным)
доступом
к
общей оперативной
памяти принято
называть SMPсистемами (системами
с
симметричной
мультипроцессорной
архитектурой). SMP-системы появились как альтернатива дорогим
мультипроцессорным
системам
на
базе векторно-конвейерных
процессоров и векторно-параллельных процессоров (см. Рис.2).
Мультикомпьютеры.
Вследствие простоты своей архитектуры наибольшее распространение
в настоящее время получили мультикомпьютеры. Мультикомпьютеры не
имеют общей памяти. Поэтому межпроцессорный обмен в таких системах
осуществляется обычно через коммуникационную сеть с помощью передачи
сообщений.
Каждый процессор в мультикомпьютере имеет независимое адресное
пространство. Поэтому наличие переменной с одним и тем же именем в
программах разных процессоров, приводит к обращению к физически
разным ячейкам собственной памяти этих процессоров. Это обстоятельство
требует физического перемещения данных между коммутирующими
программами в разных процессорах. Чаще всего основная часть обращений
производится каждым процессором к собственной памяти. Поэтому
требования к коммутационной среде ослабляются. В результате число
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 20 из 133
процессоров в мультикомпьютерных системах может достигать нескольких
тысяч, десятков тысяч и даже сотен тысяч.
Пиковая производительность крупнейших систем
с
общей
памятью ниже пиковой производительности крупнейших систем с
распределенной памятью; стоимость систем с общей памятью выше
стоимости аналогичных по производительности систем с распределенной
памятью.
Однородные мультикомпьютеры с распределенной
памятью называются вычислительными
системами
с
массивнопараллельной архитектурой (MPP-системами) - см. рис.2.
Нечто среднее между SMP-системами и MPP-системами представляют
собой NUMA-системы.
Кластерные системы (вычислительные кластеры).
Кластерные системы (вычислительные кластеры) представляют
собой более дешевый вариант MPP-систем. Вычислительный кластер состоит
из
совокупностиперсональных
компьютеров или рабочих
станций),
объединенных локальной сетью в качестве коммуникационной среды.
Детально вычислительные кластеры рассмотрены позже.
Рис. 2. Классификация мультипроцессоров и мультикомпьютеров.
SMP-системы
Все процессоры SMP-системы имеют симметричный доступ к памяти,
т.е. память SMP-системы представляет собой UMA-память. Под
симметричностью понимается следующее: равные права всех процессоров на
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 21 из 133
доступ к памяти; одна и та же адресация для всех элементов памяти; равное
время доступа всех процессоров системы к памяти (без учета взаимных
блокировок).
Общая
структура SMP-системы приведена
на
рис. 3.
Коммуникационная среда SMP-системы строится на основе какой-либо
высокоскоростной системной шиныили высокоскоростного коммутатора.
Кроме одинаковых процессоров и общей памяти M к этой же шине или
коммутатору подключаются устройства ввода-вывода.
За кажущейся простотой SMP-систем скрываются значительные
проблемы, связанные в основном с оперативной памятью. Дело в том, что в
настоящее время скорость работы оперативной памяти значительно отстает
от скорости работы процессора. Для того чтобы сгладить этот разрыв,
современные процессоры снабжаются высокоскоростной буферной памятью
(кэш-памятью). Скорость доступа к этой памяти в несколько десятков раз
превышает скорость доступа к основной памяти процессора. Однако наличие
кэш-памяти нарушается принцип равноправного доступа к любой точке
памяти, поскольку данные, находящиеся в кэш-памяти одного процессора,
недоступны для других процессоров. Поэтому после каждой модификации
копии переменной, находящейся в кэш-памяти какого-либо процессора,
необходимо производить синхронную модификацию самой этой переменной,
расположенной в основной памяти. В современных SMP-системах
когерентность кэш-памяти поддерживается аппаратно или операционной
системой.
Рис. 3. Общая структура SMP-системы
Наиболее
известными SMP-системами являются
SMP-cерверы
и рабочие станции IBM, HP, Compaq, Dell, Fujitsu и др. SMP-система
функционирует под управлением единой операционной системой (чаще
всего – UNIX и подобной ей).
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 22 из 133
Из-за ограниченной пропускной способности коммуникационной
среды SMP-системы плохо масштабируются. В настоящее время в реальных
системах используется не более нескольких десятков процессоров.
Известным неприятным свойством SMP-систем является то, что их
стоимость растет быстрее, чем производительность при увеличении
числа процессоров в системе.
MPP-системы.
MPP-системы строится из процессорных узлов, содержащих процессор,
локальный блок оперативной памяти, коммуникационный процессор
или сетевой адаптер, иногда - жесткие диски и/или другие устройства
ввода/вывода.
По
сути,
такие
модули
представляют
собой
полнофункциональные компьютеры (см.
рис. 4.).
Доступ
к
блоку
оперативной памяти данного модуля имеет только процессор этого же
модуля. Модули взаимодействуют между собой через некоторую
коммуникационную среду. Используются два варианта работы операционной
системы на MPP-системах. В одном варианте полноценная операционная
система функционирует только на управляющей ЭВМ, а на каждом
отдельном модуле работает сильно урезанный вариант операционной
системы, поддерживающий только базовые функции ядра операционной
системы. Во втором варианте на каждом модуле работает полноценная
UNIX-подобная операционная система. Заметим, что необходимость наличия
(в том или ином виде) на каждом процессоре MPP-системы операционной
системы, позволяет использовать только ограниченный объем памяти
каждого из процессоров.
По сравнению с SMP-системами, архитектура MPP-системы устраняет
одновременно как проблему конфликтов при обращении к памяти, так и
проблему когерентности кэш-памяти.
Главным
преимуществом MPP-систем является
хорошая
масштабируемость. Так супер-ЭВМ серии CRAY T3E, способны
масштабироваться до 2048 процессоров. Практически все рекорды
по производительности на сегодняшний день установлены именно на MPPсистемах, состоящих из нескольких тысяч процессоров.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 23 из 133
Рис. 4. Общая структура MPP-системы.
С другой стороны, отсутствие общей памяти заметно снижает скорость
межпроцессорного обмена в MPP-системах. Это обстоятельство для MPPсистем
выводит
на
первый
план
проблему
эффективности
коммуникационной среды.
Кроме того, в MPP-системах требуется специальная техника
программирования для реализации обмена данными между процессорами.
Этим объясняется высокая цена программного обеспечения для MPP-систем.
Этим же объясняется то, что написание эффективных параллельных
программ для MPP-систем представляет собой более сложную задачу, чем
написание таких же программ для SMP-систем. Для широкого круга задач,
для которые известны хорошо зарекомендовавшие себя последовательные
алгоритмы, не удается построить эффективные параллельные алгоритмы для
MPP-систем.
NUMA-системы.
Логически общий доступ к данным может быть обеспечен и при
физически распределенной памяти. При этом расстояние между
различными процессорами и различными элементами памяти, вообще
говоря, различно и длительность доступа различных процессоров к
различным элементам памяти различна. Т.е. память таких систем
представляет собой NUMA-память.
NUMA-система обычно строится на основе однородных процессорных
узлов, состоящих из небольшого числа процессоров и блока памяти. Модули
объединены с помощью некоторой высокоскоростной коммуникационной
среды (см. рис. 5). Поддерживается единое адресное пространство, аппаратно
поддерживается доступ к удаленной памяти, т.е. к памяти других модулей.
При этом доступ к локальной памяти осуществляется в несколько раз
быстрее, чем к удаленной. По существу, NUMA-система представляет
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 24 из 133
собой MPP-систему, где в качестве отдельных вычислительных элементов
используются SMP-узлы.
Среди NUMA-систем выделяют следующие типы систем:
- COMA-системы,
в
которых
в
качестве оперативной
памяти используется только локальная кэш-память процессоров (cacheonly memory architecture - COMA);
- CC-NUMA-системы,
в
которых аппаратно обеспечивается
когерентность
локальной кэш-памяти разных процессоров (cachecoherent NUMA - CC-NUMA);
- NCC-NUMA-системы, в которых аппаратно не поддерживается
когерентность локальной КЭШ памяти разных процессоров (non-cache
coherent NUMA - NCC-NUMA). К данному типу относится, например,
система Cray T3E.
Рис. 5. Общая структура NUMA-системы.
Логическая общедоступность памяти в NUMA-системах, с одной
стороны, позволяет работать с единым адресным пространством, а, с другой
стороны,
позволяет
достаточно
просто
обеспечить
высокую
масштабируемость системы. Данная технология позволяет в настоящее время
создавать системы, содержащие до нескольких сот процессоров.
NUMA-системы серийно производятся многими компьютерными
фирмами как многопроцессорные серверы и прочно удерживают лидерство в
классе малыхсуперкомпьютеров.
Классификация MIMD-систем
Перечислите основные классы MIMD-вычислительных систем.
Ответ
Основными
классами MIMD-вычислительных
систем являются мультипроцессоры (вычислительные
системы
с
разделяемой памятью) и мультикомпьютеры (вычислительные системы с
распределенной памятью).
В свою очередь, основными классами мультипроцессоров являются:
1)однородные мультипроцессоры с равноправным (симметричным)
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 25 из 133
доступом к общей оперативной памяти, которые называются SMPсистемами; 2)NUMA-системы, в которых обеспечен логически общий
доступ к данным, находящимся в физически распределенной памяти.
Основными
классами мультикомпьютеров являются:
1)однородные
мультикомпьютеры с распределенной памятью - вычислительные системы
с массивно-параллельной архитектурой (MPP-системы); 2)кластерные
системы (вычислительные
кластеры),
которые
состоят
из
совокупности компьютеров
(персональных компьютеров или рабочих
станций), объединенных локальной сетью в качестве коммуникационной
среды.
Лекция
5.
Многопроцессорные
системы
(MIMD-системы).
Вычислительные кластеры
- Классификация вычислительных кластеров по типу узловых
процессоров;
- Классификация вычислительных кластеров по однородности
узлов;
- Классификация вычислительных кластеров по функциональности
узлов;
- Классификация вычислительных кластеров по стандартности
комплектующих;
- Классификация вычислительных кластеров по их функциональной
направленности;
- Кластеры высокой готовности;
- Вычислительные сети.
Как мы уже отмечали вычислительный кластер – это MIMDсистема (мультикомпьютер),
состоящая
из
множества
отдельных компьютеров (узлов
вычислительного
кластера),
объединенных единой коммуникационной средой. Каждый узел имеет свою
локальную оперативную память. При этом общей физической оперативной
памяти для узлов, как правило, не существует. Коммуникационная
среда вычислительных кластеров обычно позволяет узлам взаимодействовать
между
собой
только
посредством
передачи
сообщений.
В
целом, вычислительный кластер следует рассматривать как единую
аппаратно-программную систему, имеющую единую коммуникационную
систему, единый центр управления и планирования загрузки.
Узлы вычислительного кластера могут функционировать под
управлением разных операционных систем. Однако чаще всего используются
стандартные UNIX-подобные системы. Заметим, что точки зрения
разработки прикладных параллельных программ нет каких-либо
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 26 из 133
принципиальных различий между однородными вычислительными
кластерами и MPP-системами.
Вычислительные кластеры классифицируются, прежде всего, по
характеру узловых процессоров (см. рис. 1).
Классификация вычислительных кластеров по типу узловых
процессоров.
В
качестве узлов
вычислительного
кластера обычно
используют персональные компьютеры, рабочие станции и SMP-сервера.
Если
в
качестве
узла кластераиспользуются SMP-система,
то
такой вычислительный кластер называется SMP-кластером.
Если в качестве узлов вычислительного кластера используются
персональные ЭВМ или рабочие станции, то обычной является ситуация,
когда во время решения задачи на кластере на узлах этого кластера
продолжают выполняться последовательные задания пользователей. В
результате относительная производительностьузлов кластера меняется
случайным образом и в широких пределах. Решением проблемы было бы
написание самоадаптирующейся пользовательской программы. Однако
эффективное решение этой задачи представляется весьма проблематичным.
Ситуация усугубляется, если среди узловых компьютеров вычислительного
кластера имеются файловые серверы. При этом во время решения задачи на
кластере в широких пределах может меняться загрузка коммуникационной
среды, что делает непредсказуемыми коммуникационные расходы задачи.
Рис. 1. Классификация узлов вычислительных кластеров.
Классификация вычислительных кластеров по однородности
узлов.
Как и всякие MIMD-системы, вычислительные кластеры разделяются
на однородные кластерные системы (однородные вычислительные кластеры)
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 27 из 133
игетерогенные кластерные системы (гетерогенные вычислительные
кластеры).
Обычно,
когда
говорят
о вычислительных
кластерах,
подразумевают однородные вычислительные кластеры. Однако часто при
наращивании кластераприходится использовать процессоры, отличающиеся
не только по производительности, но и по архитектуре, от узловых
процессоров кластера. Поэтому постепенно однородный вычислительный
кластер может стать неоднородным. Эта неоднородность создает следующие
проблемы. Различие в производительности процессоров усложняет задачу
распределения работ между процессорами. Различие в архитектуре
процессоров требует подготовки разных выполняемых файлов для разных
узлов, а в случае различий в представлении данных, может потребовать и
преобразования их форматов при передаче сообщений между узлами.
Классификация вычислительных кластеров по функциональности
узлов.
Узлы
вычислительного
кластера могут
представлять
собой
полнофункциональные компьютеры, которые могут работать и как
самостоятельные
единицы.Производительность такого кластера обычно
невысока.
Для
создания
высокопроизводительных вычислительных
кластеров системные блоки узловых компьютеров делают значительно более
простыми, чем в первом случае (не полнофункциональными). Здесь нет
необходимости
снабжать
компьютеры
узлов графическими
картами, мониторами, дисковыми накопителями и другим периферийным
оборудованием. Периферийное оборудование устанавливается только на
одном или немногих управляющих компьютерах (HOST-компьютерах).
Такой поход позволяет значительно уменьшить стоимость системы.
При
классификации кластеров используется
и
ряд
классификационных признаков. Рассмотрим два из них (см. рис. 2.):
- классификация по стандартности комплектующих;
- классификация по функциональной направленности.
других
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 28 из 133
Рис. 2. Классификация вычислительных кластеров.
Классификация вычислительных кластеров по стандартности
комплектующих.
С точки зрения стандартности комплектующих можно выделить два
класса кластерных систем:
- вычислительный кластер строится целиком из стандартных комплектующих;
- при построении кластера используются эксклюзивные или нешироко
распространенные комплектующие.
Вычислительные кластеры первого класса имеют низкие цены и простое
обслуживание. Широкое распространение кластерные технологии получили
как средство создания именно относительно дешевых систем
суперкомпьютерного класса из составных частей массового производства.
Кластеры второго
класса
позволяют
получить
очень
высокую производительность, но являются, естественно, более дорогими.
Классификация вычислительных кластеров по их
функциональной направленности.
С функциональной точки зрения кластерные системы можно разделить
на высокоскоростные кластерные системы (High Performance) - HPкластеры икластерные системы высокой готовности (High Availability)
– HA-кластеры. Высокоскоростные кластеры используются в областях,
которые требуют значительной вычислительной мощности. Кластеры
высокой готовности используются везде, где стоимость возможного простоя
превышает
стоимость
затрат,
необходимых
для
построения
отказоустойчивой системы.
Высокоскоростные
кластеры. Производительность вычислительного
кластера, очевидно, зависти от производительности его узлов. С другой
стороны,
производительность кластера,
как
и
сякой системы
с
распределенной памятью, сильно зависит от производительности
коммуникационной среды. Обычно при построении вычислительных
кластеров используют достаточно дешевые коммуникационные среды. Такие
среды обеспечивают производительность на один – два порядка более
низкую,
чем
производительность
коммуникационных
сред суперкомпьютеров. Поэтому находится не так много задач, которые
могут достаточно эффективно решаться на больших кластерных системах.
Влияние производительности коммуникационной среды на общую
производительность кластерной системы зависит от характера выполняемой
задачи. Если задача требует частого обмена данными между подзадачами,
которые
решаются
на
разных узлах
вычислительного
кластера,
то быстродействию коммуникационной среды следует уделить максимум
внимания. Соответственно, чем меньше взаимодействуют части задачи
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 29 из 133
между собою, тем меньше внимания можно уделить быстродействию
коммуникационной среды.
Разработано множество технологий соединения компьютеров в кластер.
Эти технологии будут рассмотрены в следующей главе.
Место HP-кластеров среди современных высокопроизводительных систем
иллюстрирует
следующий
пример:
в
списке
500
самых
высокопроизводительныхкомпьютеров мира
«Top500» вычислительные
кластеры из недорогих узлов занимают примерно половину списка.
В России крупнейший заказчик HP-кластеров — нефтегазовая отрасль, в
котрой кластеры все более широко используются для обработки трехмерных
сейсмических данных, получаемых в процессе геологоразведки.
Кластеры высокой готовности. Среди многообразия типов
современных
вычислительных
систем
высокой
готовности HAкластеры обеспечивают высокий уровень отказоустойчивости при самой
низкой стоимости.
Вообще говоря, для того, чтобы вычислительная система обладала
высокими показателями готовности, необходимо, чтобы ее компоненты были
максимально надежными, чтобы система была отказоустойчивой, а так же
чтобы была возможной «горячая» замена компонентов (без останова
системы).
Благодаря
кластеризации
при
отказе
одного
из компьютеров системы, задачи могут быть автоматически (операционной
системой) перераспределены между другими (исправными) узлами
вычислительного
кластера.
Таким
образом,
отказоустойчивость кластера обеспечивается дублированием всех жизненно
важных компонентвычислительной системы. Самыми популярными
коммерческими отказоустойчивыми системами в настоящее время являются
двухузловые кластеры.
Вычислительные сети.
Выделяется
еще
один
класс вычислительных
кластеров вычислительные
сети (GRID),
объединяющие
ресурсы
множества кластеров, многопроцессорных и однопроцессорных ЭВМ,
которые могут принадлежать разным организациям и быть расположенными
в разных странах.
Разработка
параллельных
программ
для вычислительных
сетей усложняется из-за следующих проблем. Ресурсы (количество узлов, их
архитектура,производительность), которые выделяются задаче, определяется
только в момент обработки сетью заказа на выполнение это задачи. Поэтому
программист не имеет возможности разработать программу для конкретной
конфигурации вычислительной сети. Программу приходится разрабатывать
так, чтобы она могла динамически (без перекомпиляции) самонастраиваться
на выделенную конфигурацию сети. Кроме того, к неоднородности
коммуникационной среды добавляется изменчивость ее характеристик,
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 30 из 133
вызываемая изменениями загрузки сети. В лучшем случае программа должна
разрабатываться с учетом этой неоднородности коммуникационной среды,
что представляет собой весьма непростую задачу. Как мы отмечали выше,
подобная проблема имеет место и для вычислительных кластеров,
построенных на основе персональных компьютеров или рабочих станций.
Эффективная производительность кластерных
вычислительных
систем (real applications performance – RAP) оценивается как 5–15% от их
пиковой производительности (Peak Advertised Performance, PAP). Для
сравнения:
у
лучших
малопроцессорных
систем
из
векторных процессоров это соотношение оценивается как 30–50%.
Классификация вычислительных кластеров
Назовите основные классификационные признаки, используемые при
классификации вычислительных кластеров.
Ответ
При классификации вычислительных кластеров используются следующие
основные классификационные признаки: 1)тип узловых процессоров;
2)однородность
узловых
процессоров;
3)функциональная
направленность кластеров.
1)
В
качестве узлов
вычислительного
кластера могут
использоваться персональные компьютеры, рабочие станции и SMP сервера.
Если
в
качестве
узлов кластера используются SMPсистемы,
то
такой вычислительный кластер называется
Лекция 6. Производительность параллельных вычислительных систем
- Длина полупроизводительности;
- Реальная производительность (производительность на тестах);
- Гипотеза Минского.
Важнейшими
характеристиками
любых вычислительных
машин являются их производительность и быстродействие. Часто эти
две характеристики отождествляют, но иногда используется и та и другая.
Под производительностью (performance)
понимают
количество
операций, выполняемых на данной вычислительной системе в единицу
времени. Быстродействие(speed) – величина, обратная среднему времени
выполнения одной операции.
Производительность измеряется в миллионах команд в секунду MIPS
(millions instructions per second) или миллионах операций с плавающей
запятой в секунду MFLOPS (millions floating point operations per second).
Кроме производительности важными
характеристиками
вычислительных систем являются масштабируемость вычислительной
системы (scalability)
способность вычислительной
системы к
наращиванию и сокращению ресурсов (прежде всего, производительности
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 31 из 133
и оперативной
памяти), реконфигурируемость
вычислительной
системы (programmability) – варьирование числа узлов и графа их связей,
надежность и живучесть вычислительной системы (reliability and robustness).
Хорошо масштабируемая система обеспечивает линейный рост
производительности с ростом количества процессоров в ней.
Асимптотическая производительность векторно-конвейерных
систем. Как отмечалось выше, основным признаком векторно-конвейерных
систем является
наличие конвейерных
функциональных
устройств,
содержащих рядконвейеров операций (например, конвейер сложения
вещественных чисел, конвейер умножения таких же чисел и т.п.). Поэтому
оценка производительностивекторно-конвейерных
систем основана
на
оценке производительности конвейеров операций.
Методику
оценки производительности конвейеров
операций
рассмотрим на примере конвейера операции сложения. Положим, что
имеется -ступенчатыйконвейер операции сложения и пусть все ступени
конвейера операций требуют одинакового времени выполнения . Тогда
для
выполнения
операции
сложения
векторов
,
требуется время
(1)
где
- фиксированное время запуска конвейера,
- время
"разгона" конвейера.
После запуска конвейера и его "разгона" конвейер выдает результат
через каждый такт . Т.е. максимальная скорость выдачи результатов
конвейером (максимальное быстродействие) равна
(2)
Быстродействие
конвейера
принято
называть
асимптотическим
быстродействием. Быстродействие конвейера
приближается к асимптотическомубыстродействию в случае, когда в
формуле (1) можно пренебречь слагаемыми
,
. Эта ситуация имеет
место когда длина обрабатываемых векторов много больше величин
.
При этом предполагается, что отсутствуют конфликты при обращении к
памяти.
Аналогичная ситуация имеет место для конвейеров любых операций.
Условно принято говорить, что асимптотическое быстродействие конвейера
операцийдостигается на векторах бесконечной длины.
При работе конвейера в последовательном режиме, очевидно,
максимальная скорость выдачи результатов равна
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 32 из 133
(3)
Таким
образом, конвейерная
обработка
увеличивает
производительность вычислительной системы в раз (на векторах
бесконечной длины).
Асимптотическая производительность векторно-параллельных и
многопроцессорных систем.
Методику оценки производительности векторно-параллельных систем
и MIMD-систем рассмотрим на примере операции сложения
векторов
,
на -процессорной
системе.
Время выполнения этой операции как на векторно-параллельной системе, так
на MIMD-системе можно оценить по формуле
(4)
где
- время коммуникаций,
- время
вычислений; - диаметр коммуникационной сети системы, [ ] - ближайшее
целое,
большее
A,
производительность каналов межпроцессорного обмена, [сек] - время
выполнения операции сложения двух чисел на одном процессоре системы.
Если пренебречь коммуникационными расходами, то в качестве
минимального времени выполнения операции сложения компонент ,
векторов
,
на
процессорах системы можно принять время
(
- время сложения всех компонент векторов , , а
минимальное время сложения двух компонент этих векторов). Таким
образом,
максимальная
скорость
выдачи
результатов процессорной векторно-параллельной
системой и MIMDсистемой(максимальное быстродействие) равна
(5)
Быстродействие векторно-параллельной
системы и MIMDсистемы
также
принято
называть асимптотическим
быстродействием. Быстродействие векторно-параллельной системы и MIMDсистемы приближается к асимптотическому быстродействию в случае, когда
в формуле (4) можно пренебречь коммуникационной составляющей и когда
величина n кратна количеству процессоров в системе . Заметим, что
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 33 из 133
пренебрежение коммуникационными расходами предполагает также, что
команды не конфликтуют между собой при доступе к памяти.
При
сложении
векторов , на
одном процессоре системы
максимальная скорость выдачи результатов равна, очевидно,
(6)
Таким образом, параллельное сложение векторов на векторнопараллельных и MIMD-системах увеличивает производительность максимум
в
раз.
Аналогичная ситуация имеет место при выполнении ни векторнопараллельных системах или MIMD-системах любых бинарных операций.
Длина полупроизводительности.
Важной характеристикой параллельных вычислительных систем
является величина
– длина векторов, на которых достигается
половина асимптотического
быстродействия системы.
Эта
величина
называется длиной полупроизводительности.
Смыслы
асимптотического
быстродействия
и
длины
полупроизводительности
различны. Асимптотическое
быстродействие,
главным образом, характеризует технологию изготовления ЭВМ, в то время
как длина полупроизводительности представляет собой критерий степени
параллелизма системы.
Относительная производительность различных алгоритмов на данной
параллельной
вычислительной
системе
определяется длиной
полупроизводительности.
Введем
в
рассмотрение
величину
где – средняя длина обрабатываемых векторов. Тогда
означает,
что данный алгоритм может быть эффективно распараллелен для решения на
данной вычислительной системе,
1 - означает противоположное.
Пример 1
Рассмотрим операцию перемножения двух матриц (для выполнения
которой необходима операция скалярного произведения векторов) на
параллельных вычислительных системах CYBER-205 и CRAY-1 (см. табл. 1).
Таблица 1
ЭВМ
Операция
CYBER-205
Сложение
векторов
100
102
CYBER-205
Скалярное
100
116
[MFLOPS]
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 34 из 133
произведение
CRAY-1
Перемножение
двух матриц
153
Положим, что средняя длина обрабатываемых векторов
Тогда
7
равна 100.
Т.е. для решения рассматриваемой задачи система CRAY-1 гораздо
более эффективна по сравнению с системой CYBER-205
Реальная производительность (производительность на тестах).
Существующие тестовые наборы можно разделить на три группы:
- тесты
производителей
(компаний-изготовителей компьютеров),
предназначенные, как правило, для сравнения однотипных
компьютеров, относящихся к одному семейству;
- стандартные тесты, разработанные независимыми аналитиками и
предназначенные для сравнения широкого спектра компьютеров;
- пользовательские
тесты, учитывающие специфику решаемых
пользовательских задач.
В вычислительной практике чаще всего применяют стандартные тесты.
Рассмотрим некоторые из них.
Поскольку большую часть времени выполнения программ обычно
занимают циклы, часто именно они применяются в качестве тестов. В
настоящее время наиболее известным тестом производительности является
набор тестов Linpack, который представляет собой набор программ для
решения СЛАУ методом исключения Гаусса. Основным параметром тестов
Linpack является порядок СЛАУ . Обычно используются тесты с =100 и
тесты =1000. Известно количество операций (как функция размерности
СЛАУ ), которые необходимо выполнить для решения систем линейных
алгебраических уравнений (СЛАУ) методом исключения Гаусса. Поэтому,
зная время решения задачи, легко найти производительность системы в
MFLOPS. Известный список TOP 500, включающий в себя 500 самых
высокопроизводительных компьютеров мира,
строится
на
основе
тестирования с помощью тестов Linpack.
Для MPP-систем часто используют набор тестов Linpack-parallel.
Приведем результаты исполнения теста Linpack-parallel на некоторых
параллельных системах:
- 6768-процессорный Intel Paragon - 281 GFLOPS при N = 128600;
- Cray T916 - 522 MFLOPS при N=100;
- Hitachi S3800 - 6431 MFLOPS при N=1000.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 35 из 133
Для суперкомпьютеров широко используются набор тестов NAS
parallel benchmark. Тесты представляют собой набор алгоритмов решения
некоторых задач вычислительной газодинамики и гидродинамики.
Гипотеза Минского.
Гипотеза
Минского. В -процессорной векторно-параллельной
вычислительной
системе или MIMD-вычислительной
системе,
в
которой производительностькаждого процессора равна
единице,
общая
производительность растет как
(см. рис. 1)
В
первых
параллельных
вычислительных
системах,
когда
количество процессоров было невелико, гипотеза Минского подтверждалась.
В современных системах с большим количеством процессоров имеет место
зависимость производительности от числа процессоров, показанная на рис. 1
пунктиром. Основные причины такой зависимости:
- с ростом количества процессоров растут коммуникационные расходы
(вследствие роста диаметра коммуникационной сети);
- с ростом количества процессоров растет несбалансированность их
загрузки.
Таким образом, если количество процессоров системы
превышает
величину
, то целесообразно использовать мультипрограммный режим
работы системы.
Рис. 1. К гипотезе Минского.
Основные меры производительности параллельных вычислительных
систем
Определите
основные
меры производительности параллельных
вычислительных
систем
- асимптотическое
быстродействие и длину
полупроизводительности.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 36 из 133
Ответ
Асимптотическое быстродействие параллельных вычислительных
систем - это производительность при равенстве нулю коммуникационных
затрат.
Асимптотическое
быстродействие векторно-конвейерных
систем и векторно-параллельных систем "достигается" в случае, когда
обрабатываемые векторы имеют бесконечную длину. Если векторнопараллельная система или MIMD-система имеют N процессоров, то
асимптотическое быстродействие таких систем в N раз выше
производительности их одного процессора.
Длина полупроизводительности - это длина векторов, на которых
достигается половина асимптотического быстродействия параллельной
вычислительной системы.
Смыслы асимптотического
быстродействия и длины
полупроизводительности различны. Асимптотическое быстродействие,
главным образом, характеризует технологию изготовления ЭВМ, в то время
как длина полупроизводительности представляет собой критерий степени
параллелизма системы.
Гипотеза Минского
Сформулируйте гипотезу Минского и назовите основные причины не
выполнения ее в современных параллельных вычислительных системах.
Ответ
Гипотеза Минского формулируется следующим образом.
В -процессорной векторно-параллельной
системе или MIMDвычислительной
системе,
в
которой производительность каждого процессора равна единице, общая
производительность системы растет как
.
В первых
параллельных
вычислительных
системах,
когда
количество процессоров было
невелико, гипотеза
Минского подтверждалась. В современных системах с большим
количеством процессоров имеет место явление "насыщения" - начиная с
некоторого количества процессоров производительность системы падает.
Основными причинами не выполнения гипотезы Минского в современных
параллельных вычислительных системах являются: с ростом количества
процессоров
растут
коммуникационные
расходы
(вследствие
роста диаметра коммуникационной сети); с ростом количества
процессоров растет несбалансированность их загрузки.
Лекция 7. Программное обеспечение параллельных вычислительных
систем. Классификация и основные понятия операционных систем
параллельных вычислительных систем
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 37 из 133
Классификация мультипроцессорных операционных систем
Программное обеспечение параллельных вычислительных
систем можно
разделить
на
системное программное
обеспечение (операционные системы) и инструментальное программное
обеспечение, из которого мы выделим:
- компиляторы языков программирования высокого уровня;
- анализаторы кода и выполнения;
- библиотеки прикладных программ.
Операционные
системы
для
параллельных вычислительных
систем можно
разделить
на
три
следующих
класса:
ОС мультипроцессоров (ЭВМ с
общей
памятью);
ОС мультикомпьютеров (систем
с
распределенной
памятью)
–
распределенные ОС; сетевые ОС. В данном курсе рассматриваются два
первых класса ОС для параллельных вычислительных систем.
Можно выделить следующие типы мультипроцессорных операционных
систем.
1. Каждый процессор имеет свою ОС. Такая организация
мультипроцессорных
ОС
использовалась
на
заре
развития мультипроцессоров.
В
этом
случае
всяоперативная
память статически разделяется на области по числу процессоров, каждому
процессору выделяется своя область оперативной памяти и своя копия ОС.
т.е. процессоры работают как независимые компьютеры. Для оптимизации
использования оперативной памяти возможно совместное использование
всеми процессорами одного кода ОС и раздельно хранить только копии
данных ОС - см. рис. 1, где
- процессор,
- общая память,
область памяти для хранения данных операционной системы,
обслуживающей процессор
, и прочих данных этого процессора.
При данной организации ОС каждый процессор имеет свой набор
пользовательских процессов (ПП), и возможности перераспределения
процессов между процессорами нет. Поэтому возможна ситуация, когда один
из процессоров перегружен, а остальные (или некоторые) процессоры
простаивают. Кроме того, в этом случае каждый процессор может
использовать только свою область памяти. Поэтому одному из процессоров
памяти может не хватать и он будет вынужден постоянно заниматься
свопингом, а у других процессоров может быть излишек свободной памяти.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 38 из 133
Рис. 1. К организации операционной системы мультипроцессора
«каждый процессор имеет свою ОС».
2. ОС имеет только один процессор - "хозяин". При таком способе
организации
операционной
системы мультипроцессора используется
(положим,процессором
) всего одна копия ОС (см. рис. 2).
Процессоры
выполняют
только
пользовательские процессы.
Процессор
, если у него есть свободное время, также может выполнять
пользовательские процессы.
При данной организации ОС возможно перераспределение процессов
между процессорами. Поэтому невозможна ситуация, когда один из
процессоров перегружен, а другие процессоры простаивают. Оперативная
память здесь также может перераспределяться между процессорами.
Недостатком данной организации ОС является то, что при большом
количестве процессоров процессор
может стать узким местом системы.
Таким
образом,
такая
модель
применима
только
для
небольших мультипроцессоров.
Рис. 2. К организации операционной системы мультипроцессора «ОС
имеет только один процессор».
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 39 из 133
3. ОС может иметь любой процессор. Здесь, как и в предыдущей
схеме, в оперативной памяти находится всего одна копия операционной
системы, но выполнять ее может любой из процессоров системы (см. рис. 3).
Операционную систему с такой организацией естественно использовать
на SMP-системах. При этом может быть обеспечена загрузка всех
процессоров системы, возможно перераспределение памяти между
процессорами и по сравнению с предыдущей организацией устраняется
перегрузка процессора
. Однако в системах с такой организацией узким
местом становится код ОС, поскольку любой процессор может выполнять
код ОС, но в каждый момент времени только один процессор может делать
это (реализуется с помощью блокировок). Поэтому с точки зрения
эффективности данная организация ОС также плоха, как и предыдущая
организация.
Последний недостаток рассматриваемой организации ОС в
значительной мере преодолевается расщеплением операционной системы на
такие части, как планирование вычислительных процессов, обращение
к файловой системе, обработка страничных прерываний. В этом случае
один процессор может выполнять ту часть операционной системы, которая
осуществляет планирование процессов. В это же время другой процессор
может выполнять файловую подсистему ОС и т.д. В этом случае, очевидно,
также возможны взаимные блокировки, но степень распараллеливания
работы ОС в общем случае выше.
Реализация такой операционной системы представляет собой весьма
сложное дело. Однако подобная организация ОС используется в большинстве
современныхмультипроцессоров.
Рис. 3. К организации операционной системы мультипроцессора «ОС
может иметь каждый процессор».
Заметим, что в настоящее время становится общепринятым введение в
операционные системы средств, поддерживающих мультипроцессорную
обработкуданных.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 40 из 133
Классификация операционных систем мультипроцессоров
Назовите
три
основных
класса
операционных
систем мультипроцессоров, их достоинства и недостатки. Что такое
расщепление операционной системы?
Ответ
Можно
выделить
три
следующих
класса
операционных
систем мультипроцессоров.
1.Каждый процессор имеет свою ОС. Такая организация
мультипроцессорных
ОС
использовалась
на
заре
развития мультипроцессоров.
В
этом
случае
вся оперативная
память статически разделяется на области по числу процессоров, каждому
процессору выделяется своя область оперативной памяти и своя копия ОС,
т.е. процессоры работают как независимые компьютеры.
При данной организации ОС каждый процессор имеет свой набор
пользовательских процессов, и возможности перераспределения процессов
между процессорами нет. Поэтому возможна ситуация, когда один из
процессоров перегружен, а остальные (или некоторые) процессоры
простаивают. Кроме того, в этом случае каждый процессор может
использовать только свою область памяти. Поэтому одному из процессоров
памяти может не хватать и он будет вынужден постоянно заниматься
свопингом, а у других процессоров может быть излишек свободной памяти.
2. ОС имеет только один процессор - "хозяин". При таком способе
организации операционной системы мультипроцессора используется
(положим, процессором
)
всего
одна
копия
ОС.
Процессоры
выполняют
только
пользовательские процессы.
Процессор
, если у него есть свободное время, также может выполнять
пользовательские процессы.
При
данной
организации
ОС
возможно
перераспределение процессов между процессорами. Поэтому невозможна
ситуация, когда один из процессоров перегружен, а другие процессоры
простаивают. Оперативная
память здесь
также
может
перераспределяться
между
процессорами.
Недостатком
данной
организации ОС является то, что при большом количестве процессоров
процессор
может стать узким местом системы. Таким образом, такая
модель применима только для небольших мультипроцессоров.
3. ОС может иметь любой процессор. Здесь, как и в предыдущей
схеме, в оперативной памяти находится всего одна копия операционной
системы, но выполнять ее может любой из процессоров системы.
При
этом
может
быть
обеспечена
загрузка
всех процессоров системы, возможно перераспределение памяти между
процессорами и по сравнению с предыдущей организацией устраняется
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 41 из 133
перегрузка процессора
. Однако в системах с такой организацией узким
местом становится код ОС, поскольку любой процессор может выполнять
код ОС, но в каждый момент времени только один процессор может
делать это (реализуется с помощью блокировок). Поэтому с точки зрения
эффективности данная организация ОС также плоха, как и предыдущая
организация.
Последний недостаток рассматриваемой организации ОС в
значительной мере преодолевается расщеплением операционной системы на
такие части, как планирование вычислительных процессов, обращение
к файловой системе, обработка страничных прерываний. В этом случае
один процессор может выполнять ту часть операционной системы,
которая осуществляет планирование процессов. В это же время другой
процессор может выполнять файловую подсистему ОС и т.д. В этом
случае, очевидно, также возможны взаимные блокировки, но степень
распараллеливания работы ОС в общем случае выше.
Лекция 8. Основные понятия многопроцессорных операционных
систем
ОС многопроцессорной вычислительной системы должна, прежде
всего, выполнять функции обычной операционной системы: обрабатывать
вызовы; управлять памятью; поддерживать файловую систему; управлять
устройствами ввода-вывода. Кроме того, многопроцессорная операционная
система должны выполнять ряд специфических функций. Выделим из них
четыре следующие функции, рассматриваемые в данном курсе:
- функция синхронизации параллельных процессов;
- функция коммуникации параллельных процессов;
- функция
управления распределенной
памятью (в системах
с
распределенной памятью);
- функция планирования параллельных процессов.
Отметим, что три первые функции находят непосредственное
отражение в языках программирования высокого уровня. Четвертая функция
в значительной мере определяет производительность многопроцессорной
системы.
Кроме очевидных требований надежности и производительности к ОС
многопроцессорной ЭВМ предъявляются следующие требования.
Прозрачность операционной системы – пользователь не должен
знать, где расположены те или иные ресурсы; пользователи должны
разделять ресурсы автоматически (средствами ОС).
Масштабируемость операционной системы - выход из строя
одного из процессоров системы или увеличение количества процессоров в
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 42 из 133
ней не должны приводить к отказу ОС. Для обеспечения масштабируемости
системы ни один из процессоров не должен иметь полной информации о
состоянии системы, процессоры должны принимать решения на основе
только локальной информации, не должны использоваться глобальные часы.
Центральным
понятием
операционной
системы
для многопроцессорных вычислительных систем является понятие процесса.
Процессы.
Единицы работы, между которыми операционная система
разделяет процессоры и
другие
ресурсы вычислительной
системы,
называется процессом. Любая работа вычислительной системы состоит в
выполнении некоторой программы. Поэтому можно сказать, что процесс –
это выполнение вычислительной системой некоторой системной или
прикладной программы или их фрагмента.
Каждому процессу в операционной системе соответствует контекст
процесса. Этот контекст включает в себя:
- пользовательский контекст (соответствующий программный код,
данные, размер виртуальной памяти, дескрипторы открытых файлов и
пр.);
- аппаратный контекст (содержимое регистра счетчика команд, регистра
состояния процессора, регистр указателя стека, а также содержимое
регистров общего назначения);
- системный
контекст
(состояние процесса,
идентификатор
соответствующего пользователя, идентификатор процесса и пр.).
Важно, что из-за большого объема данных контекста процесса,
переключение процессора системы с выполнения одного процесса на
выполнение другого процесса (смена контекста процесса) является
относительно дорогостоящей операцией.
Для уменьшения времени смены контекста процесса в современных ОС
(например, в ОС UNIX) наряду с понятием процесса широко используется
понятиелегковесного
процесса “light-weight
process”
или
понятие потока, нити "thread". Легковесный процесс можно определить как
подпроцесс некоторого процесса, выполняемый в контексте этого процесса см. рис. 1. Контекст процесса содержит общую для всех его легковесных
процессов информацию
виртуальная
память,
дескрипторы
открытых файлов и т.д. Остальная информация из контекста процесса
переходит в контексты его легковесных процессов.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 43 из 133
Рис. 1. К определению легковесного процесса.
Простейшим процессом является
процесс,
состоящий
из
одного легковесного процесса.
Принципиальным
является
то
обстоятельство,
что нити одного процесса выполняются в общей виртуальной памяти, т.е.
имеют равные права доступа к любым частям виртуальной памяти процесса.
Операционной системой основной ресурс вычислительной системы –
процессорное время – выделяется не процессу, а легковесному процессу.
На основе сказанного, процесс можно определить как некоторый
контекст, включающий виртуальную память и другие системные ресурсы, в
котором выполняется, по крайней мере, один легковесный процесс,
обладающий своим собственным (более простым) контекстом. ОС «знает» о
существовании двух указанных уровней контекстов и способна сравнительно
быстро изменять контекст легковесного процесса, не изменяя
общего контекста процесса. Заметим, что для синхронизации легковесных
процессов, работающих в общем контексте процесса, можно использовать
более дешевые средства, чем для синхронизации процессов.
Понятие легковесного
процесса направлено
на
организацию
вычислений в многопроцессорной вычислительной системе в случае, когда
приложение, выполняемое в рамках одного процесса, обладает внутренним
параллелизмом. Разумеется, параллельное выполнение приложения можно
организовать и на пользовательском уровне – путем создания для одного
приложения нескольких процессов для каждой из параллельных работ.
Однако при этом не учитывается тот факт, что эти процессы решают общую
задачу, а, значит, могут иметь много общего – общие данные, программные
коды, права доступа к ресурсам системы и пр. Кроме того, как отмечалось
выше, каждый процесс требует значительных системных ресурсов, которые
при такой организации параллельных вычислений неоправданно
дублируются.
Средства создания и завершения процессов.
Рассмотрим основные средства создания и завершения процессов на
примере операционной системы UNIX.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 44 из 133
Системный вызов fork. Для создания нового процесса используется
системный вызов fork. Все процессы ОС UNIX, кроме начального,
запускаемого при «раскрутке» системы, образуются при помощи системного
вызова fork. После создания процесса-потомка процесс-предок и процесспотомок начинают «жить» своей собственной жизнью, произвольным
образом изменяя свой контекст. Например, и процесс-предок, и процесспотомок могут выполнить системный вызов exec (см. ниже), приводящий к
полному изменению контекста процесса.
Системный вызов wait. Системный вызов wait используется для
синхронизации процесса-предка и процессов-потомков. Выполнение этого
системного вызова приводит к приостановке выполнения процесса-предка до
тех пор, пока не завершится выполнение какого-либо из процессов,
являющегося его потомком.
Сигналы. Сигнал - это способ информирования процесса со стороны
ядра операционной системы о происшествии некоторого события (event) в
системе, например:
- исключительная ситуация (выход за допустимые границы виртуальной
памяти, попытка записи в область виртуальной памяти, которая
доступна только для чтения и т.д.);
- ошибка в системном вызове (несуществующий системный вызов,
ошибки в параметрах системного вызова и т.д.);
- прием сообщения от другого процесса;
- нажатия
пользователем определенных клавиш на клавиатуре
терминала, связанного с процессом.
Все возможные в системе сигналы имеют уникальные номера и
идентификаторы.
С помощью системного вызова signal пользовательская программа
может осуществить «перехват» указанного в вызове сигнала – вызвать
соответствующую функцию, которая выполнит обработку этого сигнала.
Например, вызов signal(SIGFPE, error) вызовет выполнение функции error
при переполнении или делении на ноль во время выполнения операции с
плавающей запятой.
ОС Unix предоставляет возможность пользовательским процессам
направлять сигналы другим процессам. Например, системный вызов kill(PID,
signum) посылает процессу с идентификатором PID сигнал с номером signum.
Системный вызов exec. При выполнении системного вызова
exec(filename,…), где filename – имя выполняемого файла, операционная
система производит реорганизацию виртуальной памяти вызывающего
процесса, уничтожая в ней сегменты старого программного кода и образуя
новые сегменты, в которые загружаются программный код из файла filename.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 45 из 133
Лекция
9.
Операционные
системы
вычислительных систем. Планирование процессов
параллельных
Задача оптимального отображения параллельных процессов на
архитектуру многопроцессорной вычислительной системы
Важнейшей функцией операционной системы МВС является
функция планирования процессов. Задача планирования процессов является
частью задачи оптимального отображения параллельных процессов
на
архитектуру
многопроцессорной
вычислительной
системы (mapping).
Задача оптимального отображения.
Пусть
- граф некоторой прикладной задачи (точнее, используемого
алгоритма решения этой задачи). Здесь
- вершины графа,
отождествляемые
ребра
графа,
отождествляемые с информационными связями между процессами:
-
процессы
с процессами,
-
связаны информационно (точнее – процесс
информацию
сложности
процессу
).
процессов
Обозначим
,
передает
вычислительные
соответственно;
-
количество
информации в байтах, которое процесс
передает процессу
.
Положим, что имеется многопроцессорная вычислительная система с
универсальными процессорами, каждый из которых может выполнить любой
из процессов
. Пусть
- граф (возможно, циклический)
данной МВС. Здесь
- вершины графа, соответствующие
процессорам,
-
с коммуникационной сетью:
ребра
графа,
=1 означает, что имеется возможность
прямой передачи данных от процессора
возможности
процессору
нет. Производительности процессоров
соответственно. Связь
отождествляемые
;
обозначим
=0 - такой
,
,...,
,
будем описывать двумя величинами:
- латентность канала связи - время, необходимое для организации
передачи данных от процессора
процессору
;
УМКД 042-39.1.142/02-2013
время,
Редакция №1 от 03.09.2013.
Страница 46 из 133
- величина, обратная пропускной способности канала связи необходимое
для
передачи
байта
данных
от процессора
процессору
(без учета времени
).
Задачей
оптимального
отображения параллельных процессов
на процессоры
граф
называется задача оптимального отображения графа
на
задача
поиска
такого
распределения
процессов
минимизирует
вычислений).
Введем
в
по процессорам
,
некоторыйкритерий
оптимальности (обычно
- процесс
- процесс
Заметим,
рассмотрение
( * )
отображающую
назначен на выполнение процессору
которое
время
матрицу
;
не назначен на выполнение процессору
.
что
отображающая
матрица
выполняет отображение дуг
графа
Рассмотрим
в
качестве
граф
(см. рис. 1).
на дуги графа
.
примера отображение графа
не
на
Рис. 1. а) Топология информационных связей процессов Q={Q1,...,Q6} в
графе (Q,D). б) Коммуникационная сеть процессоров P={P1,...,P4} в графе
(P,C) и отображение процессов Q={Q1,...,Q6} на эту сеть.
Отображению процессов
на
сеть процессоров
, приведенное на рис. 1 выполнено с
помощью отображающей матрицы
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 47 из 133
Рис. 2.
Во
введенных
обозначениях задачу
оптимального
отображения графа
на граф
можно формализовать следующим
образом: найти отображающую матрицу
такую, что
(1)
Здесь
– критерий
оптимальности,
{ }
-
множество
допустимых отображений. Матрицу
будем называть оптимальной
отображающей матрицей.
Если
в процессе вычислений
процессы
выполняются
многократно и вычислительная сложность их меняется от итерации к
итерации, тостатическое отображение параллельных процессов на
архитектуру многопроцессорной вычислительной системы может
быть неэффективно. В этом случае задачу отображения приходится решать
многократно в ходе итераций, т.е. использовать динамическое
отображение
параллельных
процессов
на
архитектуру
многопроцессорной вычислительной системы .
Как всякая задача отображения графа на граф, задача оптимального
отображения является
-сложной. Отсюда следует, что принципиально не
существует универсальных методов решения этой задачи.
Балансировки загрузки.
Одним из распространенных способов приближенного решения задачи
оптимального отображения является метод балансировки загрузки
многопроцессорной вычислительной системы. Основная идея метода
балансировки
загрузки
состоит
в
распределении процессов по процессорам таким образом, чтобы суммарная
вычислительная и коммуникационная загрузки процессоров были примерно
одинаковы. При этом не учитываются коммуникационные загрузки
процессоров, обусловленные транзитными обменами, конфликты при
УМКД 042-39.1.142/02-2013
обменах
вследствие
организацию обменов
Редакция №1 от 03.09.2013.
Страница 48 из 133
перегрузки коммуникационной
сети,
времена
на
.
Назовем вычислительной загрузкой процессора
величину
(2)
а его коммуникационной загрузкой – величину
(3)
Тогда задачу балансировки загрузки можно записать в виде
(4)
Минимаксная задача (1), (4) формализует, в частности, компромисс между
двумя следующими тенденциями. С одной стороны, увеличение
числа процессоров, между которыми распределены вычисления, уменьшает
общее время решения задачи (до некоторого числа процессоров). С другой
стороны, распределение вычислений между многими процессорами
увеличивает коммуникационные расходы, что увеличивает общее время
решения задачи.
В общей постановке задача (1), (4) является
-сложной задачей
целочисленного нелинейного программирования. Однако хорошие
приближенные методы решения этой задачи (особенно без учета
коммуникационной загрузки процессоров) разработать проще.
В некоторых случаях задача (1), (4) может быть решена точно. Например,
если граф
представляет собой двухмерную регулярную решетку и
вычислительные
и
коммуникационные
сложности процессов
постоянны и одинаковы, то оптимальным
является разрезание этой решетки на одинаковых полос (по
числу процессоров в системе) и назначение каждой из этих полос своему
процессору. Подобная ситуация может иметь место при решении краевых
задач для ДУЧП методом конечных разностей.
Заметим, что задачи балансировки загрузки может быть поставлена не
только в терминах математического программирования, но и в других
терминах. Например, в терминах теории графов задача может быть
сформулирована следующим образом: разрезать граф
на частей
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 49 из 133
так, чтобы суммарный вес разрезанных ребер был минимальным, а
суммарные веса вершин, входящих в разрезанные части, примерно равны.
Если в графе
имеет место передача большого количества коротких
сообщений, то вместо суммарного веса разрезанных ребер следует
минимизировать число разрезанных ребер, поскольку основное время при
передаче
короткого
сообщения
тратится
на
инициализацию
самого процесса передачи данных.
Отметим особую актуальность балансировки загрузки при решении задач
на нерегулярных сетках.
Если
в процессе вычислений
процессы
выполняются
многократно и вычислительная сложность их меняется от итерации к
итерации,
тостатическая
балансировка
загрузки может
быть
неэффективной.
В
этом
случае
задачу
приходится
использовать динамическую балансировку загрузки.
Примером
задач,
для
которых статическая
балансировка
загрузки неэффективна, являются задачи моделирования горения с помощью
разностных схем. Время обработки узлов сетки, в которых интенсивно
протекают химические реакции (эти точки расположены на фронте пламени),
значительно превышает время обработки узлов сетки, в которых горения не
происходит. Если используемая конечно-разностная сетка разрезана на
равные полосы по числу процессоров в системе, то узлы сетки, которые
захвачены фронтом горения, могут оказаться локализованными на
небольшом числе процессоров и несбалансированность загрузки процессоров
может быть очень велика. Для балансировки загрузки процессоров в этом
случае необходимо перераспределять "горячие" узлы сетки между всеми
процессорами. Поскольку фронт пламени смещается в ходе решения задачи,
статически это сделать невозможно. В то же время динамическое
перераспределение узлов сетки может дать хорошие результаты.
Методы динамической балансировки загрузки различаются тем,
когда процессоры обмениваются информацией о своей текущей
загрузке,
где принимается решение о перераспределении загрузки,
когда производится перераспределение загрузки,
в соответствии с каким алгоритмом происходит перераспределение
загрузки.
Процессоры могут обмениваться информацией о своей текущей
загрузке на каждой итерации решения задачи, периодически, когда загрузка
процессора станет меньше некоторой допустимой, по появлении свободного
процессора, по отторжении процесса процессором вследствие перегрузки и
т.д.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 50 из 133
Решение о перераспределении загрузки может приниматься
централизованно (на основе глобальной информации о загрузке) и
децентрализовано (на основе только локальной информации о загрузке).
Перераспределение загрузки может происходить синхронно и
асинхронно.
В качестве алгоритмов перераспределения загрузки могут
использоваться детерминированные и стохастические алгоритмы, алгоритмы,
в которых перераспределение загрузки производится по инициативе
получателя и по инициативе отправителя и пр.
Задача балансировки
загрузки обычно
решается
программными
средствами, хотя имеются и аппаратные реализации.
Перспективно
использование нейронных
сетей для
решения
задач балансировки загрузки.
Заметим,
что
проблема
обеспечения
сбалансированной
загрузки процессоров в ходе решения задачи является одним из основных
препятствий на пути эффективного использования многопроцессорных
вычислительных систем. Несмотря на ощутимые успехи в решении задач
статической и динамической балансировки загрузки, типичный коэффициент
интегральной загрузки большинства систем массового параллелизма
составляет по разным оценкам всего от 10% до 3%. И это несмотря на
наличие алгоритмов и программ, обеспечивающих весьма высокий (часто
более 90%) коэффициент распараллеливания при решении многих задач.
Постановка задачи оптимального отображения
В терминах теории графов приведите постановку задачи оптимального
отображения параллельных процессов на архитектуру многопроцессорной
вычислительной системы.
Ответ
Пусть
граф
информационных
связей
процессов,
где
вершины
графа,
отождествляемые
с процессами,
- ребра графа, отождествляемые с
информационными
процессы
информацию
сложности
связями
между
процессами:
связаны информационно (точнее – процесс
процессу
процессов
).
Обозначим
,
информации в байтах, которое процесс
соответственно;
-
передает
вычислительные
-
передает процессу
количество
.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 51 из 133
Положим, что имеется многопроцессорная вычислительная система с
универсальными процессорами, каждый из которых может выполнить
любой
из процессов
.
Пусть
граф
(возможно,
циклический) данной МВС. Здесь
- вершины графа,
соответствующие
процессорам,
-
ребра
графа,
отождествляемые с коммуникационной сетью:
=1 означает, что
имеется
возможность
прямой
передачи
данных
от
процессора
процессору
;
=0
такой
-
нет. Производительности процессоров
соответственно. Связь
-
-
обозначим
,
,...,
,
будем описывать двумя величинами:
латентность канала
связи -
организации передачи данных от процессора
время,
возможности
время,
необходимое
процессору
для
;
- величина, обратная пропускной способности канала связи необходимое
для
передачи
байта
данных
от процессора
процессору
(без учета времени
).
Задачей
оптимального
отображения
параллельных процессов
на процессоры
называется задача оптимального отображения графа
на
граф
задача
поиска
такого
распределения
процессов
по
процессорам
,
которое
минимизирует
некоторый критерий
оптимальности (обычно
время
вычислений).
Введем в рассмотрение ( * ) отображающую матрицу ={
],
[1, ]}, компоненты
процесс
которой
имеют
следующий
назначен на выполнениепроцессору
;
назначен на выполнение процессору
.
Во
введенных
обозначениях задачу
отображения графа
на
граф
можно
следующим
что
образом:
(
).
найти
Здесь
отображающую
– критерий
множество допустимых отображений,
матрица.
,
[1,
смысл:
-
- процесс
не
оптимального
формализовать
матрицу
оптимальности,
такую,
{ }
-
- оптимальная отображающая
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 52 из 133
Балансировка загрузки
Определите понятие балансировки загрузки МВС.
Ответ
Одним из распространенных способов приближенного решения задачи
оптимального
отображения является метод
балансировки
загрузки
многопроцессорной вычислительной системы. Основная идея метода
балансировки
загрузки
состоит
в
распределении процессов по процессорам таким образом, чтобы суммарная
вычислительная и коммуникационная загрузки процессоров были примерно
одинаковы. При этом не учитываются коммуникационные загрузки
процессоров, обусловленные транзитными обменами, конфликты при
обменах
вследствие
перегрузки коммуникационной
сети,
а
также латентность коммуникационной сети.
Назовем вычислительной загрузкой процессора
величину
(1)
а его коммуникационной загрузкой – величину
(2)
Тогда задачу балансировки загрузки можно записать в виде
( )=
=
.
Поставленная минимаксная задача формализует, в частности,
компромисс между двумя следующими тенденциями. С одной стороны,
увеличение числа процессоров, между которыми распределены вычисления,
уменьшает общее время решения задачи (до некоторого числа процессоров).
С другой стороны, распределение вычислений между многими процессорами
увеличивает коммуникационные расходы, что увеличивает общее время
решения задачи.
Статическая и динамическая балансировка загрузки
Определите понятия статической балансировки загрузки и динамической
балансировки загрузки МВС
Ответ
Статической называется балансировка загрузки, при которой
распределение процессов по процессорам не меняется во время решения
задачи.
Динамической называется балансировка загрузки, при которой в процессе
решения
задачи
производится
перераспределение
процессов
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 53 из 133
по процессорам. Динамическую
балансировку
загрузки приходится
использовать
в
том
случае,
когда
в
процессе
вычислений
процессы
выполняются
многократно
и
вычислительная
сложность их меняется от итерации к итерации. Статическая
балансировка загрузки при этом может быть неэффективной.
Динамическая балансировка загрузки
Приведите
загрузки.
классификацию
методов динамической
балансировки
Ответ
Методы динамической
балансировки
загрузки различаются
тем,
когда процессоры обмениваются информацией о своей текущей загрузке, где
принимается решение о перераспределении загрузки, когда производится
перераспределение загрузки, в соответствии с каким алгоритмом происходит
перераспределение загрузки.
Процессоры могут обмениваться информацией о своей текущей загрузке
на каждой итерации решения задачи, периодически, когда загрузка процессора
станет меньше некоторой допустимой, по появлении свободного процессора, по
отторжении процесса процессором вследствие перегрузки и т.д.
Решение
о
перераспределении
загрузки
может
приниматься
централизованно (на основе глобальной информации о загрузке) и
децентрализовано (на основе только локальной информации о загрузке).
Перераспределение загрузки может происходить синхронно и асинхронно.
В
качестве
алгоритмов
перераспределения
загрузки
могут
использоваться детерминированные и стохастические алгоритмы, алгоритмы,
в которых перераспределение загрузки производится по инициативе получателя
и по инициативе отправителя и пр.
Лекция 10. Параллельные операторы. Условные операторы
Обычно в параллельных ЯВУ для векторно-конвейерных вычислительных
систем и векторно-параллельных
вычислительных
систем определены
традиционные для последовательных ЯВУ условные конструкции вида
if <E> then <S1>;
if <E> then <S1> else <S2>;
Здесь - условное выражение,
- простые или составные
операторы.
Если в условных выражениях сравниваются элементы двух
соответствующих параллельных массивов, то эти приведенные условные
конструкции вызывают параллельное исполнение операторов
, .
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 54 из 133
Пример 1
Условная конструкция (здесь и далее полагается, что все переменные
определены) на языке Actus
if a[10:90] < a[10:90 shift-1] then a[#]:=a[#]+1 else a[#]:=a[#]-1;
вызывает увеличение значений элемента
,
массива на
единицу, если он меньше своего левого соседа; иначе значение элемента
уменьшается
на
единицу.
Обработка
все
элементов
,
производится параллельно
В параллельных ЯВУ обычно определены также операторы
выбора вида
case <CS> of
<L1>: <S1>;
<L2>: <S2>;
...
<LN>: <SN>
end;
Здесь
простые или составные операторы.
Пример 2
Рассмотрим фрагмент Actus-программы с оператором выбора
type
colour = (black, white, red, brown, green);
var
flower: array[1:50] of colour;
begin
case flower [1:50] of
white: statement1;
red, green: statement2;
black, brown: statement3
end;
Программа вызывает параллельную обработку всех элементов
массива
. В зависимости от значений этих элементов параллельно
выполняются
1, 2 или 3. Например, если в массиве
имеется
по 10 элементов со значениями
,
,
,
,
, то при
исполнении программы будет параллельно выполняться десять раз
1, двадцать раз 2 и двадцать раз 3 (всего 50!)
Циклические операторы.
В параллельных ЯВУ для векторно-конвейерных вычислительных
систем и векторно-параллельных вычислительных систем определены также
традиционныеоператоры цикла вида:
while <E> do <S>;
repeat <S> until <E>;
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 55 из 133
for <INDEX> := <LOWER> by <INC> to <UPPER> do <S>;
Здесь - условное выражение, - простой или составной оператор,
INDEX – массив параметров цикла, LOWER, UPPER, INC – массивы,
содержащие нижние, верхние границы и инкременты соответствующих
параметров цикла.
Пример 3
Оператор цикла языка Actus
while a[1:50]<b[1:50] do a[#]:=a[#]+1;
производит параллельное увеличение всех 50 первых элементов
массива на единицу до тех пор, пока элемент
не станет больше или
равен элементу
Пример 4
Рассмотрим фрагмент Actus-программы
const
sq=1:50;
var
i: array [1:50] of integer;
aa: array [1:50,1..100] of real;
begin
………………..
for i[1:50]:= seq by 2 to 100 do aa[#,i[#]]:=aa[#,i[#]]+1.0;
Эта программа на каждом «витке» цикла вызывает увеличение значений
параметров цикла на 2 до тех пор, пока они не достигнут 100. После 25
«витков» цикла уровень параллелизма начнет уменьшаться:
первый «виток» ;
второй «виток» ;
………..
25-й «виток» ;
26-й «виток» , но 101-го элемента нет в массиве
………..
Лекция 11. Типы параллелизма и методы синтеза параллельных
алгоритмов
Известно громадное количество последовательных (традиционных)
методов и алгоритмов решения задач. «Приспособление» этих методов
алгоритмов для их реализации на параллельных вычислительных системах
носит
название распараллеливание (paralleling).
Отметим
особую
сложность этой задачи длявычислительных систем с распределенной
памятью.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 56 из 133
Однако чаще необходимо специально разрабатывать и обосновывать
параллельные алгоритмы. Решение этих задач является предметом новой и
бурно
развивающейся
отрасли
вычислительной
математики
—
параллельной
вычислительной
математики.
Результатами
параллельной вычислительной математики являются как эффективные
параллельные алгоритмы для решения конкретных задач, так и целые классы
принципиально новых алгоритмов, ярким представителем которых являются
нейросетевые алгоритмы. Одним из важных результатов параллельной
вычислительной математики является установление того факта, что многие
традиционные последовательные алгоритмы не имеют эффективных
параллельных аналогов.
Для последовательных вычислений лучший вычислительный алгоритм
тот, который имеет минимум арифметических операций, особенно
трудоемких (при прочих равных условиях). Однако для параллельных
вычислений важным является также учет сложности межоператорных связей
по данным и управлению. Поэтому актуальной задачей является разработка
параллельных
алгоритмов,
которые
имеют
эффективное отображение на архитектуры параллельных вычислительных
систем.
Более строго определим распараллеливание как нахождение
параллельного алгоритма решения задачи и реализация этого алгоритма на
параллельной вычислительной системе. Подчеркнем, что распараллеливание
не обязательно предполагает получение параллельного алгоритма из
последовательного алгоритма. Таким образом, мы будем понимать термин
«распараллеливание» как синоним термина «синтез параллельного
алгоритма».
Кроме распараллеливания на уровнях метода и алгоритма можно говорить
также о распараллеливании на уровне математической модели задачи, а
также на уровне программы, реализующей используемый алгоритм.
Таким
образом, распараллеливание решения
любой
задачи
многовариантно – для одной и той же математической модели можно
построить различные параллельные алгоритмы и для каждого из этих
алгоритмов – различные параллельные программы. В связи с этой
многовариантностью одной из центральных проблем в области параллельных
вычислений является проблема оценки эффективности алгоритмов для
данной параллельной вычислительной системы или для класса таких систем.
Всякий алгоритм имеет две характеристики, по которым можно судить о
его качестве: сложность алгоритма (требуемое время на вычисления);
численная устойчивость (малая чувствительность к ошибкам в исходных
данных и ошибкам округления). Алгоритм называется численно устойчивым,
если ошибки округления не превосходят ошибок в исходных данных.
УМКД 042-39.1.142/02-2013






Редакция №1 от 03.09.2013.
Страница 57 из 133
Проблема обеспечения устойчивости параллельных алгоритмов к
погрешностям в исходных данных и вычислительным погрешностям при
построении параллельных алгоритмов является более сложной и актуальной,
чем в традиционных последовательных алгоритмах. В целом, устойчивость
параллельных алгоритмов к ошибкам округления хуже, чем устойчивость
соответствующих последовательных алгоритмов.
Ранее было введено понятие зернистости или гранулированности
параллельной программы, как меры степени ее параллелизма. Наряду с этим
говорят озернистости алгоритма или степени грануляции алгоритма, как
мере степени его параллелизма.
Мелкозернистый алгоритм позволяет выделить в нем параллельные
ветви только малого объема. Напротив, крупнозернистый алгоритм,
адекватный MIMD-системам, состоит из независимых или слабо связанных
ветвей значительного объема, которые могут обрабатываться параллельно.
Крупнозернистый алгоритм часто называют крупноблочным алгоритмом.
Задача, для которой известны только мелкозернистые алгоритмы ее
решения, называется сильно связанной задачей. Напротив, задача, для
которой известен хотя бы один крупно крупнозернистый алгоритм ее
решения, называется слабо связанной задачей.
Параллельные алгоритмы, ориентированные на SIMD-вычислительные
системы и MIMD-вычислительные системы, существенно различны.
В данном разделе рассматриваются методы
и алгоритмы,
ориентированные на MIMD-системы с общей памятью или на MIMDсистемы с распределенной памятью.
В задачах можно выделить следующие типы параллелизма:
параллелизм данных;
функциональный параллелизм;
геометрический параллелизм;
алгоритмический параллелизм;
конвейерный параллелизм;
«беспорядочный» параллелизм.
Параллелизм данных
Параллелизмом данных обладают задачи, которые включают в себя
неоднократное выполнение одного и того же алгоритма с различными
исходными данными. Такие вычисления могут, очевидно, производиться
параллельно.
Если задача обладает параллелизмом данных, то соответствующую
параллельную программу (SPMD-программу) целесообразно организовать в
виде совокупности одинаковых программ, каждая из которых выполняется на
своем подчиненном процессоре, и из основной программы, которая
выполняется на мастер-процессоре (см. рис. 1). Такая программа является,
как правило, крупнозернистой.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 58 из 133
Рис. 1. К распараллеливанию на основе параллелизма данных. Q0 основная программа, Qi, i∈[1,N] - одинаковые подчиненные программы.
Распараллеливание на
основе параллелизма
данных называется декомпозицией по данным. Рассмотрим простейший
пример декомпозиции по данным.
Пусть на процессорной MIMD-вычислительной системе необходимо
выполнить сложение двух
- векторов , и получить
-вектор
. Тогдадекомпозиция по данным состоит в распределении
векторов
,
по процессам
,
элементов
выполняющимся
на процессорах
и вычислении соответствующих элементов
результирующего вектора .
Заметим, что возможны задачи, обладающие параллелизмом данных,
когда
данные
не
распределяются
мастер-процессом
по
подчиненным процессам, а генерируются самими подчиненными процессами
(например, используя генераторы случайных чисел) или вводятся ими
из внешних устройств.
Декомпозиция по данным может быть статической и динамической.
При статической декомпозиции по данным каждому процессу заранее
назначается его доля данных. При динамической декомпозиции по
данным мастер-процесс распределяет блоки данных по процессам в ходе
решения задачи по мере появления данных и освобождения
соответствующих процессоров.
Функциональный параллелизм
Функциональный параллелизм – это параллелизм групп операций,
объединенных по функциональному признаку. Распараллеливание на основе
функционального
параллелизма
называется функциональной
декомпозицией. Тривиальным примером функциональной декомпозиции
является декомпозиция задачи на три следующих подзадачи: ввод исходных
данных, обработка, вывод результатов, визуализация результатов.
Параллелизм при этом достигается параллельным выполнением трех
указанных подзадач и созданием «конвейера» (последовательного или
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 59 из 133
последовательно параллельного) между ними. Заметим, что каждая из
указанных подзадач может обладать параллелизмом данных. Приведем еще
один (менее очевидный) пример функциональной декомпозиции. Задачу
математического моделирования самолета можно разбить на подзадачи
моделирования атмосферы, фюзеляжа самолета, его левого крыла, правого
крыла и т.д.
Важно
следующее
обстоятельство.
При функциональной
декомпозиции задачи число используемых процессоров определяется числом
подзадач. Увеличить число процессоров с целью увеличения скорости
решения задачи при таком подходе затруднительно. Фактически, программа,
использующая функциональный параллелизм, не является масштабируемой.
Заметим также, что функциональная декомпозиция задачи естественным
образом используется при построении отказоустойчивых систем.
Наибольший интерес представляют масштабируемые алгоритмы, которые
преимущественно и рассматриваются в данном разделе.
Геометрический параллелизм
Геометрическим параллелизмом обладают, например, многие физические
задачи, которые описываются дифференциальными уравнениями в частных
производных (задачи механики сплошной среды, теории поля и т.п.). Такие
задачи обычно решаются конечно-разностными методами или методами
конечных элементов. Дискретные аналоги этих задач имеют локальноограниченные взаимодействия между узлами сетки, покрывающей область
решения, что позволяет разбить область решения задачи на подобласти и
вычисления в каждой из подобластей поручить отдельному процессору – см.
рис. 2.
Распараллеливание на
основе геометрического
параллелизма называется декомпозиция области решения. Декомпозиция
области решения – один из основных способов получения крупнозернистых
алгоритмов и программ.
Рис. 2. К распараллеливанию на основе декомпозиции области решения
Ω на подобласти Ωi, i∈[1,N].
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 60 из 133
Отличие геометрического параллелизма от параллелизма по данным
состоит
в
том,
что
подзадачи
обработки
каждой
из
подобластей
взаимосвязаны (требуется обмен данными между
этими подзадачами).
Декомпозиция области решения эффективна при условии, что
вычислительная сложность каждой из программ
примерно
одинакова (для однородной вычислительной системы). Кроме того, для
эффективности
декомпозиции
области
решения
программа,
выполняемая процессором
, должна использовать лишь небольшой объем
данных, расположенных на других процессорах. Желательно, что бы эти не
локальные данные были расположены на небольшом количестве соседних
процессоров. Такое свойство называется локальностью алгоритма.
Можно
выделить статическую
декомпозицию
области
решения и динамическую декомпозицию области решения. Если
вычислительные
сложности
подзадачи
обработки
каждой
из
подобластей
меняются в процессе вычислений, то статическая
декомпозиция области решения может оказаться малоэффективной. В этом
случае может быть целесообразной динамическая декомпозиция области
решения, при которой границы между подобластями
меняются в
процессе вычислений. Такая ситуация может иметь место, например, при
решении задач механики сплошной среды на адаптивных сетках.
Алгоритмическим параллелизм
Алгоритмическим параллелизмом называется параллелизм, который
выявляется путем выделения в данном алгоритме тех фрагментов, которые
могут выполняться параллельно (см. рис. 3). Алгоритмический параллелизм
редко порождает крупнозернистые параллельные алгоритмы и программы.
Синтез
параллельных
алгоритмов (распараллеливание)
на
основе алгоритмического
параллелизма называется алгоритмической
декомпозицией. При использовании алгоритмической декомпозиции
следует стремиться к разбиению задачи на крупные и редко
взаимодействующие ветви. Должно быть обеспечено, по возможности,
однородное распределение массивов по ветвям параллельного алгоритма.
Отличие алгоритмического параллелизма от функционального состоит в
том, что второй предполагает объединение только функционально близких
операторов алгоритма, в то время как первый функциональную близость
операторов не учитывает.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 61 из 133
Рис. 3. К использованию алгоритмического параллелизма. Q1, Q2, Q3 ветви алгоритма. Кружки обозначают операторы алгоритма.
Конвейерный параллелизм
Типичный пример конвейерного параллелизма представляет собой
параллелизм систем обработки видеоинформации. В таких системах
множество изображений должны проходить несколько этапов обработки. В
данном
случае
естественно
использовать конвейерную
декомпозицию задачи, когда каждый этап обработки выполняется на
отдельном процессоре.
Конвейерная декомпозиция имеет весьма ограниченное применение,
поскольку весьма редко удается организовать достаточно длинный конвейер
и обеспечить равномерную загрузку всех процессоров.
Отметим значительную общность конвейерного и функционального
параллелизма.
«Беспорядочный» параллелизм
В некоторых классах алгоритмов возможное количество параллельных
ветвей и их вычислительная сложность априори неизвестны, а определяются
особенностями конкретной задачи. Примерами алгоритмов, обладающих
«беспорядочным» параллелизмом, является алгоритм «ветвей и границ»»,
рекурсивные алгоритмы типа «разделяй и властвуй» и пр.
В этом случае новые ветви по мере их возникновения передаются
управляющим процессором обрабатывающим процессорам в соответствии с
их текущей загрузкой. При каждом таком акте необходимо в той или иной
форме решать задачу балансировки загрузки процессоров, что влечет за
собой значительные накладные расходы.
УМКД 042-39.1.142/02-2013




Редакция №1 от 03.09.2013.
Страница 62 из 133
Реструктуризация данных
Широко
известным
частным
случаем алгоритмической
декомпозиции является реструктуризация данных.
Рассмотрим задачу вычисления произведения =8 вещественных
чисел
. В простейшем случае параллельное вычисление этого
произведения можно организовать в соответствии со следующей ЯПФ
(высота ЯПФ
, ширина ЯПФ
):
Ярус 1. Вычисление произведения
;
Ярус 2. Вычисление произведения (
) ;
…
Ярус 7. Вычисление произведения (
... ) .
Если для вычислений используется > процессоров, то при
использовании такого алгоритма в каждый момент времени простаивают все
процессоры, кроме одного.
Более эффективным алгоритмом решения данной задачи является
алгоритм сдваивания, применимый к любой ассоциативной операции (
,
):
Ярус 1. Вычисление произведений
; a3a4; a5a6; a7a8;
Ярус
2.
Вычисление
произведений
;
; (a5a6)a7; (a5a6)(a7a8);
Ярус
3.
Вычисление
произведения
;
;
;
Данный алгоритм обеспечивает полную загрузку каждого из 4х процессоров на всех шагах вычислений. Синим цветом выделены лишние
числа.
Утверждение 1. Алгоритм сдваивания для вычисления произведения (или
любой другой ассоциативной операции)
элементов
обеспечивает решение задачи за
(log
) на PRAM (см. ниже) с
=
процессорами.
Примечание 1
В силу ассоциативности операции умножения, рассмотренные алгоритмы
дают одинаковые результаты в условиях точных вычислений. Однако, в
реальных условиях вычислений с погрешностями округления эти алгоритмы,
вообще говоря, дают разные результаты.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 63 из 133
Зернистость алгоритма
Дайте
определение
понятиям
"мелкозернистый
алгоритм",
"крупнозернистый алгоритм"
Ответ
Мелкозернистый алгоритм - это алгоритм, который позволяет
выделить в нем параллельные ветви только малого объема.
Напротив, крупнозернистый алгоритм, адекватный MIMD-системам,
состоит из независимых или слабо связанных ветвей значительного объема,
которые могут обрабатываться параллельно. Крупнозернистый алгоритм
часто называют крупноблочным алгоритмом
Параллелизм данных
Определите понятия "параллелизм данных", "декомпозиция по данным".
Ответ
Параллелизмом данных обладают задачи, которые включают в себя
неоднократное выполнение одного и того же алгоритма с различными
исходными данными. Такие вычисления могут, очевидно, производиться
параллельно.
Распараллеливание на
основе параллелизма
данных называется декомпозицией по данным.
Функциональный параллелизм
Дайте
определение
понятий
"функциональный
параллелизм",
"функциональная декомпозиция".
Ответ
Функциональный параллелизм – это параллелизм групп операций,
объединенных по функциональному признаку. Распараллеливание на основе
функционального параллелизма называется функциональной декомпозицией.
Примером функциональной декомпозиции является решение задачи
математического моделирования самолета путем разбиения ее на
подзадачи моделирования атмосферы, фюзеляжа самолета, его левого
крыла, правого крыла и т.д.
Геометрический параллелизм
Дайте
определение
понятий
"геометрический
параллелизм",
"декомпозиция области решения".
Ответ
Геометрическим параллелизмом обладают, например, многие физические
задачи, которые описываются дифференциальными уравнениями в частных
производных (задачи механики сплошной среды, теории поля и т.п.). Такие
задачи обычно решаются конечно-разностными методами или методами
конечных элементов. Дискретные аналоги этих задач имеют локальноограниченные взаимодействия между узлами сетки, покрывающей область
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 64 из 133
решения, что позволяет разбить область решения задачи на подобласти и
вычисления в каждой из подобластей поручить отдельному процессору.
Распараллеливание на
основе геометрического
параллелизма называется декомпозиция области решения. Декомпозиция
области решения – один из основных способов получениякрупнозернистых
алгоритмов и программ.
Лекция 12. Оценка эффективности параллельных алгоритмов.
Модели параллельных вычислений. Эффективные параллельные
алгоритмы.
При оценке эффективности параллельного алгоритма широко
используется модель абстрактной параллельной ЭВМ с общей
памятью – PRAM (Parallel Random Access Machine). Полагается, что все
N процессоров PRAM идентичны. Имеется три типа PRAM, отличающихся
моделью того, что происходит при одновременном обращении нескольких
процессоров к одной ячейке памяти:
-
модель EREW PRAM – одновременная запись и чтение из одной
ячейки запрещены;
модель CREW PRAM – разрешается одновременное чтение из одной
ячейки памяти, но не разрешается одновременная запись;
модель CRCW PRAM – разрешается как одновременное чтение из
одной ячейки памяти, так и одновременная запись.
В зависимости от способа разрешения конфликта по одновременной
записи в ячейку памяти выделяется несколько типов CRCW PRAM. В самой
слабой из моделей CRCW PRAM одновременная запись в ячейку возможна
только нулей, в наиболее сильной – результатом записи является
максимальное из записываемых чисел.
Эффективность алгоритма для PRAM определяется временем исполнения,
как
функцией
длины
входного
вектора
задачи и
количества процессоров (см. ниже).
Одной из центральных проблем науки о параллельных вычислениях
является
выделение
классов
задач,
для
решения
которых
существуют эффективные параллельные алгоритмы – алгоритмы,
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 65 из 133
которые могут быть решены на PRAM с числом процессоров
полиномиальное время. Обозначим этот класс задач
.
( ) за
Определение 1. Задача принадлежит классу задач NC, если существуют
такие константы
,
и такой алгоритм ее решения, что на PRAM с
процессорами задача может быть решена за время
Доказано,
что
каждая
следующая
из
рассмотренных
моделей PRAM может выполнить любой шаг предыдущей модели за
конечное число шагов. Доказано также, что каждый шаг наиболее сильной
модели CRCW PRAM с процессорами может быть выполнен наиболее
слабой моделью за
Утверждение 1. Класс
шагов. Отсюда следует
не зависит от модели PRAM
Можно показать, что
, где класс задач P – класс задач,
разрешимых на однопроцессорной ЭВМ за полиномиальное время.
Для многих задач класса доказана их принадлежность классу
,
например, для задачи линейного программирования. Однако до настоящего
времени вопрос о совпадении этих классов остается открытым. Заметим, что
совпадение этих классов означало бы, что любая задача, принадлежащая
классу , допускает эффективное распараллеливании.
Для оценки эффективности параллельных алгоритмов в основном
используют следующие величины:
-
средняя степень параллелизма;
ускорение параллельного алгоритма;
эффективность параллельного алгоритма.
Средняя степень параллелизма.
Средней степенью параллелизма называется отношение общего числа
операций алгоритма к высоте ЯПФ алгоритма. Например, для алгоритма
сдваивания чисел (см. параграф 1) средняя степень параллелизма равна
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 66 из 133
(поскольку общее число операций алгоритма равно
ЯПФ -
.
Идеальный
параллелизма
параллельный
алгоритм
имеет
(например, алгоритм сложения двух векторов).
, а высота
степень
Средняя степень параллелизма характеризует только сам параллельный
алгоритм. Из этой характеристики никак не следует эффективность этого
алгоритма для конкретной параллельной вычислительной системы.
Ускорение параллельного алгоритма.
Ускорение
параллельного
алгоритма является
его
наиболее
информативной характеристикой, которая показывает во сколько раз
применение параллельного алгоритма уменьшает время решения задачи по
сравнению с последовательным алгоритмом. Ускорение параллельного
алгоритма определяется величиной
(1)
где
- время выполнения алгоритма на одном процессоре,
выполнения того же алгоритма на процессорах.
- время
Идеальным, очевидно, является ускорение
. В реальности это
ускорение недостижимо. Перечислим причины невозможности достижения
идеального ускорения:
-
-
отсутствие максимального параллелизма в алгоритме;
несбалансированность
загрузки процессоров (если,
например,
необходимо сложить два вектора из 9 чисел каждый на
восьмипроцессорной системе);
временные затраты на обмен данными, конфликты в памяти и на
синхронизацию.
Пример 1
Рассмотрим в качестве примера ускорение, которое может обеспечить
алгоритм сдваивания при умножении
вещественных чисел на
-
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 67 из 133
процессорной вычислительной системе. Положим, что числа , хранятся
на первом процессоре, числа , - на втором процессоре, и т.д. Пусть –
время выполнения сложения на одном процессоре, а - время обмена одним
вещественным числом между соседними процессорами. Тогда искомое
ускорение
(2)
Заметим, что более строго в числителе формулы (2) следовало бы
написать
, а в знаменателе - (log2 -1)(1+ ). Однако, при достаточно
больших единицей в числителе и в первом из сомножителей знаменателя
можно пренебречь.
Поскольку
, из равенства (2) следует
(3)
Очевидно, идеальной ситуаций является ситуация, когда можно
пренебречь временем обмена данными, т.е. когда можно положить
.
Сравним этот случай со случаем, когда время обмена равно времени
выполнения умножения
. Из формулы (3) следует, что при
этом ускорение алгоритм сдваивания падает в два раза (см. рис. 1).
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 68 из 133
Рис. 1. К примеру 1. Зависимость ускорения алгоритма сдваивания от
числа процессоров в системе. Прямая SN=N соответствует идеальному
случаю.
Рис.1 получен с помощью следующей MATLAB – программы:
N=2:1:100;
plot(N,N);
p=log2(N);
S=(2*N)./(1+p);
hold on
plot(N,S);
hold on
S=(2/3)*(2*N)./(1+p);
plot(N,S);
hold on
S=0.5*(2*N)./(1+p);
plot(N,S);
Примечание 1
Как уже указывалось, в формуле (1) величина
- время выполнения
алгоритма на одном процессоре. Но, как мы видели, параллельный алгоритм
может содержать лишние операции по сравнению с соответствующим
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 69 из 133
последовательным алгоритмом. Т.е., вообще говоря, параллельный алгоритм
не является «хорошим» для последовательной реализации. Поэтому, более
строго, в формуле (1) в качестве величины
следует использовать время
выполнения быстрейшего последовательного алгоритма на одном процессоре
Эффективность параллельного алгоритма.
Эффективность параллельного алгоритма определяется величиной
(4)
где
- ускорение
параллельного
количество процессоров в системе.
Из того факта, что
эффективности:
алгоритма,
-
, следует ограничение сверху на величину
.
Пример 2
В условиях прим. 1 рассмотрим эффективность, которую может
обеспечить алгоритм сдваивания. Из формул (3), (4) для этого алгоритма
имеем
(5)
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 70 из 133
Рис. 2. К примеру 2. Зависимость эффективности алгоритма сдваивания
от числа процессоров в системе. Прямая EN=1 соответствует идеальному
случаю.
Рис.2 получен с помощью следующей MATLAB – программы:
N=2:1:100;
plot(N,1);
p=log2(N);
E=2./(1+p);
hold on
plot(N,E);
E=4/3./(1+p);
hold on
plot(N,E);
E=1./(1+p);
hold on
plot(N,E);
Можно выделить следующие основные причины потери эффективности
параллельных вычислений:
-
время инициализации параллельной программы (startup);
несбалансированность загрузки процессоров (load imbalance);
затраты на коммуникации (communication costs);
наличие в программе последовательных частей (serial part of the code).
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 71 из 133
Время инициализации параллельной программы – это время генерации
начальных данных (часто на одном процессоре) и рассылки результатов по
всем процессорам.
Несбалансированность загрузки процессоров приводит к тому, что часть
процессоров
вынуждена
какое-то
время
простаивать.
На
проблеме балансировки загрузки процессоров мы детально останавливались
в главе 1.3.
Затраты на коммуникации определяются пропускной способностью
коммуникационной сети, латентностью коммуникационной сети, диаметром
коммуникационной
сети (который
в
значительной
мере
определяется топологий коммуникационной сети. Коммуникационные
затраты могут быть сокращены за счет использования встречных обменов
данными и асинхронной передачи данных. Современные коммуникационные
средства параллельных вычислительных систем, а также коммуникационные
библиотеки допускают использование встречных обменов, когда данные
передаются одновременно в обе стороны. Асинхронные обмены данными
(обмены данными, выполняемые параллельно с выполнением вычислений)
также
поддерживаются
большинством
современных
параллельныхкомпьютеров, как на аппаратном, так и программном уровнях.
Закон Амдала (Amdahl).
Несколько детализируем величину
- положим
(6)
Здесь
- доля операций, выполняемых на одном процессоре - минимальный
параллелизм;
- доля операций, выполняемых на
параллелизм;
процессорах (
- доля операций, выполняемых на
параллелизм);
) – частичный
процессорах (максимальный
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 72 из 133
- время подготовки данных.
Выделим три следующих частных случая:
1.
возможно и равно
2.
т.е.
Легко видеть, что в этом случае ускорение максимально
;
Здесь ускорение равно средней степени параллелизма ,
;
Ускорение в этом случае называется законом
3.
Амдала (см. рис. 3)
(7)
4.
Рис. 3. Закон Амдала. Если всего 1% (α=0.01) операций выполняется
последовательно, то ускорение уменьшается вдвое по сравнению с
максимально возможным.
Рис.3 получен с помощью следующей MATLAB – программы:
N=1:1:100;
alpha=0.01;
S=N./(N*alpha+(1-alpha));
plot(N,S);
alpha=0.02;
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 73 из 133
S=N./(N*alpha+(1-alpha));
hold on
plot(N,S);
alpha=0.03;
S=N./(N*alpha+(1-alpha));
hold on
plot(N,S);
alpha=0.04;
S=N./(N*alpha+(1-alpha));
hold on
plot(N,S);
Из закона Амдала следует, что если, к примеру,
, т.е. всего 10%
операций программы выполняется последовательно, то при любом, как
угодно большом количестве используемых процессоров , ускорение,
превышающее 10, принципиально получить невозможно (см. табл.1).
Таблица 1
Количество процессоров
2
1.33
1.60
1.82
1.90
1.96
8
1.78
2.91
4.71
5.93
7.02
32
1.94
3.66
7.80
12.55 19.75
51
1.99
3.97
9.83
19.28 45.63
2048
2.00
3.99
9.96
19.82 48.83
Таблица 1. Предельное ускорение, как функция доли последовательных
операций в процентах и количества процессоров .
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 74 из 133
В
формуле
(7)
не
учитывается
возможный
дисбаланс
загрузки процессоров. Введем в рассмотрение коэффициент дисбаланса
загрузки процессоров
. Тогда формула (7) примет вид
(8)
Если учесть еще коммуникационные потери времени, то формула (7)
примет вид
(9)
где =
- коэффициент сетевой деградации;
, - количество
операций обмена данными и общее количество вычислительных операций,
соответственно; , - время выполнения одной операций обмена данными и
время выполнения одной вычислительной операции, соответственно.
Формула (9) определяет сетевой закон Амдала.
«Парадокс» параллелизма.
«Парадокс» параллелизма» состоит в достижении ускорения (1) и
эффективности (4) параллельного алгоритма, превышающих значения и 1,
соответственно. Другими словами, «парадокс» параллелизма состоит в
«суперлинейном» росте производительности параллельной вычислительной
системы с ростом количества ее процессоров.
«Парадокс» параллелизма, по сути, не является парадоксом. Ускорение
параллельного алгоритма, превышающее , возможно по двум основным
причинам.
1. Суммарная оперативная
память параллельной
системы
превышает
оперативную память последовательной ЭВМ, с которой производится
сравнение. Это позволяет на параллельной системе разместить всю
программу в оперативной памяти, в то время как на последовательной ЭВМ
приходится использовать выгрузку программы на накопитель на жестких
магнитных дисках («свопинг»).
2. Использование на параллельной вычислительной системе априори
параллельного алгоритма, который не может быть использован на
последовательной ЭВМ(например, снова из-за оперативной памяти).
PRAM
Дайте определение абстрактной параллельной ЭВМ с общей памятью –
PRAM (Parallel Random Access Machine).
Ответ
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 75 из 133
Абстрактная параллельная ЭВМ с общей памятью – PRAM (Parallel
Random Access Machine) имеет N идентичных процессоров и одну из трех
моделей того, что происходит при одновременном обращении нескольких
процессоров к одной ячейке памяти:
- модель EREW PRAM – одновременная запись и чтение из одной ячейки
запрещены;
- модель CREW PRAM – разрешается одновременное чтение из одной
ячейки памяти, но не разрешается одновременная запись;
- модель CRCW PRAM – разрешается как одновременное чтение из
одной ячейки памяти, так и одновременная запись.
Эффективность
алгоритма для PRAM определяется
временем
исполнения, как функцией только длины входного вектора задачи и
количества процессоров .
Эффективный параллельный алгоритм
Дайте определения понятий "эффективный параллельный алгоритм",
"класс задач NC".
Ответ
Эффективный параллельный алгоритм – это алгоритм, который может
быть выполнен на PRAM с числом процессоров ( ) за полиномиальное
время.
Задача принадлежит классу задач NC, если существуют такие
константы , и
такой
алгоритм
ее
решения,
что
на PRAM с
процессорами задача
может
быть
решена
за
время
.
Ускорение параллельного алгоритма
Дайте определение понятия "ускорение параллельного алгоритма".
Ответ
Ускорение параллельного алгоритма показывает во сколько раз
применение параллельного алгоритма уменьшает время решения задачи по
сравнению с последовательным алгоритмом. Ускорение параллельного
алгоритма определяется величиной
=
,
где
- время выполнения алгоритма на одном процессоре,
- время
выполнения того же алгоритма на процессорах.
Эффективность параллельного алгоритма
Дайте определение понятия "эффективность параллельного алгоритма".
Ответ
Эффективность параллельного алгоритма определяется величиной
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
,
где
- ускорение
параллельного
количество процессоров в системе.
Закон Амдала
Сформулируйте закон Амдала.
Ответ
Зависимость ускорения
параллельного
числа процессоров в системе N вида
Страница 76 из 133
=
алгоритма,
-
алгоритма SN от
=
называется законом Амдала. Здесь - доля операций, выполняемых на
одном процессоре.
Парадокс параллелизма
В чем состоит суть "парадокса параллелизма"?
Ответ
Парадокс» параллелизма» состоит в достижении ускорения
и эффективности параллельного алгоритма, превышающих значения и 1,
соответственно. Другими словами, «парадокс» параллелизма состоит в
«суперлинейном» росте производительности параллельной вычислительной
системы с ростом количества ее процессоров.
«Парадокс» параллелизма, по сути, не является парадоксом. Ускорение
параллельного алгоритма, превышающее , возможно по двум основным
причинам.
1. «Парадокс» параллелизма, по сути, не является парадоксом. Ускорение
параллельного алгоритма, превышающее , возможно по двум основным
причинам.
2. Использование на параллельной вычислительной системе априори
параллельного алгоритма, который не может быть использован на
последовательной ЭВМ (например, снова из-за оперативной памяти).
Лекция 13. Параллельные методы и алгоритмы линейной алгебры
Базовые алгоритмы
К базовым алгоритмам линейной алгебры относятся, прежде всего,
алгоритмы вычисления матрично-векторного произведения и алгоритмы
вычисления произведения матриц.
Матрично-векторное произведение.
УМКД 042-39.1.142/02-2013

Редакция №1 от 03.09.2013.
Страница 77 из 133
Положим, что в качестве вычислительной системы используется MIMDсистема с распределенной памятью, число процессоров в которой равно
.
Пусть -матрица
, – векторы
. Возможны два подхода к
вычислению произведения = :
использование представления произведения
в виде совокупности
скалярных произведений
(1)


где
- -я строка матрицы , а ( , ) - скалярное произведение -й
строки матрицы на вектор ;
использование линейных комбинаций столбцов матрицы
(2)

где
- -й столбец матрицы
, а
- -я компонента вектора
результатом произведения
является
представляют
собой
произведение
вектора
на скаляр
(так что
вектор, компоненты которого
соответствующих
компонент
).
.
Положим для простоты записи, что число строк
количеству процессоров в
системе,
т.е.
что
матрицы
величина
кратно
кратна
величине (так что
). Тогда схему алгоритма можно представить в
следующем виде.
1. Распределяем
по процессорам строки
матрицы и
компоненты
вектора так, как показано на Рис.1.
2. Параллельно
на
всех процессорах системы
вычисляем
скалярные
произведения соответствующих строк матрицы на вектор :
o
на процессоре
- скалярные произведения
o
на процессоре
.....;
- скалярные произведения
o
;
;
УМКД 042-39.1.142/02-2013
o
на процессоре
-
Редакция №1 от 03.09.2013.
скалярные
Страница 78 из 133
произведения
,...,
.
3. Передаем на один из процессоров все вычисленные скалярные произведения
и формируем вектор
Рис. 1. К схеме алгоритма матрично-векторного произведения,
основанного на использовании скалярных произведений.
Примечание 1
Вычисление матрично-векторного произведения редко является
самостоятельной задачей. Поэтому к моменту, когда необходимо вычислить
произведение
,
распределение
компонент
матрицы и
вектора по процессорам системы может отличаться от указанного в
первом пункте схемы алгоритма. В этом случае необходим анализ
целесообразности перераспределения этих компонент в соответствии со
схемой алгоритма. Аналогично, после вычисления произведения
может
оказаться не нужным передача всех компонент этого вектора на один
процессор
С математической точки зрения алгоритм, основанный на использовании
скалярных произведений, эквивалентен умножение матрицы на вектор в
блочной форме
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 79 из 133
(3)
где
( * )-матрицы
матрицы .
составлены
из
соответствующих
Положим для простоты записи, что число столбцов
количеству процессоров в
системе,
т.е.
что
матрицы
величина
строк
кратно
кратна
величине (так что =
). Тогда схему алгоритма можно представить в
следующем виде.
1. Распределяем
по процессорам столбцы
матрицы и
компоненты
вектора так, как показано на Рис.2.
2. Параллельно на всех процессорах системы производим следующие
вычисления:
o 1).вычисляем
скалярные произведения соответствующих столбцов
матрицы на соответствующие компоненты вектора :

на процессоре
- произведения

на процессоре
….
- произведения

;
;
o
на процессоре
- произведения
2).вычисляем суммы полученных векторов:

на процессоре
- сумму

на процессоре
- сумму

;
;
на процессоре
- сумму
.
3. Суммируем по схеме сдваивания векторы, полученные на каждом
из процессоров, либо передаем их все на один из процессоров, на котором
выполняем это суммирование
Относительно алгоритма, основанного на использовании линейных
комбинаций столбцов матрицы , справедливо замечание, аналогичное

УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 80 из 133
примеч. 1. Заметим также, что в алгоритме, основанном на использовании
скалярных произведений, каждое из произведений
(см. формулу
(3)) может быть с равным успехом вычислено с помощью алгоритма,
основанного на использовании линейных комбинаций столбцов матрицы
.
Рис. 2. К схеме алгоритма матрично-векторного произведения,
основанного на использовании линейных комбинаций столбцов
матрицы A.
Рассмотрим
методику
оценки эффективности
параллельных
алгоритмов на примере алгоритма вычисления матрично-векторного
произведения с использованием скалярных произведений.
Для простоты записи положим, что время выполнения умножения и
сложения
двух
чисел
с
плавающей
запятой
на процессорах
одинаково и равно . Положим также, что =
.
Тогда
время
вычисления
одного
скалярного
произведения
есть
и
вычислительные
затраты
каждого
из
указанных
процессоров
равны
Коммуникационные
расходы
из процессоров складываются из расходов на прием
соответствующих
векторов ,
прием компонентов
передачу
главу
компонентов результирующего вектора
каждого
компонентов
вектора и
. Таким образом (см.
1.2)
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 81 из 133
где диаметр коммуникационной сети принят равным единице, –
латентность коммуникационной сети, – длина вещественного числа в
байтах, - пропускная способность коммуникационной сети в [
].
Итого,
время
выполнения
рассматриваемого
алгоритма
на процессорах можно оценить величиной
а время выполнения алгоритма на одном процессоре - величиной
Положим, что
коммуникационной
,
сети
. Допустим, кроме того, латентность
=50*10-6[ ],
а
ее
пропускная
способность
. Заметим, что примерно такими параметрами
обладает сеть, построенная по технологии SCI, в которой для обмена
данными используется MPI. На аппаратном уровне пропускная способностью
такой сети достигает примерно 400[Мбайт/c] (при использовании в
узловом процессоре 32-разрядной шины PCI с частотой 33 МГц).
Для ускорения алгоритма в результате имеем следующее выражение
которое иллюстрирует рис. 3.
Рис. 3. Ускорение алгоритма вычисления матрично-векторного
произведения с использованием MPI.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 82 из 133
Рисунок показывает чрезвычайно низкую эффективность рассмотренного
алгоритма: на 4-х, 8-и и 16-и процессорных системах имеет место замедление
вычислений; на 64-х процессорной вычислительной системе ускорение не
превышает 3. Рисунок получен с помощью следующей MATLABпрограммы:
n=100:100:1000;
t=10*10.^(-9);
l=32;
S=50*10.^(-6);
R=80*10.^6;
N=2;
for i=1:1:5
N=N*2;
T1=2*t*n.^2;
TN=(2*t*n.^2)./N+2*S+(((n.^2)./N+n)*l)./R;
SN=T1./TN;
hold on;
plot(n,SN);
end
Влияние на ускорение пропускной способности коммуникационной
сети иллюстрирует
рис. 4,
при
построении
которого
принято,
что
(пропускная способность максимально возможная для
технологии SCI). Рисунок показывает примерно троекратное повышение
ускорения.
Заметим,
что
приведенные
оценки
эффективность
являются
упрощенными и дают только грубую оценку эффективности алгоритма.
Точная эффективность параллельного алгоритма может быть получена лишь
экспериментально - на конкретной вычислительной системе, в конкретной
среде программирования и на конкретном наборе данных.
Рис. 4. Ускорение алгоритма вычисления матрично-векторного
произведения без использования MPI.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 83 из 133
Матричное умножение.
Пусть - матрица ( * ), – матрица ( * ). Рассмотрим задачу
вычисления произведения этих матриц =
, где – матрица ( * ).
Алгоритм вычисления произведения
может быть построен на основе
рассмотрения этого произведения в виде совокупности произведений
матрицы на
столбец
матрицы
и
использовании
предыдущих
результатов данного параграфа. Однако при вычислении этого произведения
чаще используется блочное представление матриц , , .
Положим для простоты записи, что размеры матриц
кратны
числу процессоров в системе . Тогда матрицу можно представить в виде
(4)
где
,
,
равна,
,
и размерность каждого из блоков матриц
соответственно
,
,
.
Из
(4)
следует,
,
что
блок
матрицы есть сумма матричных произведений -ой строки
блоков матрицы на -й столбец блоков матрицы :
(5)
Схема параллельного алгоритма, основанного на блочном представлении
матриц.
1. Распределяем по процессорам блоки матриц , так, как показано на
рис. 5.
2. Параллельно на всех процессорах системы производим вычисление
компонент соответствующих блоков матрицы :
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 84 из 133
o
на процессоре
- блоков
блоков матрицы ;
,
[1, ], образующих первую строку
o
на процессоре
- блоков
блоков матрицы ;
….
,
[1, ], образующих второю строку
o
на процессоре
- блоков
,
[1, ], образующих строку блоков
матрицы ;
3. Передаем на один из процессоров все вычисленные блоки и формируем
матрицу (4)
o
Относительно рассмотренного алгоритма также справедливо примечание,
аналогичное примечанию 1. Заметим, кроме того, что легко предложить
множество модификаций данного алгоритма, например:
•вместо строкового распределения блоков матрицы
по процессорам,
можно использовать распределение по столбцам;
•можно использовать разбиение матриц , на блоки таким образом,
чтобы общее количество блоков было равно количеству процессоров в
системе, и каждому процессору назначать вычисление одного блока
Рассмотренная задача вычисления матрично-векторного произведения и
задача умножения матриц носят явно выраженный векторный характер и для
их решения более предпочтительным является использование векторноконвейерных ЭВМ и векторно-параллельных ЭВМ.
Рис. 5. К схеме алгоритма матричного умножения на основе блочного
представления матриц.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 85 из 133
Лекция 14. Прямые методы решения систем линейных алгебраических
уравнений. Метод исключения Гаусса
Пусть - заданная невырожденная матрица ( * ), – известный ( *1)вектор, а – неизвестный ( *1)-вектор. Рассмотрим систему линейных
алгебраических уравнений
(1)
Положим, что матрица является плотной.
Простейший вариант метода исключения Гаусса.
имеет вид:
1. Итерация 1. Полагаем
элемент
матрицы
вырожденная
расширенная
2. Если
и
. Находим в первом столбце первый ненулевой
(если такой элемент отсутствует, то матрица –
вычисления
-матрица
1, то меняем местами строки 1 и
3. Из каждого элемента -строки матрицы
т.е. полагаем
заканчиваются).
системы
(1),
матрицы
Здесь
т.е.
.
вычитаем величину
,
(2)
4.
где - -строка матрицы . При этом для всех
столбце обращается в ноль.
5. Итерация 2. В полученной матрице
первый столбец. Для оставшейся
зафиксируем первую строку и
-матрицы повторим шаги 1 – 3.
В результате получится матрица
6. Итерация 3. В матрице
столбца. Для оставшейся
элемент в первом
.
зафиксируем две первых строки и два первых
-матрицы повторим шаги 1 – 3. В
результате получится матрица
7. И т.д.
.
УМКД 042-39.1.142/02-2013
После завершения
Редакция №1 от 03.09.2013.
Страница 86 из 133
итераций система (1) преобразуется к системе вида
(3)
Заметим, что в последней формуле игнорирована перестановка элементов
вектора в результате прямого хода исключения Гаусса.
1. Итерация 1. Из
-го уравнения системы (3) имеем
(4)
2.
3. Итерация 2. Из формулы (4) и
-го уравнения системы (3) имеем
(5)
4.
5. И т.д
В вычислительной практике простейший метод исключения Гаусса
используется редко из-за его неустойчивости к вычислительным
погрешностям. Обычно используется метод исключения Гаусса с выбором
ведущего элемента. Рассмотренная схема при этом усложняется
необходимостью отыскания на каждой итерации максимального по модулю
элемента в соответствующем столбце матрицы, а также необходимостью
перестановки столбцов матрицы.
Заметим, что метод исключения Гаусса устойчив, в частности, если
матрица – симметрична и положительно определена и является матрицей с
диагональным преобладанием.
Простейший параллельный алгоритм метода исключения Гаусса.
Положим
прежде,
что
количество процессоров в MIMDсистеме с распределенной памятью равно и данные распределены по
процессорам так, как показано на рис. 1. Здесь
- -ая строка матрицы .
Схема простейшего параллельного алгоритма метода исключения Гаусса
имеет следующий вид.
1. Итерация 1. Рассылаем первую сроку матрицы
.
процессорам
,
,...,
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 87 из 133
2. По формуле (2) параллельно на каждом из процессоров
компоненты строки
матрицы
,
вычисляем
[2, ].
3. Итерация 2. Рассылаем вторую сроку матрицы
процессорам
, ,...,
.
4. По формуле (2) параллельно на каждом из процессоров
вычисляем
компоненты строки
5. И
матрицы
,
[3, ].
т.д.
6. Итерация 1. По формуле (4) на процессоре
вычисляем величину
.
7. Посылаем эту величину процессорам
, ,...,
.
8. Итерация 2. По формуле (5) на процессоре
вычисляем величину
.
9. Посылаем эту величину процессорам
, ,...,
.
10.И т. д
Рис. 1. К схеме параллельного алгоритма метода исключения Гаусса.
. Ai -i-ая строка матрицы A.
Заметим прежде, что после завершения работы рассмотренного алгоритма
все компоненты вектора окажутся на процессоре
.
Легко видеть, что рассмотренная схема простейшего алгоритма метода
исключения Гаусса порождает проблему сильной несбалансированности
загрузкипроцессоров системы. Действительно, после завершения первой
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 88 из 133
итерации прямого хода процессор
простаивает вплоть последней
итерации обратного хода. Аналогично, после завершения второй итерации
прямого хода процессор
простаивает вплоть до итерации ( -1) обратного
хода, а затем снова простаивает вплоть до завершения вычислений. И т.д.
Модификации простейшего параллельного алгоритма метода
исключения Гаусса.
Рассмотрим более реалистичную ситуацию, когда
- количество
уравнений
системы
(1)
превышает
количество процессоров в вычислительной системе. Для простоты записи
положим, что
.
Слоистая схема хранения матрицы. При этом первые
строк
матрицы можно расположить на процессоре
, вторые строк - на
процессоре
. И т.д. В данном случае первый процессор будет простаивать
после итераций, второй процессор – после 2 – итераций. И т.д. Однако в
здесь можно организовать параллельные вычисления и пересылки данных,
что несколько повышает сбалансированность загрузки процессоров. Так,
после завершения процессором
первой итерации возможно параллельное
вычисление




этим
процессором
компоненты
строки
матрицы
и
посылка строки
процессорам
, ,...,
.
Циклическая слоистая схема хранения матрицы. При этом строки
матрицы размещаются на процессорах следующим образом:
процессор
- строки 1, +1, 2 +1,…, ( -1) +1;
процессор
- строки 2, +2, 2 +2,…, ( -1) +2;
…….
процессор
- строки , +2, 2 ,…,
.
Такая
схема
хранения
практически
снимает
проблему
несбалансированности загрузки процессоров.
Все рассмотренные схемы хранения матрицы
используют хранение по
строкам. Легко получить модификации простейшего алгоритма метода
исключения Гаусса при хранении этой матрицы по столбцам.
Если является симметричной положительно определенной матрицей,
то вместо гауссового исключения часто используется разложение
Холесского, когда матриц представляется в виде =
, где - нижняя
треугольная матрица.
Для решения системы (1) также применяется представление матрицы
в
виде =
, где
– ортогональная, а – верхняя треугольная матрицы.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 89 из 133
Представление =
может быть получено с помощью преобразования
Хаусхолдера и преобразования Гивенса.
В вычислительной практике, например, при решении краевых задач для
уравнений в частных производных методом конечных разностей и методом
конечных элементов, возникают СЛАУ с разреженными (ленточными)
матрицами . Решение таких задач может быть получено с помощью метода
исключения Гаусса и упомянутых выше других прямых методов.
Разработано
также
множество
специальных
прямых
методов,
ориентированных на ленточные системы, например, блочные методы, метод
циклической редукции и пр. Отметим, что при решении ленточных СЛАУ
как на последовательных, так и на параллельных вычислительных системах,
для хранения матрицы целесообразно использовать не двумерный ( * )
массив, а совокупность одномерных массивов для хранения отличных от
нуля диагоналей матрицы , либо один одномерный массив, в котором
диагонали матрицы хранятся последовательно друг за другом.
Лекция 15. Параллельные алгоритмы интегрирования обыкновенных
дифференциальных уравнений
- Задача Коши
- Двухточечная краевая задача для уравнений второго порядка
Задача Коши
Рассмотрим задачу Коши для системы ОДУ
(1)
где
, или в векторной форме
(2)
Здесь
- вектор,
- вектор-функция.
Положим, что для системы (1) выполнены условия существования и
единственности решения. Будем полагать также, что решение системы (1)
устойчиво. Кроме того, опустим вопросы выбора шага интегрирования.
Если
вычислительная
система
содержит
небольшое
количество процессоров (несколько штук), то для параллельного решения
задачи Коши (2) можно использовать одношаговые блочные методы и
блочные методы типа предиктор-корректор, относящиеся к классу неявных
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 90 из 133
методов. Схема распараллеливания при этом тривиальна – значение
функции
в каждой точке блока вычисляется на своем процессоре.
Рассмотрим
практически
более
значимую
ситуацию,
когда многопроцессорная вычислительная система содержит значительное
количество процессоров и порядок системы (2) кратен количеству
процессоров , т.е. величина кратна величине и
Покроем интервал
равномерной сеткой с шагом
.
(см. Рис.1).
Рис. 1. Используемая сетка.
Для того, чтобы не затенить схему параллельного алгоритма деталями,
рассмотрим явный метод интегрирования Эйлера (имеющего первый порядок
точности)
Схема параллельного метода Эйлера.
1) Распределяем уравнения системы по процессорам так, как показано на
Рис.2.
2) Параллельно на всех процессорах системы вычисляем значения
соответствующих функций

на процессоре
- значения

на процессоре
-

компоненты
….

на процессоре
и компонентов вектора
:
и компоненты
значения
;
и
;
-
значения
и
компоненты
,...,
.
3) Каждый из процессоров системы посылает каждому из остальных
процессоров вычисленные компоненты вектора
.
4) Аналогично пп.2, 3 производится вычисление компонентов вектора
.
5) ….
6) Аналогично пп.2, 3 производится вычисление компонентов
вектора
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 91 из 133
Рис. 2. К схеме параллельного метода Эйлера.
Если
вычислительные
сложности
компонент
векторфункции
различны (что является типичной ситуацией), то
рассмотренная схема параллельного метода Эйлера может привести к
плохой балансировке загрузки процессоров (вычислительной загрузке). Для
преодоления
несбалансированности
следует
компоненты
векторфункции
объединить в блоки таким образом, чтобы суммарная
вычислительная сложность каждого из блоков была примерно одинакова.
Рассмотренная схема распараллеливания влечет за собой высокую
загрузку коммуникационной сети вычислительной системы. Действительно,
на каждом шаге интегрирования каждый процессор должен передать
каждому из остальных процессоров все вычисленные им компоненты
вектора . Коммуникационную загрузку процессоров системы можно
уменьшить, если при объединении компонент вектор-функции
в
блоки наряду с вычислительной сложностью этих компонент, учесть
информационные связи этих компонент между собой.
Задачу приближенно оптимального объединения компонент векторфункции
в блоки легко сформулировать в виде задачи балансировки
загрузки (см.
главу
5).
Пусть
-
вычислительная
сложность
функции
. Положим, что
(если это не так, то, возможно,
необходима динамическая
балансировка
загрузки).
Введем
в
рассмотрение коммуникационную
матрицу
системы
ОДУ (1)
,
где
компоненту вектора
рассмотрение
,
и
также
,
в
если
функция
противном случае.
отображающую
использует
Введем в
матрицу
УМКД 042-39.1.142/02-2013
где
и
, если функция
Редакция №1 от 03.09.2013.
( , ) назначена для вычисления процессору
, если эта функция не назначена процессору
Тогда
а
вычислительная
его
где - длина в
задачу балансировки
Страница 92 из 133
.
загрузка процессора
равна
загрузка
равна
коммуникационная
байтах компонент
загрузки можно
,
вектора .
записать
В
результате
в
виде
Если система (2) является жесткой, то имеется еще один резерв
повышения эффективности параллельного (так же, как и последовательного)
интегрирования этой системы – использование многоскоростного метода.
Положим, что систему (2) можно разбить на две подсистемы, жесткую и
нежесткую
(3)
где
,
. Идея многоскоростного метода состоит в
интегрировании жесткой части системы (3) с меньшим шагом, чем
нежесткой:
Здесь
,
– шаги интегрирования жесткой и нежесткой подсистем,
соответственно,
-
аппроксимация
вектора
в
точке
(поскольку значения этого вектора в точках
не
вычисляются); – коэффициент изменения величины шага интегрирования,
примерно равный отношению модулей наибольшего и наименьшего по
модулю собственных значений Якобиана системы (2).
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 93 из 133
Заметим, что аппроксимация вектора
при интегрировании жесткой
подсистемы вносит дополнительную погрешность. Поэтому для успешного
применения многоскоростного метода требуется тщательный анализ его
сходимости.
При использовании многоскоростного метода задача разбиения на блоки
усложняется, однако также может быть сведена к задаче балансировки
загрузки.
В силу невысокой точности в вычислительной практике метод
Эйлера используется
редко.
Однако
рассмотренная
схема распараллеливания с небольшими изменениями переносится как
на явные методы интегрирования ОДУ более высокого порядка, например, на
методы Рунге-Кутта, так и на неявные методы.
Двухточечная краевая задача для уравнений второго порядка
Рассмотрим двухточечную краевую задачу для системы ОДУ второго
порядка
(1)
где
- вектор,
- вектор-функция.
Положим, что для системы (1) выполнены условия существования и
единственности решения, а также что решение системы (1) устойчиво.
Опустим вопросы выбора шага интегрирования.
Основным методом решения задачи (1) является метод конечных
разностей, состоящий в аппроксимации на некоторой сетке вторых
производных конечными разностями и сведении задачи (1) к системе
линейных алгебраических уравнений относительно значений вектора
в
узлах этой сетки.
Распараллеливание метода конечных разностей может быть выполнено по
схеме, аналогичной схеме распараллеливания задачи Коши, рассмотренной в
параграфе 1. Однако если количество уравнений в задаче (1) невелико, при
этом могут быть загружены не все процессоры системы. В этом случае
рациональным может быть подход, основанный на параллельном решении
СЛАУ, полученной после дискретизации задачи (1).
Рассмотрим этот подход на примере одномерной краевой задачи
(2)
Покроем интервал
равномерной сеткой с шагом
(см. Рис.1).
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 94 из 133
Рис. 1. Используемая сетка.
Заменим вторую производную
ее конечно разностным аналогом с
использованием центральных разностей. Тогда уравнение (2) запишется в
дискретном виде
(3)
Так как
- заданные краевые условия, уравнение (3) представляет
собой
систему линейных
алгебраических
уравнений
с
неизвестными
. В матричной форме СЛАУ (3) имеет вид
(4)
где трехдиагональная
-матрица
и
-вектор
равны
(5)
Решение СЛАУ (4) может быть распараллелено методами,
рассмотренными в главе 8. Рассмотрим еще один метод решения СЛАУ вида
(4) – метод переупорядочивания неизвестных.
Метод переупорядочивания неизвестных.
Положим
для
простоты
записи
и
разобьем
узлы сетки
на
группу , содержащую
группы
по
узлов (см. Рис.2).
узлов
в
каждой
и
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 95 из 133
Рис. 2. Разбиение на группы и перенумерация узлов сетки .
Перенумеруем неизвестные
так, как показано на Рис.2
(поставив в соответствие последние номера узлам из множества ).
В результате система (4) преобразуется к виду
(6)
Здесь
трехдиагональные
одинаковые
аналогичные
матрице ;
диагональная
диагональными
элементами,
равными
(-2);
матрицы,
матрица
с
матрицы
размерности
, состоящие только из нулей и единиц;
;
- -мерные векторы, которые содержат компоненты вектора
из
групп
, соответственно (см. Рис.2);
-мерный вектор,
соответствующий группе ; векторы
состоят из компонент
вектора и организованы аналогично векторам
.
Пример 1
Пусть
(см. Рис.3).
Рис. 3. К примеру 1.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 96 из 133
Система (3) при этом приобретает вид
(7)
или в матричной форме
(8
)
Вернемся
,
В
этих
к
,
системе
обозначения
(6).
Введем
систему
(6)
обозначения
можно
записать
в
виде
или в виде
(9)
УМКД 042-39.1.142/02-2013
Положим, что матрица
из уравнений (9) на матрицу
виду
Редакция №1 от 03.09.2013.
Страница 97 из 133
невырожденная, и умножим обе части первого
. В результате система (9) преобразуется к
(10)
Вычитая из второго уравнения системы (10) первое уравнение, получим
систему линейных алгебраических уравнений относительно компонент
вектора
(11)
Если система (11) решена, то, как следует из (9), компоненты
вектора
находятся из системы линейных алгебраических уравнений
(12)
Отметим, что поскольку матрица
является блочно-диагональной
матрицей, решение системы (12) распадается на решение
независимых
систем
(13)
1.
2.
3.
4.
o
o
Схема параллельного варианта алгоритма переупорядочивания
неизвестных.
На
интервале
строим сетку
и
разбиваем
ее
узлы
на группы узлов
. Перенумеровываем узлы
сетки
и соответствующие неизвестные
. Получаем
систему линейных алгебраических уравнений вида (9).
Последовательно
на
одном процессоре системы
или
параллельно
на процессорах (см. главу 1) решаем систему линейных алгебраических
уравнений (11) – получаем вектор
.
Распределяем
по процессорам элементы
матрицы и
компоненты
векторов
так, как показано на Рис.4.
Параллельно на всех процессорах системы решаем системы линейных
алгебраических уравнений (13) – находим векторы неизвестных
:
на процессоре
- систему
;
на процессоре
- систему
;
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 98 из 133
….;
o на процессоре
- систему
.
5. Каждый из процессоров системы посылает одному из процессоров
найденные векторы неизвестных. На этой основе указанный процессор
формирует вектор
o
Рис. 4. К схеме параллельного варианта алгоритма переупорядочивания
неизвестных.
Эффективность метода
переупорядочивания
неизвестных можно
повысить, если априори известно, что матрица A симметрична и
положительно определена.
Замечание. Как уже отмечалось в главе 1, для решения ленточных систем
(в том числе, систем вида (5)) применим не только метод
переупорядочивания неизвестных, но и блочный метод, метод циклической
редукции и другие методы.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 99 из 133
3 Лабораторные занятия
Лабораторная работа №1-4
Потоки в Windows
Для создания многопоточных приложений в среде программирования
C++Builder используется абстрактный класс TThread, позволяющий
создавать отдельные потоки процесса. Для этого необходимо создать
потомка класса TThread, каждый новый потомок является новым потоком.
При организации многопоточных приложений следует придерживаться
следующих правил:
- не следует организовывать слишком много потоков, рекомендуемый
предел – 16 потоков на один процесс на однопроцессорном
компьютере,
- когда несколько потоков используют общий ресурс, они должны
синхронизироваться для избежания конфликтов.
Целью данной лабораторной работы является изучение свойств,
методов и событий класса TThread для написания простых многопоточных
приложений. Для повышения наглядности работы, потоки будут напрямую
обращаться к свойствам и методам компонентов библиотеки VCL - меткам
(Label), индикаторам процесса выполнения (ProgressBar) и кнопкам., что, вообще,
не допустимо из за потенциальной возможности возникновения проблемам
синхронизации доступа. Однако, учитывая учебный характер данных программ и
минимальную вероятность одновременного использования ресурсов, мы сделаем
допущение, что общих совместно используемых разными потоками ресурсов у нас
нет и рассматривать вопросы синхронизации в данной работе не будем.
1. КЛАСС TTHREAD
СВОЙСТВА (PROPERTIES)
FreeOnTerminate
Вид:
__property bool FreeOnTerminate = {read=FFreeOnTerminate,
write=FFreeOnTerminate, nodefault};
Опис.: Определяет, уничтожится ли автоматически объект потока при
завершении потока. Если FreeOnTerminate = истина, то объект
уничтожается автоматически, в противном случае его необходимо
уничтожать явно (delete).
void __fastcall TtestThread::Execute(){
Прим.:
int Result
FreeOnTerminate=true;
for(int i=0; i<10000; i++) Result+=sin(i);
}
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 100 из 133
Handle
Вид:
__property int Handle = {read=FHandle, nodefault};
Опис.: Возвращает дескриптор потока. Необходим при использовании
WinAPI функций.
P1->Resume();
Прим.:
int HT=P1->Handle;
Form1->Label2->Caption = IntToStr(HT);
Priority
Вид:
enum TThreadPriority {tpIdle, tpLowest, tpLower, tpNormal, tpHigher,
tpHighest, tpTimeCritical};
__property
TThreadPriority
Priority
=
{read=GetPriority,
write=SetPriority, nodefault};
Опис.: Определяет относительный приоритет потока.
P1 = new IvanovP1(true);
Прим.:
P1->Priority = tpNormal;
P1->Resume();
Suspended
Вид:
__property bool Suspended = {read=FSuspended, write=SetSuspended,
nodefault};
Опис.: Определение состояния, а также приостановка/продолжение
выполнения потока. Если Suspended = true – поток
приостанавливается. На false – продолжение выполнения.
//Остановка
выполнения
Прим.: first->Suspended=true;
потока
...
first->Suspended=false;
потока
//Продолжение
выполнения
Terminated
Вид:
__property bool Terminated = {read=FTerminated, nodefault};
Опис.: Определяет, был ли завершен поток. Метод Execute должен
периодически проверять Terminated, и выходить, если Terminated
= true. Метод Terminate устанавливает Terminated в true.
Прим.: void __fastcall TMyThread::Execute()
{
while (!Terminated){
…
}
}
ThreadID
Вид:
__property int ThreadID = {read=FThreadID, nodefault};
Опис.: Получение идентификатора потока.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 101 из 133
Прим.: int id=first->ThreadID;
МЕТОДЫ (METHODS)
DoTerminate
Вид:
virtual void __fastcall DoTerminate(void);
Опис.: Генерирует событие OnTerminate, но не завершает поток.
Execute
Вид:
virtual void __fastcall Execute(void) = 0;
Опис.: Чистый виртуальный метод. Содержит исполняемый код потока.
Прим.: void __fastcall IvanovP1::Execute()
{
float s = 0;
for(int i=0;i<N;i++){
s+= sin(i) + cos(i);
Form1->ProgressBar1->Position = i;
if(Terminated) return;
}
}
Resume
Вид:
void __fastcall Resume(void);
Опис.: Выполнение или возобновление выполнения прерванного потока.
Прим.: first->Resume();
Suspend
Вид:
void __fastcall Suspend(void);
Опис.: Приостановка выполнения потока.
Прим.: first->Suspend();
Synchronize
Вид:
typedef void __fastcall (__closure *TThreadMethod)(void);
void __fastcall Synchronize(TThreadMethod &Method);
Опис.: Выполняет вызов метода в пределах основного потока VCL.
Параметр Method имеет тип TThreadMethod (означающий
процедурный метод, не использующий никаких параметров).
Метод, передаваемый в качестве параметра Method, и является как раз
тем методом, который затем выполняется из основного потока
приложения.
Synchronize
используется
для
устранения
многопоточных конфликтов. Если нет уверенности, что какой-то
метод является потоко-безопасным, его следует запускать в
пределах главного VCL потока посредством передачи в Synchronize.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 102 из 133
Прим.: void __fastcall TMyThread::PushTheButton(void)
{
Button1->Click();
}
void __fastcall TMyThread::Execute()
{
...
Synchronize(PushTheButton);
...
}
Terminate
Вид:
void __fastcall Terminate(void);
Опис.: Устанавливает свойство Terminated в истину, сигнализируя, что
поток должен завершиться быстро, как только это возможно. В
отличие от WinAPI функции TerminateThread, которая вынуждает
поток завершиться, Terminate просто сигнализирует о
необходимости завершения.
Прим.: void __fastcall IvanovP1::Execute()
{
float s = 0;
for(int i=0;i<N;i++){
s+= sin(i) + cos(i);
Form1->ProgressBar1->Position = i;
if(Terminated)goto a1;
}
a1:; Fa = s;
}
//---------void
__fastcall
TForm1::Button5Click(TObject
*Sender)
{
P1->Terminate();
}
TThread
Вид:
__fastcall TThread(bool CreateSuspended);
Опис.: Конструктор.
Создает
образец
объекта
потока.
Если
CreateSuspended - false, метод Execute будет вызван немедленно, в
противном случае поток будет создан в приостановленном
состоянии и для его запуска необходимо вызвать метод Resume.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 103 из 133
Прим.: TMyThread *Second = new TMyThread(true); //
создать, но не запускать
Second->Priority
=
tpLower;
//
установка
приоритета ниже нормального
Second->Resume(); // запуск потока
WaitFor
Вид:
int __fastcall WaitFor(void);
Опис.: Ожидание завершения потока.
Прим.: ...
first->Resume();
first->WaitFor();
second->Resume();
...
В данном примере два потока first и second будут выполняться
последовательно. Поток second начнет выполняться только по
завершении выполнения потока first.
СОБЫТИЯ (EVENTS)
OnTerminate
Вид:
__property TNotifyEvent OnTerminate = {read=FOnTerminate,
write=FOnTerminate};
Опис.: Событие происходит после выхода из метода Execute но прежде,
чем поток будет уничтожен.
Прим.: P1->OnTerminate = ThreadDone;
2. ЗАДАНИЕ К ЛАБОРАТОРНОЙ РАБОТЕ № 1
1) Разработать программу для вычисления определенного интеграла от
заданной функции на заданном отрезке методом прямоугольников.
Программа должна разбивать отрезок на три равные части, запускать по
выбору вычисления на каждом отрезке по 10000 значений либо параллельно,
либо последовательно, обеспечивать приостановку и прерывание
вычислений, установку приоритета каждого потока,
по окончании
вычислений сложить их результаты и получить ответ.
Вариант
1
2
3
4
5
6
7
8
Функция
2
sin(x)*cos(x )
ln(x)+10*cos(x)
x2-10*x+sin(x)
2x / x3
15*cos(2*x)/ln(x)
ln(x)-2*sin(3*x)
2x – lg(x)
3*x3/sin(x)
Отрезок
[0, 10]
[0, 8]
[3, 9]
[4, 10]
[2, 8]
[3, 10]
[1, 3]
[0, 6]
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
xx – 10*sin(5*x)
9
Страница 104 из 133
[1, 4]
2) Разработать программу для сравнения эффективности двух заданных
алгоритмов сортировки путем их одновременного запуска на случайном
массиве из 50000 целых чисел. Обеспечить вывод отсортированной
последовательности в файл. Программа должна отображать ход вычислений,
допускать приостановку и прерывания вычислений.
Вариант
1
2
3
4
5
6
7
8
9
Алгоритм 1
Быстрая
Пирамидальная
Слиянием
Выбором
Быстрая
Слиянием
Пирамидальная
Обменами
Слиянием
Алгоритм 2
Обменами (пузырек)
Вставками
Быстрая
Пирамидальная
Вставками
Обменами (пузырек)
Выбором
Пирамидальная
Вставками
Лабораторная работа №5-6
Синхронизация доступа потоков к графическим компонентам.
Использование потоков в задачах имитационного моделирования.
Целью данной лабораторной работы является изучение методов
синхронизации доступа потоков к общему ресурсу (канве объекта PaintBox) с
помощью компонентов библиотеки VCL.
СИНХРОНИЗАЦИЯ ДОСТУПА
1. Метод Synchronize класса TThread
Прямой доступ к свойствам или методам компонентов библиотеки VCL
следует выполнять только из основного потока приложения. Т.е., любой код,
получающий прямой доступ или обновляющий данные пользовательского
интерфейса в приложении, должен выполняться в контексте основного потока.
В классе TThread определен метод Synchronize, который позволяет вызывать
некоторые из методов этого класса прямо из основного потока приложения.
Определение метода Synchronize имеет вид:
void __fastcall Synchronize(TThreadMethod &Method);
Параметр Method имеет тип TThreadMethod, означающий процедурный
метод, не использующий никаких параметров. Метод, передаваемый в
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 105 из 133
качестве параметра Method выполняется из основного потока приложения.
При первом создании вторичного потока в приложении, библиотека VCL
создает и далее поддерживает скрытое окно потока в контексте своего основного
потока. Единственная цель этого окна состоит в организации последовательности
вызовов процедур, выполненных посредством метода Synchronize().
2. Методы, включенные в классы VCL
Некоторые объекты библиотеки VCL (TCanvas, TGraphicsObject,
TCustomWinSocket, TInterfaceList, TThreadList) оснащены встроенным
механизмом защиты внутренних данных – методами Lock и Unlock,
базирующимися на применении критических секций Win32 API. В данной
лабораторной работе будем использовать методы Lock и Unlock класса
TCanvas для синхронизации доступа к холсту объекта PaintBox.
ЗАДАНИЕ К ЛАБОРАТОРНОЙ РАБОТЕ № 2
Разработать программу с использованием потоков для моделирования
движения окружностей внутри прямоугольника. При столкновении
окружностей со стенками и друг с другом происходит отражение по законам
упругого соударения.
Программа
должна
содержать
прямоугольник
PaintBox
с
окружностями, должна позволять задавать начальное положение
окружности, начальную скорость и направление движения, запускать и
останавливать движение. Программа должна поддерживать выбор из трех
методов синхронизации доступа к холсту: отсутствие синхронизации,
синхронизации через метод Synchronize, синхронизации через метод
Lock/Unlock.
Лабораторная работа №7-9
Средства синхронизации Windows 32
Для синхронизации процессов и потоков в Win32 предусмотрено четыре
механизма:
• критический раздел;
• исключающий семафор (объект типа mutex);
• событие (event object);
• классический семафор.
Рассмотрим отдельно каждый из этих механизмов.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 106 из 133
1. Критический раздел
Критический раздел - это часть кода, доступ к которому в данное время
имеет только один поток. Другой поток может обратиться к критическому
разделу, только когда первый выйдет из него.
Предположим, что потоки разделяют некоторые переменные или структуру
данных. Часто эти сложные переменные или структуры данных должны быть
согласованными между собой. Операционная система может прервать поток
во время обновления этих переменных. В этом случае поток, который затем
использует эти переменные, будет иметь дело с несогласованными данными.
В результате может возникнуть ситуация, приводящая к краху программы.
Средством исключения подобных ситуаций и является критический раздел.
Для работы с критическими разделами используются следующие функции:
VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection) инициализация синхронизатора типа критический раздел.
lpCriticalSection - указатель на переменную типа CRITICAL_SECTION. Тип
данных CRITICAL_SECTION является структурой, ее поля используются
только Windows.
VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection) - запрос
на вход в критический раздел.
VOID LeaveCriticalSection (LPCRITICAL_SECTION lpCriticalSection) - выход
из критического раздела.
VOID DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection) удаление критического раздела (обычно при выходе из программы).
Итак, для создания критического раздела необходимо инициализировать
структуру CRITICAL_SECTION. Создав объект CRITICAL_SECTION, мы
можем работать с ним, т.е. можем обозначить код, доступ к которому для
одновременно выполняющихся задач требуется синхронизировать. Если
один поток вошел в критический раздел, то следующий поток, вызывая
функцию EnterCriticalSection с тем же самым объектом типа
CRITICAL_SECTION, будет задержан внутри функции. Возврат произойдет
только после того, как первый поток покинет критический раздел, вызвав
функцию LeaveCriticalSection. В этот момент второй поток, задержанный в
функции EnterCriticalSection, станет владельцем критического раздела, и его
выполнение будет возобновлено.
Когда объект критический раздел больше не нужен программе, его можно
удалить с помощью функции DeleteCriticalSection. Это приведет к
освобождению всех ресурсов системы, задействованных для поддержки
объекта критический раздел.
Заметим, что возможно определение нескольких объектов типа критический
раздел. Если в программе имеется четыре потока, и два из них разделяют
одни данные, а два других - другие, то потребуется два объекта типа
критический раздел.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 107 из 133
Рассмотрим такой пример. Мы хотим записывать и считывать значения из
некоего глобального массива mas. Причем запись и считывание должны
производиться двумя разными потоками. Вполне естественно, что лучше,
если эти действия не будут выполняться одновременно. Поэтому введем
ограничение на доступ к массиву.
Листинг 1. Ограничение доступа к массиву с использованием критических
разделов
// Массив значений.
int mas[1000];
// Критическая секция, регулирующая доступ к массиву
CRITICAL_SECTION CritSec;
{
...
// Инициализируем критический раздел
InitializeCriticalSection(&CritSect);
// Запускаем потоки
Thread1 -> Resume;
Thread2 -> Resume;
... // Текст программы.
// Удаляем объект критического раздела
DeleteCriticalSection(&CritSec);
}
// Первый поток: запись в массив данных
{ // Запись значения в массив
// Запрос на вход в критический раздел
EnterCriticalSection(&CritSec);
// Выполнение кода в критическом разделе
for(int i = 0;i<1000;i++)
{
mas[i] = i;
}
// Выход из критического раздела:
// освобождаем критический раздел для доступа
// к нему других задач
LeaveCriticalSection(&CritSec);
// завершаем поток
}
// Второй поток: считывание данных из массива
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 108 из 133
{ // Считывание значений из массива
int j;
// Запрос на вход в критический раздел
EnterCriticalSection(&CritSec);
// Выполнение кода в критическом разделе
for(int i = 0;i<1000;i++)
{
j = mas[i];
}
// Выход из критического раздела:
// освобождаем критический раздел для доступа
// к нему других задач
LeaveCriticalSection(&CritSec);
}
И хотя приведенный нами пример подобного ограничения (см. листинг 1)
чрезвычайно упрощен, он хорошо иллюстрирует работу синхронизатора типа
критический раздел: пока один поток "владеет" массивом, другой доступа к
нему не имеет.
Вход в критическую секцию уже занявшим его потоком возможен любое
количество раз (столько же раз необходимо выполнить операцию выхода).
2. Исключающий семафор (mutex)
Еще один вид синхронизаторов - исключающий семафор. Основное его
отличие от критического раздела заключается в том, что последний можно
использовать только в пределах одного процесса (одного запущенного
приложения), а исключающими семафорами могут пользоваться разные
процессы. Другими словами, критические разделы - это локальные объекты,
которые доступны в рамках только одной программы, а исключающие
семафоры
могут
быть глобальными
объектами, позволяющими
синхронизировать работу программ (т. е. разные запущенные приложения
могут разделять одни и те же данные).
Рассмотрим основные функции для работы с объектами mutex.
1. Создание объекта mutex:
HANDLE
CreateMutex(LPSECURITY_ATTRIBUTES
lpMutexAttributes,
BOOL bInitialOwner, LPCTSTR lpName );
Параметры:
lpMutexAttributes - указатель на структуру SECURITY_ATTRIBUTES (в
Windows 95 данный параметр игнорируется);
bInitialOwner - указывает первоначальное состояние созданного объекта
(TRUE - объект сразу становится занятым, FALSE - объект свободен);
lpName - указывает на строку, содержащую имя объекта. Имя необходимо
для доступа к объекту других процессов, в этом случае объект становится
глобальным и им могут оперировать разные программы. Если вам не нужен
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 109 из 133
именованный объект, то укажите NULL. Функция возвращает указатель на
объект mutex. В дальнейшем этот указатель используется для управления
исключающим семафором.
2. Закрытие (уничтожение) объекта mutex :
BOOL CloseHandle(HANDLE hObject )
3. Универсальная функция запроса доступа:
DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) универсальная функция, предназначенная для запроса доступа к
синхронизирующему объекту (в данном случае к объекту mutex).
Параметры:
hHandle - указатель на синхронизирующий объект (в данном случае
передается значение, возвращенное функцией CreateMutex);
dwMilliseconds - время (в миллисекундах), в течение которого происходит
ожидание освобождения объекта mutex. Если передать значение INFINITE
(бесконечность), то функция будет ждать бесконечно долго.
Данная функция может возвращать следующие значения:
WAIT_OBJECT_0 - объект освободился;
WAIT_TIMEOUT - время ожидания освобождения прошло, а объект не
освободился;
WAIT_ABANDON - произошел отказ от объекта (т. е. процесс, владеющий
данным объектом, завершился, не освободив объект). В этом случае система
(а не "процесс-владелец") переводит объект в свободное состояние. Такое
освобождение объекта не предполагает гарантий защищенности данных;
WAIT_FAILED - произошла ошибка.
4. Освобождение объекта mutex:
BOOL ReleaseMutex(HANDLE hMutex) - освобождает объект mutex, переводя
его из занятого в свободное состояние.
Посмотрим, как выглядит наш пример c критическими разделами, если
переписать его, используя исключающие семафоры.
Листинг 2. Ограничение доступа к массиву с использованием исключающих
семафоров
// Массив значений.
int mas[1000];
// Объект, регулирующий доступ к разделяемому коду.
HANDLE CritMutex;
{
...
// Инициализируем семафор разделяемого кода.
CritMutex = CreateMutex(NULL,FALSE,NULL);
... // Текст программы.
// Закрываем объект доступа к разделяемому коду.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
CloseHandle(CritMutex);
}
// Первый поток: запись в массив данных.
{ // Запись значений в массив.
// Запрос на вход в защищенный раздел.
DWORD dw = WaitForSingleObject(CritMutex,INFINITE);
if(dw == WAIT_OBJECT_0)
{ // Если объект освобожден корректно, то
// выполнение кода в защищенном разделе.
for(int i = 0;i<1000;i++)
{
mas[i] = i;
}
// Выход из защищенного раздела:
// освобождаем объект для доступа
// к защищенному разделу других задач.
ReleaseMutex(CritMutex);
}
}
// Второй поток: считывание данных из массива.
{ // Считывание значений из массива.
int j;
// Запрос на вход в защищенный раздел.
DWORD dw = WaitForSingleObject(CritMutex,INFINITE);
if(dw == WAIT_OBJECT_0)
{ // Если объект освобожден корректно, то
// выполнение кода в защищенном разделе.
for(int i = 0;i<1000;i++)
{
j = mas[i];
}
// Выход из защищенного раздела:
// освобождаем объект для доступа
// к защищенному разделу других задач.
ReleaseMutex(CritMutex);
}
}
Страница 110 из 133
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 111 из 133
Исключающий семафор может быть занят неограниченное количество раз
одним и тем же потоком.
3. События
Рассмотрим теперь механизм событий. Объект событие может быть либо
свободным (signaled) или установленным (set), либо занятым (non-signaled)
или сброшенным (reset).
Создать объект событие можно с помощью функции:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // SD
BOOL bManualReset,
// reset type
BOOL bInitialState,
// initial state
LPCTSTR lpName
// object name
);
Первый параметр (указатель на структуру типа SECURITY_ATTRIBUTES) и
последний параметр (имя объекта событие) имеют смысл только в том
случае, когда объект событие разделяется между процессами. В случае с
одним процессом эти параметры обычно имеют значение NULL.
Значение параметра fInitial устанавливается равным TRUE, чтобы объект
событие был изначально свободным, или FALSE, чтобы он был занятым.
Параметр fManual будет описан немного позже.
Для того, чтобы сделать свободным объект событие, нужно вызвать
функцию:
SetEvent (hEvent);
Чтобы сделать объект событие занятым, нужно вызвать функцию:
ResetEvent (hEvent);
Чтобы сделать объект событие свободным, а затем сразу занятым,
вызывается функция:
PulseEvent (hEvent);
Обычно программа вызывает функцию:
WaitForSingleObject (hEvent, dwTimeOut);
где второй параметр имеет значение INFINITE. Возврат из функции
происходит немедленно, если объект событие свободен. В противном
случае поток будет приостановлен, пока событие не станет свободным.
Если параметр fManual при вызове функции SetEvent имеет значение FALSE,
то объект событие автоматически становится занятым, когда осуществляется
возврат из функции WaitForSingleObject. Освобождается только один поток.
Эта особенность позволяет избежать использования функции ResetEvent.
4. Механизм семафоров
В Win32 реализован также механизм классических семафоров. Для работы с
классическими семафорами используются следующие функции.
Функция создания объекта типа семафор:
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 112 из 133
HANDLE
CreateSemaphore(
LPSECURITY_ATTRIBUTES
lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR
lpName );
Параметры:
lpSemaphoreAttributes - указатель на структуру SECURITY_ATTRIBUTES ,
который определяет, может ли возвращаемый дескриптор наследоваться
порожденными процессами. Если NULL, то дескриптор не может
наследоваться.
lInitialCount - определяет начальное значение семафора, которое должно быть
не меньше нуля и не больше lMaximumCount. Семафор установлен, если его
значение больше нуля, и не установлен, если его значение равно нулю.
Счетчик семафора увеличивается при вызове функции ReleaseSemaphore.
lMaximumCount - определяет максимальное значение семафора;
lpName - указывает на строку, определяющую имя семафора, если NULL, то
семафор открывается без имени.
Функция возврата дескриптора существующего именованного семафора:
HANDLE OpenSemaphore(
DWORD dwDesiredAccess, // access flag
BOOL bInheritHandle,
// inherit flag
LPCTSTR lpName
// pointer to semaphore-object name
);
Функция увеличения счетчика семафора на заданное число:
BOOL
ReleaseSemaphore(
HANDLE
hSemaphore,
LONG
lReleaseCount,LPLONG lpPreviousCount );
Параметры:
hSemaphore
- дескриптор семафора;
lReleaseCount - определяет, на сколько увеличивать счетчик семафора;
lpPreviousCount - указатель на 32-битную переменную с предыдущим
значением счетчика (NULL, если предыдущее значение не требуется).
Функция WaitForSingleObject определяет, свободен ли семафор, и если он
свободен, то уменьшает значение счетчика семафора на 1, в противном
случае поток будет приостановлен, пока семафор не освободится.
Посмотрим, как выглядит пример c критическими разделами, если
переписать его, используя классические семафоры (см. листинг 3).
Листинг 3. Ограничение доступа к массиву с использованием классических
семафоров
// Массив значений.
int mas[1000];
// Семафор, регулирующий доступ к критическому разделу.
HANDLE Semaph;
{
...
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 113 из 133
// Создаем семафор;
Semaph = CreateSemaphore(NULL, 1, 1, NULL);
// Запускаем потоки
// Удаляем семафор
CloseHandle(Semaph);
}
// Первый поток: запись в массив данных.
{ // Запись значения в массив.
// Запрос на вход в критический раздел.
WaitForSingleObject(Semaph, INFINITE);
// Выполнение кода в критическом разделе.
for(int i = 0;i<1000;i++)
{
mas[i] = i;
}
// Выход из критического раздела:
// освобождаем семафор для доступа
// других задач к критическому разделу
ReleaseSemaphore(Semaph, 1, NULL);
// завершаем поток
}
// Второй поток: считывание данных из массива.
{ // Считывание значений из массива.
int j;
// Запрос на вход в критический раздел.
WaitForSingleObject(Semaph, INFINITE);
// Выполнение кода в критическом разделе.
for(int i = 0;i<1000;i++)
{
j = mas[i];
}
// Выход из критического раздела:
// освобождаем семафор для доступа
// других задач к критическому разделу
ReleaseSemaphore(Semaph, 1, NULL);
// завершаем поток
}
5. Ожидание нескольких объектов синхронизации
Функция
WaitForMultipleObjects
возвращает
выполняется одно из следующих условий:
управление,
когда
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 114 из 133
Все указанные в ней объекты находятся в свободном состоянии.
 Истек интервал ожидания.
DWORD WaitForMultipleObjects(
DWORD nCount,
// Количество дескрипторов в массиве
CONST HANDLE *lpHandles, // Массив дескрипторов
BOOL bWaitAll,
// Опция ожидания
DWORD dwMilliseconds // Интервал ожидания
);
bWaitAll определяет тип ожидания. Если он равен TRUE, то функция
возвращает управление, когда состояние всех объектов, указанных в массиве
дескрипторов установлено. Если FALSE, то возврат происходит, если хотя
бы один объект освободится. Возвращаемое значение позволяет определить,
какой именно объект вызвал возврат.
В
случае
успеха,
если
bWaitAll=TRUE,
функция
возвращает
WAIT_OBJECT_0,
если
bWaitAll=FALSE,
функция
возвращает
WAIT_OBJECT_0 + nCount – 1, где nCount – порядковый номер объекта,
вызвавшего возврат.

ЗАДАНИЕ К ЛАБОРАТОРНОЙ РАБОТЕ № 3
1. Задача об обедающих философах: на круглом столе находятся k тарелок с
едой, между которыми лежит столько же вилок, k=4,…,6. В комнате имеется
k философов, чередующих философские размышления с принятием пищи. За
каждым философом закреплена своя тарелка; для еды философу нужны две
вилки, причем он может использовать только вилки, примыкающие к его
тарелке. Требуется так синхронизировать философов, чтобы каждый из них
мог получить за ограниченное время доступ к своей тарелке. Предполагается,
что длительности еды и размышлений философа конечны, но заранее
неопределенны (могут быть выбраны случайным образом из некоторого
диапазона).
Решите задачу с использованием
а) Многопоточного приложения – синхронизация методом активного
ожидания через разделяемые логические переменные.
б) Многопоточного приложения – синхронизация методом активного
ожидания с использованием алгоритма билета.
в) Многопоточного приложения – синхронизация с помощью критических
секций TCriticalSection.
г) Нескольких процессов (приложений) – с использованием именованных
мьютексов.
Программы должны выводить на экран состояние работы и записывать
протокол работы в файл.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 115 из 133
2. Задача о производителях и потребителях: Найти все простые числа на
интервале от 2 до N, которые являются палиндромами (читаются слева
направо так же как справа налево). В этой задаче потоки-производители
записывают в кольцевой буфер некоторого размера найденные числапалиндромы, а потоки-потребители проверяют, являются ли эти числа
простыми и записывают их в файл.
Решите задачу с использованием семафорной синхронизации.
Лабораторная работа №10-11
Технология Open MP.
ВАРИАНТЫ ЗАДАНИЙ
Алгоритмы должны реализовываться с помощью распределенных
вычислений. Создается COM-сервер, содержащий объект для выполнения
элементарных действий алгоритма. Далее создается клиентская программа,
управляющая распределенными вычислениями.
1. Напишите программу для вычисления интеграла на отрезке для
заданной функции (аналогично лабораторной работе №1).
Рассмотрите следующие варианты:
a) Разбиение вручную отрезка на несколько частей и запуск вычислений в
параллельных регионах.
б) Параллельное вычисление с синхронизацией.
в) Параллельное вычисление с редукцией.
2. Напишите программу для вычисления произведения квадратных
матриц. По аналогии напишите программу поиска минимальных путей в
графе методом Флойда.
3. Параллельная сортировка
А) Сортировка транспозициями
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 116 из 133
5 | 7 | 1 | 2 | 9 | 8 | 7 | 4 | 2 | 1 | 6 | 10 | 8 | 4 | 2 | 1
0-я итерация
1 | 2 | 5 | 7 | 4 | 7 | 8 | 9 | 1 | 2 | 6 | 10 | 1 | 2 | 4 | 8
1-я итерация
1 | 2 | 4 | 5 | 7 | 7 | 1 | 2 | 8 | 9 | 1 | 2 | 6 | 10 | 4 | 8
2-я итерация
1 | 2 | 4 | 5 | 1 | 2 | 7 | 7 | 1 | 2 | 8 | 9 | 4 | 6 | 8 | 10
3-я итерация
1 | 2 | 1 | 2 | 4 | 5 | 1 | 2 | 7 | 7 | 4 | 6 | 8 | 9 | 8 | 10
4-я итерация
1 | 1 | 2 | 2 | 1 | 2 | 4 | 5 | 4 | 6 | 7 | 7 | 8 | 8 | 9 | 10
5-я итерация
1 | 1 | 1 | 2 | 2 | 2 | 4 | 4 | 5 | 6 | 7 | 7 | 8 | 8 | 9 | 10
Пример сортировки транспозициями 16-элементного массива за 6
итераций
При сортировке N-элементного массива M клиентами i-му из них на
четных итерациях передается отрезок массива из N/M элементов с номерами
(N/M)(i-1)+1,…, (N/M)i, i=1,M, на нечетных – с номерами (N/M)(i1)+1+N/(2M),…, (N/M)i+ N/(2M), i=1,M-1. После сортировки каждый клиент
возвращает обратно свою часть. При сортировке следует учитывать, что на
всех итерациях, кроме 0-й (первой хронологически) получаемая каждым
клиентом часть состоит из двух равных частей – старшей и младшей – уже
отсортированных. На рисунке приведен пример сортировки.
Б) Сортировка Шелла
Необходимо реализовать параллельную сортировку Шелла. Идея
алгоритма состоит в обмене элементов, расположенных не только рядом, но
и далеко друг от друга, что значительно сокращает общее число операций
перемещения элементов. Как пример рассматривается файл из 2n элементов.
На j-м шаге файл делится на 2j групп по 2n-j элементов в каждой, при этом
i-я группа содержит элементы (i, i+1*2n-j , i+2*2n-j , .., i+(2j -1)*2n-j ), i=1,..,
2j , j=n-1,..,1 (номер шага убывает от n-1 до 1). На каждом шаге выполняется
сортировка в каждой группе. При сортировке в каждой группе следует иметь
ввиду, что элементы с четными (нечетными) номерами образуют уже
отсортированную последовательность, то есть для сортировки группы надо
слить эти две отсортированные подпоследовательности.
В) Сортировка слиянием
Алгоритмы слияния основываются на процедуре слияния двух уже
отсортированных отрезков массива в один. При параллельной сортировке
весь процесс разбивается на итерации. На первой итерации массив
разбивается на фрагменты, общее количество которых превышает количество
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 117 из 133
клиентов в два раза. Затем каждая пара фрагментов сливается одним из
процессов, после чего фрагмент записывается в сортируемый массив. Все
следующие итерации идентичны первой за исключением уменьшения
работающих процессов вдвое на каждой из итераций. Последняя пара
фрагментов может быть слита на сервере.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 118 из 133
Лабораторная работа №12-15
Технология MPI. Распределенные вычисления.
Целью настоящей работы является освоение работы с библиотекой MPI в
среде разработки Visual C++ и исследование способов создания
параллельных программ, работающих на нескольких компьютерах,
соединенных локальной сетью и использующих обмен сообщениями для
коммуникации между своими частями, расположенными на разных рабочих
станциях сети.
Как правило, программирование для сетевых кластеров отличается от
привычной модели программирования для многозадачных систем,
построенных на базе одного или множества процессоров. Часто в таких
системах необходимо обеспечить только синхронизацию процессов, и нет
нужды задумываться об особых способах обмена информацией между ними,
т.к. данные обычно располагаются в общей разделяемой памяти. В сети
реализация такого механизма затруднительно из-за высоких накладных
расходов, связанных с необходимостью предоставлять каждому процессу
копию одной и той же разделяемой памяти для работы. Поэтому, обычно,
при программировании для сетевых кластеров используется SPMDтехнология (Single Program – Multiple Data, одна программа – множественные
данные). Идея SPMD в том, чтобы поделить большой массив информации
между одинаковыми процессами, которые будут вести обработку своей части
данных (рис. 1).
Результаты
Входные данные
ДПО 1
Процесс 1
ДДО 1
ДПО 2
ДДО 2
...
Основной
процесс
(мастер)
Процесс 2
ДПО N
ДДО N
Процесс N
ДДО – данные для обработки
ДПО – данные после обработки
Рис. 1. Схема взаимодействия частей SPMD-программы.
В случае SPMD-подхода достаточно рассылать время от времени
процессам блоки данных, которые требуют трудоемкой обработки, а затем
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 119 из 133
собирать результаты их работы. Если время обработки блока данных одной
машиной значительно больше, чем время пересылки этого блока по сети, то
сетевая кластерная система становится очень эффективной.
Именно такой подход используется в MPI. Здесь всегда есть основной
процесс, который производит распределение данных по другим машинам, а
после окончания вычислений собирает результаты и показывает их
пользователю. Обычно процесс-мастер после распределения данных также
выполняет обработку их части, чтобы использовать ресурсы системы
наиболее эффективно.
Как уже было сказано выше, MPI является стандартом обмена
сообщениями. Он обеспечивает низкоуровневые коммуникации и
синхронизацию процессов в сетевом кластере.
По сути дела, каждое сообщение представляет собой пакет
типизированных данных, который один процесс может отправить другому
процессу или группе процессов. Все сообщения обладают идентификатором
(не обязательно уникальным), который задается программистом и служит для
идентификации типа сообщения на принимающей стороне.
MPI поставляется в виде библиотеки, подключаемой к среде
программирования. Самыми распространенными являются библиотеки для
языков Си и Fortran. Также частью MPI является резидент, который
запускается на каждой машине кластера и, отвечая на запросы процессов,
позволяет им взаимодействовать в сети, а также осуществляет начальный
запуск всех процессов, участвующих в расчете и составляющих SPMDпрограмму, на указанных в файле конфигурации задачи машинах кластера.
Каждый MPI-процесс в пределах SPMD-программы уникально
идентифицируется своим номером. Допускается объединять процессы в
группы, которые могут быть вложенными. Внутри каждой группы все
процессы перенумерованы, начиная с нуля. С каждой группой ассоциирован
свой коммуникатор (уникальный идентификатор). Поэтому при
осуществлении пересылки данных необходимо указать наряду с номером
процесса и идентификатор группы, внутри которой производится эта
пересылка. Все процессы изначально содержатся в группе с
предопределенным идентификатором MPI_COMM_WORLD, который
заводится для каждой запускаемой SPMD-программы (рис. 2). Разные SPMDпрограммы не знаю о существовании друг друга и обмен данными между
ними невозможен.
Редакция №1 от 03.09.2013.
Проц. 0
Проц. 1
...
Проц.
M
...
Программа L
(MPI_COMM_WORLD)
Программа 1
(MPI_COMM_WORLD)
УМКД 042-39.1.142/02-2013
Страница 120 из 133
Проц. 0
Проц. 1
...
Проц. N
Рис 2. Нумерация процессов и коммуникаторы в MPI
Рассмотрим основные функции библиотеки. Все они возвращают целое
значение, которое либо равно константе MPI_SUCCESS, либо содержит код
произошедшей ошибки.
Перед тем, как программа сможет работать с функциями библиотеки
необходимо инициализировать MPI с помощью функции:
int MPI_Init(int *argc, char ***argv)
В качестве аргументов этой функции передаются параметры командной
строки, поступающие в функцию main().
Если процессу MPI необходимо узнать свой порядковый номер в группе,
то используется функция:
int MPI_Comm_rank (MPI_Comm, int *rank)
Ее второй параметр будет выходным, содержащим номер процесса в
указанной в первом параметре группе.
Чтобы узнать размер группы (количество процессов в ней) необходимо
применить функцию:
int MPI_Comm_size (MPI_Comm, int *ranksize)
Для окончания работы с MPI необходимо использовать функцию:
int MPI_Finalize()
Перед тем, как начать рассмотрение функций передачи/приема
сообщений, отметим, какие основные типы данных поддерживает MPI
(таблица 1).
Таблица 1. Соответствие типов в MPI и языке Cи
Тип MPI
Тип Cи
MPI_CHAR
char
MPI_BYTE
unsigned char
MPI_SHORT
short
MPI_INT
int
MPI_LONG
long
УМКД 042-39.1.142/02-2013
MPI_FLOAT
MPI_DOUBLE
MPI_UNSIGNED_CHAR
MPI_UNSIGNED_SHORT
MPI_UNSIGNED
MPI_UNSIGNED_LONG
MPI_LONG_DOUBLE
Редакция №1 от 03.09.2013.
Страница 121 из 133
float
double
unsigned char
unsigned short
unsigned int
unsigned long
long double
Для передачи сообщений в MPI используется ряд функций, которые
работают синхронно и асинхронно. В первом случае функция не возвращает
управления, пока не завершит свою работу, во втором – сразу возвращает
управление, инициировав соответствующую операцию, затем с помощью
специальных вызовов есть возможность проконтролировать ход выполнения
асинхронной посылки или приема данных.
Рассмотрим эти функции подробнее.
int MPI_Send(void* buf, int count,
MPI_Datatype datatype, int dest,
int msgtag, MPI_Comm comm)
Функция выполняет синхронную (с блокировкой) посылку сообщения с
идентификатором msgtag (идентификатор выбирается самостоятельно
программистом!), состоящего из count элементов типа datatype, процессу с
номером dest и коммуникатором comm. Все элементы сообщения
расположены подряд в буфере buf. Тип передаваемых элементов datatype
должен указываться с помощью предопределенных констант типа
(таблица 1). Разрешается передавать сообщение самому себе.
Блокировка гарантирует корректность повторного использования всех
параметров после возврата из подпрограммы. Следует специально отметить,
что возврат из подпрограммы MPI_Send не означает ни того, что сообщение
уже передано процессу dest, ни того, что сообщение покинуло процессорный
элемент, на котором выполняется процесс, выполнивший MPI_Send. В MPI
имеется ряд специальных функций посылки сообщения, устраняющих
подобную неопределенность, которые подробно описаны в литературе.
int MPI_Recv(void* buf, int count,
MPI_Datatype datatype, int source,
int msgtag, MPI_Comm comm,
MPI_Status *status)
Прием сообщения с идентификатором msgtag от процесса source с
блокировкой. Число элементов в принимаемом сообщении не должно
превосходить значения count. Если число принятых элементов меньше
значения count, то гарантируется, что в буфере buf изменятся только
элементы, соответствующие элементам принятого сообщения.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 122 из 133
Блокировка гарантирует, что после возврата из подпрограммы все
элементы сообщения приняты и расположены в буфере buf.
В
качестве
номера
процесса-отправителя
можно
указать
предопределенную константу MPI_ANY_SOURCE - признак того, что
подходит сообщение от любого процесса. В качестве идентификатора
принимаемого сообщения можно указать константу MPI_ANY_TAG признак того, что подходит сообщение с любым идентификатором.
Если процесс посылает два сообщения другому процессу, и оба эти
сообщения соответствуют одному и тому же вызову MPI_Recv, то первым
будет принято то сообщение, которое было отправлено раньше.
Параметр status содержит служебную информацию о ходе приема,
которая может быть использована в программе. status является структурой и
содержит поля: MPI_SOURCE, MPI_TAG и MPI_ERROR (источник
сообщения,
идентификатор
сообщения
и
возникшая
ошибка,
соответственно).
int MPI_Isend(void *buf, int count,
MPI_Datatype datatype, int dest,
int msgtag, MPI_Comm comm,
MPI_Request *request)
Передача сообщения, аналогичная MPI_Send, однако, возврат из
подпрограммы происходит сразу после инициализации процесса передачи
без ожидания обработки всего сообщения, находящегося в буфере buf. Это
означает, что нельзя повторно использовать данный буфер для других целей
без получения дополнительной информации о завершении данной посылки.
Окончание процесса передачи (т.е. тот момент, когда можно вновь
использовать буфер buf без опасения испортить передаваемое сообщение)
можно определить с помощью параметра request (идентификатор
асинхронной операции определенного в MPI типа MPI_Request) и процедур
MPI_Wait и MPI_Test, которые будут рассмотрены ниже.
Сообщение, отправленное любой из процедур MPI_Send и MPI_Isend,
может быть принято как функцией MPI_Recv, так и MPI_Irecv.
int MPI_Irecv(void *buf, int count,
MPI_Datatype datatype, int source,
int msgtag, MPI_Comm comm,
MPI_Request *request)
Прием сообщения, аналогичный MPI_Recv, однако возврат из
подпрограммы происходит сразу после инициализации процесса приема без
ожидания получения сообщения в буфере buf. Окончание процесса приема
можно определить с помощью параметра request и процедур MPI_Wait и
MPI_Test.
int MPI_Wait(MPI_Request *request, MPI_Status *status)
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 123 из 133
С помощью этой функции производится ожидание завершения
асинхронных процедур MPI_Isend или MPI_Irecv, ассоциированных с
идентификатором request. В случае приема, параметры сообщения
оказываются в status.
int MPI_Test(MPI_Request *request, int *flag,
MPI_Status *status)
Проверка завершенности асинхронных процедур MPI_Isend или
MPI_Irecv, ассоциированных с идентификатором request. В параметре flag
возвращает значение 1, если соответствующая операция завершена, и
значение 0 в противном случае. Если завершена процедура приема,
параметры сообщения оказываются в status. MPI_Test не блокирует
программу до окончания соответствующих операций приема/передачи, чем и
отличается от MPI_Wait.
MPI позволяет работать с некоторыми операциями коллективного
взаимодействия. В операциях коллективного взаимодействия процессов
участвуют все процессы коммуникатора. Соответствующая процедура
должна быть вызвана каждым процессом, быть может, со своим набором
параметров. Возврат из процедуры коллективного взаимодействия может
произойти в тот момент, когда участие процесса в данной операции уже
закончено. Как и для блокирующих процедур, возврат означает то, что
разрешен свободный доступ к буферу приема или посылки, но не означает ни
того, что операция завершена другими процессами, ни даже того, что она
ими начата (если это возможно по смыслу операции).
int MPI_Bcast(void *buf, int count,
MPI_Datatype datatype, int source,
MPI_Comm comm)
Рассылка сообщения от процесса source всем процессам, включая
рассылающий процесс. При возврате из процедуры содержимое буфера buf
процесса source будет скопировано в локальный буфер процесса. Значения
параметров count, datatype и source должны быть одинаковыми у всех
процессов.
int MPI_Gather(void *sbuf, int scount,
MPI_Datatype stype, void *rbuf,
int rcount, MPI_Datatype rtype,
int dest, MPI_Comm comm)
Сборка данных со всех процессов в буфере rbuf процесса dest. Каждый
процесс, включая dest, посылает содержимое своего буфера sbuf процессу
dest. Собирающий процесс сохраняет данные в буфере rbuf, располагая их в
порядке возрастания номеров процессов. Параметр rbuf имеет значение
только на собирающем процессе и на остальных игнорируется, значения
параметров count, datatype и dest должны быть одинаковыми у всех
процессов.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 124 из 133
int MPI_Scatter(void *sbuf, int scount,
MPI_Datatype stype, void *rbuf,
int rcount, MPI_Datatype rtype,
int source, MPI_Comm comm)
Обратная к MPI_Gather функция. Процесс source рассылает порции
данных из массива sbuf всем процессам группы, на которую указывает
коммуникатор comm. Можно считать, что массив sbuf делится на n равных
частей, состоящих из scount элементов типа stype, после чего i-я часть
посылается i-му процессу. На процессе source существенным являются
значений всех параметров, а на остальных процессах – только значения
параметров rbuf, rcount, rtype, source и comm. Значения параметров source и
comm должны быть одинаковыми у всех процессов.
Синхронизация MPI-процессов может быть выполнена с использованием
блокирующих процедур приема/посылки сообщений или посредством
функции, реализующей барьерную синхронизацию:
int MPI_Barrier(MPI_Comm comm)
MPI_Barrier блокирует работу процессов, вызвавших данную процедуру,
до тех пор, пока все оставшиеся процессы группы comm также не выполнят
эту процедуру.
MPI продолжает активно развиваться и совершенствовать механизмы
работы в сетевом кластере. Так, начиная с версии 2.0 [3], в MPI появилась
возможность запускать новые процессы из уже исполняющихся MPIпрограмм. Это необходимо для реализации модели обработки информации
MPMD (Multiple Program – Multiple Data ). Для этого используется
процедура:
int MPI_Comm_spawn(char *command, char *argv[],
int maxprocs, MPI_Info info,
int root, MPI_Comm comm,
MPI_Comm *intercomm,
int array_of_errcodes[])
Эта подпрограмма запускает maxprocs процессов, обозначенных
командой command с аргументами, находящимися в массиве строк argv. В
зависимости от реализации стандарта система может запустить меньшее
количество процессов или выдать ошибки при невозможности запустить
maxprocs процессов.
Нами рассмотрены самые основные функции MPI, составляющие менее
половины всех имеющихся. Для более подробного изучения данной
библиотеки можно использовать документацию по данному стандарту [1-3].
Для программирования с использованием MPI в среде Visual C++ в
Windows мы будем использовать свободно распространяемую библиотеку
WinMPI версии 1.3, которая в полной мере реализует стандарт MPI 1.1. Для
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 125 из 133
данной версии справедливо все сказанное выше за исключением
возможности динамического запуска процессов MPI.
Первым делом необходимо установить WinMPI в любую директорию (по
умолчанию это C:\WMPI1.3) Для подключения компьютера к кластеру
требуется запустить системную часть MPI одним из двух вариантов: в виде
службы или консольного приложения.
Первый вариант пригоден для ОС типа Windows NT, Windows 2000,
Windows XP и позволяет установить системную службу. Для этого
необходимо войти в папку SYSTEM\serviceNT, находящуюся в каталоге
установки MPI, и запустить командный файл install_service.bat, чтобы
зарегистрировать службу в системе. Для запуска службы можно
использовать или соответствующий апплет операционной системы или
командный файл start_service.bat. Остановка сервиса осуществляется
командным файлом stop_service.bat, а его удаление из системы –
remove_service.bat. Установка сервиса выполняется один раз, а запуск по
мере необходимости.
Второй вариант можно использовать на любой ОС семейства Windows и
он предполагает запуск консольного приложения поддержки MPI. Для этого
необходимо в папке SYSTEM\daemon запустить командный файл
verbose daemon.bat.
Для корректной работы компиляции программ, работающих с
библиотекой, в среде Visual C++ требуется наличие в каталоге проекта или в
каталоге, указанном в переменной PATH, следующих файлов: Mpi.h,
Mpi_errno.h, Mpi++.h, Mpi++P.h, cdvlibf.lib, cvwmpi.lib, binding.h. Кроме того,
необходимо подключить директивой компилятора #include заголовочный
файл mpi.h и указать в настройках линковщика библиотеку cvwmpi.lib (рис.
3).
Рис. 3. Окно настроек линковщика проекта Visual C++ .NET
Перед запуском MPI-программы необходимо создать конфигурационный
файл с именем, соответствующим имени созданного компилятором
исполняемого файла, и расширением .pg, поместив его в той же директории,
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 126 из 133
что и исполняемый файл. В конфигурационном файле предполагается
использование двух основных директив.
local <количество>
В данной директиве указывается количество процессов MPI-программы,
запускаемых на машине, откуда производится ее порождение (запуск
процесса-мастера). Реально количество запускаемых процессов на 1 больше,
т.к. процесс-мастер запускается всегда.
<IP-адрес>|<DNS-имя> <кол-во> <путь к exe-файлу>
Эта директива указывает, на какой рабочей станции сети, в каком
количестве и какой файл, относящийся к MPI-программе, запускать.
Пример:
local 1
192.168.27.5 1 c:\integral.exe
Первая строчка указывает, что на основной машине необходимо
запустить 2 (1+родительский процесс с номером 0) экземпляра процесса и на
машине с адресом 192.168.27.5 запустить 1 экземпляр процесса,
порожденного из файла integral.exe, хранящегося на ее диске C в корневом
каталоге.
Инициируется запуск MPI-процессов запуском одного exe-файла на
основной машине, все действия по порождению остальных процессов MPI
выполняет самостоятельно.
Пример выполнения лабораторной работы в Visual C++
MPI-программа вычисления определенного интеграла
Приведенная ниже программа представляет собой консольное
приложение Windows, вычисляющее определенный интеграл
100
x
0
Гаусса (прямоугольников) с шагом 10-7.
#include "mpi.h"
#include "stdio.h"
const double a=0.0;//Нижний предел
const double b=100.0;//Верхний предел
const double h=0.0000001;//Шаг интегрирования
double fnc(double x)//Интегрируемая функция
{
return x*x;
}
2
dx методом
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
int _tmain(int argc, _TCHAR* argv[])
{
int myrank, ranksize,i;
MPI_Status status;
MPI_Init(&argc, &argv);//Инициализация MPI
//Определяем свой номер в группе:
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
//Определяем размер группы:
MPI_Comm_size(MPI_COMM_WORLD, &ranksize);
double cur_a,cur_b,d_ba,cur_h;
if(!myrank)
{//Это процесс-мастер
//Определяем размер диапазона для каждого процесса:
d_ba=(b-a)/ranksize;
//Оставляем первый диапазон для мастера:
cur_a=a+d_ba;
cur_h=h;
//Рассылаем исходные данные подчиненным процессам:
for(i=1;i<ranksize;i++)
{
cur_b=cur_a+d_ba-h;
MPI_Send(&cur_a, 1, MPI_DOUBLE, i, 98,
MPI_COMM_WORLD);
MPI_Send(&cur_b, 1, MPI_DOUBLE, i, 99,
MPI_COMM_WORLD);
MPI_Send(&cur_h, 1, MPI_DOUBLE, i, 100,
MPI_COMM_WORLD);
cur_a+=d_ba;
}
cur_a=a;cur_b=a+d_ba-h;
}
else
{//Это один из подчиненных процессов
//Получаем исходные данные:
MPI_Recv(&cur_a, 1, MPI_DOUBLE, 0, 98,
MPI_COMM_WORLD,&status);
MPI_Recv(&cur_b, 1, MPI_DOUBLE, 0, 99,
MPI_COMM_WORLD,&status);
MPI_Recv(&cur_h, 1, MPI_DOUBLE, 0, 100,
MPI_COMM_WORLD,&status);
}
Страница 127 из 133
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 128 из 133
//Расчет интеграла в своем диапазоне, выполняют все
//процессы:
double s=0,s1;
printf("Process %d. A=%.4f B=%.4f h=%.10f\n",
myrank,cur_a,cur_b,cur_h);
for(cur_a+=cur_h;cur_a<=cur_b;cur_a+=cur_h)
s+=cur_h*fnc(cur_a);
if(!myrank)
{//Это процесс-мастер
//Собираем результаты расчетов:
for(i=1;i<ranksize;i++)
{
MPI_Recv(&s1, 1, MPI_DOUBLE, i, 101,
MPI_COMM_WORLD,&status);
s+=s1;
}
//Печать результата:
printf("Integral value: %.4f\n",s);
}
else
//Это подчиненный процесс, отправляем результаты
//мастеру:
MPI_Send(&s, 1, MPI_DOUBLE, 0, 101,
MPI_COMM_WORLD);
MPI_Finalize();//Завершение работы с MPI
return 0;
}
Далее приводится листинг модифицированной программы расчета
интеграла, использующей операции группового взаимодействия процессов.
#include "mpi.h"
#include "stdio.h"
const double a=0.0;//Нижний предел
const double b=100.0;//Верхний предел
const double h=0.0000001;//Шаг интегрирования
double fnc(double x)//Интегрируемая функция
{
return x*x;
}
int _tmain(int argc, _TCHAR* argv[])
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
{
int myrank, ranksize,i;
MPI_Init(&argc, &argv);//Инициализация MPI
//Определяем свой номер в группе:
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
//Определяем размер группы:
MPI_Comm_size(MPI_COMM_WORLD, &ranksize);
double cur_a,cur_b,d_ba,cur_h;
double *sbuf=NULL;
if(!myrank)
{//Это процесс-мастер
//Определяем размер диапазона для каждого процесса:
d_ba=(b-a)/ranksize;
sbuf=new double[ranksize*3];
cur_a=a;
cur_h=h;
for(i=0;i<ranksize;i++)
{
cur_b=cur_a+d_ba-h;
sbuf[i*3]=cur_a;
sbuf[i*3+1]=cur_b;
sbuf[i*3+2]=h;
cur_a+=d_ba;
}
}
double rbuf[3];
//Рассылка всем процессам, включая процесс-мастер
//начальных данных для расчета:
MPI_Scatter(sbuf,3,MPI_DOUBLE,rbuf,3,MPI_DOUBLE,0,
MPI_COMM_WORLD);
if(sbuf) delete []sbuf;
cur_a=rbuf[0];cur_b=rbuf[1];cur_h=rbuf[2];
//Расчет интеграла в своем диапазоне, выполняют все
//процессы:
double s=0;
printf("Process %d. A=%.4f B=%.4f h=%.10f\n",
myrank,cur_a,cur_b,cur_h);
for(cur_a+=cur_h;cur_a<=cur_b;cur_a+=cur_h)
s+=cur_h*fnc(cur_a);
rbuf[0]=s;
if(!myrank) sbuf=new double[ranksize];
//Собираем значения интегралов от процессов:
Страница 129 из 133
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 130 из 133
MPI_Gather(rbuf,1,MPI_DOUBLE,sbuf,1,MPI_DOUBLE,0,
MPI_COMM_WORLD);
if(!myrank)
{//Это процесс-мастер
//Суммирование интегралов, полученных каждым
//процессом:
for(i=0,s=0;i<ranksize;i++) s+=sbuf[i];
//Печать результата:
printf("Integral value: %.4f\n",s);
delete []sbuf;
}
MPI_Finalize();//Завершение работы с MPI
return 0;
}
Таким образом, программы, использующие групповые операции
получаются более короткими и более эффективными с точки зрения
передачи данных по сети.
Задания к лабораторной работе
При выполнении работы по одному из выбранных заданий, варианты
которых даны в следующем разделе, необходимо разработать параллельную
программу, провести сравнение времени вычислений при разном количестве
процессов. Отчет о работе, который должен содержать:
 постановку задачи;
 описание параллельного алгоритма;
 листинг программы;
 результаты
работы,
сравнительные
характеристики
работы
программы для нескольких процессов.
1. Параллельная сортировка
А) Сортировка транспозициями
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 131 из 133
5 | 7 | 1 | 2 | 9 | 8 | 7 | 4 | 2 | 1 | 6 | 10 | 8 | 4 | 2 | 1
0-я итерация
1 | 2 | 5 | 7 | 4 | 7 | 8 | 9 | 1 | 2 | 6 | 10 | 1 | 2 | 4 | 8
1-я итерация
1 | 2 | 4 | 5 | 7 | 7 | 1 | 2 | 8 | 9 | 1 | 2 | 6 | 10 | 4 | 8
2-я итерация
1 | 2 | 4 | 5 | 1 | 2 | 7 | 7 | 1 | 2 | 8 | 9 | 4 | 6 | 8 | 10
3-я итерация
1 | 2 | 1 | 2 | 4 | 5 | 1 | 2 | 7 | 7 | 4 | 6 | 8 | 9 | 8 | 10
4-я итерация
1 | 1 | 2 | 2 | 1 | 2 | 4 | 5 | 4 | 6 | 7 | 7 | 8 | 8 | 9 | 10
5-я итерация
1 | 1 | 1 | 2 | 2 | 2 | 4 | 4 | 5 | 6 | 7 | 7 | 8 | 8 | 9 | 10
Пример сортировки транспозициями 16-элементного массива за 6
итераций
При сортировке N-элементного массива M клиентами i-му из них на
четных итерациях передается отрезок массива из N/M элементов с номерами
(N/M)(i-1)+1,…, (N/M)i, i=1,M, на нечетных – с номерами (N/M)(i1)+1+N/(2M),…, (N/M)i+ N/(2M), i=1,M-1. После сортировки каждый клиент
возвращает обратно свою часть. При сортировке следует учитывать, что на
всех итерациях, кроме 0-й (первой хронологически) получаемая каждым
клиентом часть состоит из двух равных частей – старшей и младшей – уже
отсортированных. На рисунке приведен пример сортировки.
Б) Сортировка Шелла
Необходимо реализовать параллельную сортировку Шелла. Идея
алгоритма состоит в обмене элементов, расположенных не только рядом, но
и далеко друг от друга, что значительно сокращает общее число операций
перемещения элементов. Как пример рассматривается файл из 2n элементов.
На j-м шаге файл делится на 2j групп по 2n-j элементов в каждой, при этом
i-я группа содержит элементы (i, i+1*2n-j , i+2*2n-j , .., i+(2j -1)*2n-j ), i=1,..,
2j , j=n-1,..,1 (номер шага убывает от n-1 до 1). На каждом шаге выполняется
сортировка в каждой группе. При сортировке в каждой группе следует иметь
ввиду, что элементы с четными (нечетными) номерами образуют уже
отсортированную последовательность, то есть для сортировки группы надо
слить эти две отсортированные подпоследовательности.
В) Сортировка слиянием
Алгоритмы слияния основываются на процедуре слияния двух уже
отсортированных отрезков массива в один. При параллельной сортировке
весь процесс разбивается на итерации. На первой итерации массив
разбивается на фрагменты, общее количество которых превышает количество
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 132 из 133
клиентов в два раза. Затем каждая пара фрагментов сливается одним из
процессов, после чего фрагмент записывается в сортируемый массив. Все
следующие итерации идентичны первой за исключением уменьшения
работающих процессов вдвое на каждой из итераций. Последняя пара
фрагментов может быть слита на сервере.
2. Параллельное шифрование
А) Шифрование методом замены (моноалфавитная подстановка)
В этом методе символы шифруемого текста заменяются символами,
взятыми из одного (одноалфавитная или моноалфавитная подстановка)
алфавита. Самой простой разновидностью является прямая замена, когда
буквы шифруемого сообщения заменяются другими буквами того же самого
или некоторого другого алфавита. Таблица замены может иметь следующий
вид:
Символы
ABCDEFGHIJKLMNOPQRSTUVW
шифруемог
XYZ
о текста
Заменяющи
SPXLRZIMAYEDWTBGVNJOCFH
е символы
QUK
Б) Шифрование методом замены (полиалфавитная подстановка)
При полиалфавитной подстановке для замены символов исходного текста
используются несколько алфавитов, заданных данным ключом, причем смена
алфавитов осуществляется последовательно и циклически, т.е. первый
символ заменяется соответствующим символом первого алфавита, второй символом второго алфавита и т.д. до тех пор, пока не будут использованы все
выбранные алфавиты. После этого использование алфавитов повторяется.
В) Шифрование методом гаммирования.
Суть этого метода состоит в том, что символы шифруемого текста
последовательно складываются с символами некоторой специальной
последовательности, называемой гаммой. Иногда такой метод представляют
как наложение гаммы на исходный текст, поэтому он получил название
"гаммирование".
Процедуру наложения гаммы на исходный текст можно осуществить
двумя способами. При первом способе символы исходного текста и гаммы
заменяются цифровыми эквивалентами, которые затем складываются по
модулю k, где k – число символов в алфавите, т.е.
tш =(tо + tг)mod k,
где tш – символы зашифрованного текста;
tо – символы исходного текста;
tг – символы гаммы.
УМКД 042-39.1.142/02-2013
Редакция №1 от 03.09.2013.
Страница 133 из 133
При втором методе символы исходного текста и гаммы представляются в
виде двоичного кода, затем соответствующие разряды складываются по
модулю два.
Список источников.
1. MPI для начинающих. – http://www.csa.ru:81/~il/mpi_tutor
2. MPI-2: Extensions to the Message-Passing Interface. http://parallel.ru/docs/Parallel/mpi2/mpi2-report.html
3. Богачев К.Ю. Основы параллельного программирования. – М.:Бином,
2003. – 342 с.
4. Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. – СПб: БХВПетербуг, 2002. – 608 с.
5. Воеводин Вл. В. Технологии параллельного программирования. Message
Passing Interface (MPI). – http://parallel.ru/vvv/mpi.html
6. Немнюгин С.А., Стесик О.Л. Параллельное программирование для
многопроцессорных вычислительных систем. – СПб.: БХВ-Петербург, 2002.
– 400 с.
4 Самостоятельная работа студента
Скачать