Северин Андрей Александрович

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ФАКУЛЬТЕТ РАДИОФИЗИКИ И ЭЛЕКТРОНИКИ
КАФЕДРА ИНФОРМАТИКИ
ИССЛЕДОВАНИЕ ЭФФЕКТИВНОСТИ РЕАЛИЗАЦИИ
ЧИСЛЕННЫХ МЕТОДОВ НА КЛАСТЕРАХ ПЕРСОНАЛЬНЫХ
ЭВМ
Магистерская работа студента
Северина Андрея Александровича
Руководитель:
Шпаковский Г.И.,
к.т.н., доцент кафедры информатики
Рецензент:
Шестаков К.М.
к.т.н.,
доцент кафедры интеллектуальных систем
Допустить к защите:
заведующий кафедрой информатики,
профессор
С.Г.Мулярчик
«____» «_____________ » 2005 года
Минск, 2005
Содержание
Введение .................................................................................................................. 3
ГЛАВА 1. Технология параллельного программирования ......................... 5
1.1 Классификация архитектур параллельных ЭВМ .............................................................. 5
1.2. Кластеры персональных ЭВМ ........................................................................................... 8
1.3. Интерфейс параллельного программирования .............................................................. 11
ГЛАВА 2. Эффективность реализации численных методов ...................... 14
2.1 Метод формульного анализа масштабируемости (ФАМ) .............................................. 14
2.1. Эффективность параллельных алгоритмов .................................................................... 17
3.1. Постановка задачи линейного программирования ........................................................ 21
3.2. Двойственность задач линейного программирования ................................................... 25
3.3. Постановка транспортной задачи .................................................................................... 27
3.4. Общая схема программы .................................................................................................. 30
3.5. Генерирование исходных данных ................................................................................... 32
3.6. Последовательный алгоритм............................................................................................ 34
3.7. Параллельный алгоритм ................................................................................................... 40
3.8. Проверка эффективности работы программы ................................................................ 46
Заключение ........................................................................................................... 50
Список литературы ............................................................................................ 51
Приложение .......................................................................................................... 52
2
Введение
На сегодняшний момент сфера применения компьютеров безгранична и с
каждым днем расширяется все быстрее и быстрей. Человечество использует
компьютер практически во всех сферах своей деятельности. Создается
впечатление, что их (компьютеров) возможности и полезность безграничны. Но
в то же время быстро повышаются требования к компьютеру. Значительные
вычислительные затраты необходимы при решении задач цифровой обработки
данных, распознания, оптичизации.
В
экономике
оптимизационные
задачи
возникают
в
связи
с
необходимостью разработки планов предприятий, отраслей или народного
хозяйства на кратко-, средне- или долгосрочный периоды времени. Задача
оптимизации производства для предприятия ставится в форме максимизации
выручки или прибыли при заданных ассортименте выпускаемой продукции и
ограничениях на имеющиеся запасы ресурсов (сырье, оборудование, труд,
производственные площади и др.). Задача может ставиться и в форме
минимизации затрат при выпуске заданных объемов продукции несколькими
способами производства. Оптимизационные задачи могут быть поставлены не
только для предприятий реального сектора экономики, но также и для
торговли, банковской и страховой деятельности. Причем время, отведенное на
решение таких задач, очень критично.
Существует
два
основных
пути
увеличения
производительности
вычислительных систем. Это совершенствование элементарной базы (таким
образом, у компьютера повышается тактовая частота работы процессора) или
использование параллельных вычислений. И при необходимости решить
какую-либо задачу все чаще предпочтение отдается второму способу.
Причем создание параллельной системы на базе обычных компьютеров
будет значительно дешевле использования компьютеров с повышенной
тактовой частотой. Очевидно, что использование таких параллельных систем
при решении каких-либо задач экономически обосновано.
3
Кластеры относятся к классу параллельных систем с распределенной
памятью.
Узким
местом
кластеров
является
скорость
взаимодействия
отдельных узлов, так как привлекается наиболее распространенное и дешевое
коммуникационное оборудование (Fast Ethernet). Fast Ethernet использует
общую среду передачи данных и обладает не очень большой пропускной
способностью (в сравнении со скоростью обработки данных современными
процессорами). Поэтому круг задач, решаемых на подобных системах,
ограничивается задачами с небольшим числом обменов по сравнению с
количеством вычислений. Неоспоримым преимуществом подобных систем
является их относительная дешевизна и фактическое наличие больших
компьютерных классов во многих учебных заведениях. Для программирования
на таких системах применяются системы передачи сообщений, в которых
отдельные компьютеры взаимодействуют посредством передачи и приема
данных.
При создании численного алгоритма, решаемого на параллельной системе,
основным показателем эффективности является масштабируемость. Для
кластеров под масштабируемостью понимается уменьшение время работы
алгоритма
при
увеличении
количества
узлов
кластера.
Диапазон
масштабирования – максимальное количество процессоров, при котором
коэффициент утилизации остается на приемлемом уровне.
Актуальным является исследование эффективности реализации численных
методов на кластерах персональных ЭВМ. И поэтому целью моей работы стала
разработка параллельных алгоритмов решения транспортной задачи линейного
программирования и анализ эффективности реализации данного метода на
параллельной системе.
4
ГЛАВА 1. Технология параллельного программирования
1.1 Классификация архитектур параллельных ЭВМ
Наиболее известная классификация параллельных ЭВМ
предложена
Флинном в 1966 году [1, 9]. Она (классификация) отражает форму
реализуемого ЭВМ параллелизма и базируется на понятии потока, под которым
понимается
последовательность
обрабатываемая
процессором.
элементов,
Таким
команд
образом,
или
основными
данных,
понятиями
классификации являются "поток команд" и "поток данных". Под потоком
команд упрощенно понимают последовательность команд одной программы.
Под
потоком
данных
подразумевается
последовательность
данных,
обрабатываемых одной программой.
Согласно этой классификации имеется четыре больших класса ЭВМ:
1.
ОКОД (одиночный поток команд
− одиночный поток
данных) или SISD (Single Instruction − Single Data). Это последовательные
ЭВМ, в которых выполняется единственная программа, т. е. имеется
только один счетчик команд.
2.
ОКМД (одиночный поток команд − множественный поток
данных) или SIMD (Single Instruction – Multiple Data). В таких ЭВМ
выполняется единственная программа, но каждая команда обрабатывает
массив данных. Это соответствует векторной форме параллелизма.
3.
МКОД (множественный поток команд− одиночный
поток
данных) или MISD (Multiple Instruction − Single Data). Подразумевается,
что в данном классе несколько команд одновременно работает с одним
элементом данных, однако эта позиция классификации Флинна на
практике не нашла применения.
4.
МКМД (множественный поток команд − множественный
поток данных) или MIMD (Multiple Instruction − Multiple Data). В таких
ЭВМ одновременно и независимо друг от друга выполняется несколько
программных
ветвей,
в
определенные
5
промежутки
времени
обменивающихся
данными.
многопроцессорными.
Такие
Далее
системы
будут
обычно
называют
рассматриваться
только
многопроцессорные системы.
Предложенная Флином схема классификации вплоть до настоящего
времени является самой применяемой. Если говорится, что компьютер
принадлежит классу SIMD или MIMD, то сразу становится понятным базовый
принцип его работы, и в некоторых случаях этого бывает достаточно [12].
К минусам классификации Флинна можно отнести тот факт, что класс
MIMD является “переполненным”.
Однако, наличие пустого класса (MISD) не стоит считать недостатком
схемы. Такие классы, по мнению некоторых исследователей в области
классификации архитектур [10, 11], могут стать чрезвычайно полезными для
разработки принципиально новых концепций в теории и практике построения
вычислительных систем.
Основываясь на классификации предложенной Флинном, Ванг и Бриггс
конкретизировали некоторые классы [8].
Оставляя четыре ранее введенных базовых класса (SISD, SIMD, MISD,
MIMD), авторы внесли некоторые изменения.
Класс SISD разбивается на два подкласса:
 архитектуры с единственным функциональным устройством;
 архитектуры,
имеющие
в
своем
составе
несколько
функциональных устройств
В класс SIMD также вводится два подкласса:
 архитектуры с пословно-последовательной обработкой;
 архитектуры с разрядно-последовательной обработкой;
В классе MIMD авторы различают:
 вычислительные
системы
со
слабой
связью
между
процессорами, к которым они относят все системы с распределенной
памятью;
6
 вычислительные системы с сильной связью (системы с общей
памятью)
Р. Хокни разработал свой подход к классификации Флинна. Он попытался
систематизировать компьютеры, попадающие в класс MIMD.
Основная идея классификации состоит в следующем. Множественный
поток команд может быть обработан двумя способами: либо одним
конвейерным устройством обработки, работающем в режиме разделения
времени для отдельных потоков, либо каждый поток обрабатывается своим
собственным устройством. Первая возможность используется в MIMD
компьютерах,
которые
автор
называет
конвейерными.
Архитектуры,
использующие вторую возможность, в свою очередь опять делятся на два
класса:
 MIMD компьютеры, в которых возможна прямая связь
каждого
процессора
с
каждым,
реализуемая
с
помощью
переключателя;
 MIMD компьютеры, в которых прямая связь каждого
процессора возможна только с ближайшими соседями по сети, а
взаимодействие
специальной
удаленных
системой
процессоров
маршрутизации
поддерживается
через
процессоры-
посредники.
Далее, среди MIMD машин с переключателем Хокни выделяет те, в
которых вся память распределена среди процессоров как их локальная память.
В этом случае общение самих процессоров реализуется с помощью очень
сложного переключателя, составляющего значительную часть компьютера.
Такие машины носят название MIMD машин с распределенной памятью. Если
память это
разделяемый
ресурс, доступный
всем процессорам через
переключатель, то такие MIMD являются системами с общей памятью. В
соответствии с типом переключателей можно проводить классификацию и
далее: простой переключатель, многокаскадный переключатель, общая шина.
7
1.2. Кластеры персональных ЭВМ
Кластерные технологии стали логическим продолжением развития идей,
заложенных в архитектуре MPP систем. Если процессорный модуль в MPP
системе представляет собой законченную вычислительную систему, то
следующий шаг напрашивается сам собой: почему бы в качестве таких
вычислительных узлов не использовать обычные серийно выпускаемые
компьютеры. Развитие коммуникационных технологий, а именно, появление
высокоскоростного сетевого оборудования и специального программного
обеспечения, такого как система MPI, реализующего механизм передачи
сообщений над стандартными сетевыми протоколами, сделали кластерные
технологии общедоступными. Сегодня не составляет большого труда создать
небольшую кластерную систему, объединив вычислительные мощности
компьютеров отдельной лаборатории или учебного класса.
Привлекательной чертой кластерных технологий является то, что они
позволяют для достижения необходимой производительности объединять в
единые вычислительные системы компьютеры самого разного типа, начиная от
персональных компьютеров и заканчивая мощными суперкомпьютерами.
Широкое распространение кластерные технологии получили как средство
создания систем суперкомпьютерного класса из составных частей массового
производства,
что
значительно
удешевляет
стоимость
вычислительной
системы.
Конечно, о полной эквивалентности этих систем говорить не приходится.
Производительность систем с распределенной памятью очень сильно зависит
от производительности коммуникационной среды. Коммуникационную среду
можно достаточно полно охарактеризовать двумя параметрами: латентностью –
временем задержки при посылке сообщения и пропускной способностью –
скоростью передачи информации. Так вот для компьютера Cray T3D эти
параметры составляют соответственно 1 мкс и 480 Мб/сек, а для кластера, в
котором в качестве коммуникационной среды использована сеть Fast Ethernet,
8
100 мкс и 10 Мб/сек. Это отчасти объясняет очень высокую стоимость
суперкомпьютеров. При таких параметрах, как у рассматриваемого кластера,
найдется не так много задач, которые могут эффективно решаться на
достаточно большом числе процессоров.
Можно утверждать, что кластер – это связанный набор полноценных
компьютеров, используемый в качестве единого вычислительного ресурса.
Преимущества кластерной системы перед набором независимых компьютеров
очевидны. Во-первых, разработано множество диспетчерских систем пакетной
обработки заданий, позволяющих послать задание на обработку кластеру в
целом, а не какому-то отдельному компьютеру. Эти диспетчерские системы
автоматически распределяют задания по свободным вычислительным узлам
или буферизуют их при отсутствии таковых, что позволяет обеспечить более
равномерную и эффективную загрузку компьютеров. Во-вторых, появляется
возможность совместного использования вычислительных ресурсов нескольких
компьютеров для решения одной задачи.
Для
создания
кластеров
обычно
используются
либо
простые
однопроцессорные персональные компьютеры, либо двух- или четырехпроцессорные SMP-серверы. При этом не накладывается никаких ограничений
на состав и архитектуру узлов. Каждый из узлов может функционировать под
управлением
своей
собственной
операционной
системы.
Чаще
всего
используются стандартные ОС: Linux, FreeBSD, Solaris, Tru64 Unix, Windows
NT. В тех случаях, когда узлы кластера неоднородны, то говорят о
гетерогенных кластерах.
При создании кластеров можно выделить два подхода. Первый подход
применяется при создании небольших кластерных систем. В кластер
объединяются полнофункциональные компьютеры, которые продолжают
работать и как самостоятельные единицы, например, компьютеры учебного
класса или рабочие станции лаборатории. Второй подход применяется в тех
случаях, когда целенаправленно создается мощный вычислительный ресурс.
Тогда системные блоки компьютеров компактно размещаются в специальных
9
стойках, а для управления системой и для запуска задач выделяется один или
несколько
полнофункциональных
компьютеров,
называемых
хост-
компьютерами. В этом случае нет необходимости снабжать компьютеры
вычислительных узлов графическими картами, мониторами, дисковыми
накопителями и другим периферийным оборудованием, что значительно
удешевляет стоимость системы.
Разработано множество технологий соединения компьютеров в кластер.
Наиболее широко в данное время используется технология Fast Ethernet. Это
обусловлено
простотой
ее
использования
и
низкой
стоимостью
коммуникационного оборудования. Однако за это приходится расплачиваться
заведомо недостаточной скоростью обменов. В самом деле, это оборудование
обеспечивает максимальную скорость обмена между узлами 100 Мб/сек, тогда
как скорость обмена с оперативной памятью составляет 3 Гб/сек и выше.
Разработчики
пакета
подпрограмм
ScaLAPACK,
предназначенного
для
решения задач линейной алгебры на многопроцессорных системах, в которых
велика доля коммуникационных операций, формулируют следующим образом
требование к многопроцессорной системе: “Скорость межпроцессорных
обменов между двумя узлами, измеренная в Мб/сек, должна быть не менее 1/10
пиковой производительности вычислительного узла, измеренной в Mflops”.
Таким образом, если в качестве вычислительных узлов использовать
компьютеры класса Pentium III 500 Мгц (пиковая производительность 500
Mflops), то аппаратура Fast Ethernet обеспечивает только 1/5 от требуемой
скорости. Частично это положение может поправить переход на технологии
Gigabit Ethernet.
10
1.3. Интерфейс параллельного программирования
Наиболее
распространенным
интерфейсом
параллельного
программирования в модели передачи сообщений является MPI (Message
Passing Interface). Рекомендуемой бесплатной реализацией MPI является пакет
MPICH [13] , разработанный в Аргоннской национальной лаборатории США.
Во многих организациях имеются локальные сети компьютеров с
соответствующим программным обеспечением. Если такую сеть снабдить
бесплатной реализацией MPI, т. е. пакетом MPICH, то без дополнительных
затрат получается Beowulf-кластер, сравнимый по мощности с супер-ЭВМ. Это
является причиной широкого распространения таких кластеров [1].
Система программирования MPI относится к классу МКМД ЭВМ с
индивидуальной памятью, то есть к многопроцессорным системам с обменом
сообщениями. MPI имеет следующие особенности:
 MPI − библиотека, а не язык. Она определяет имена, вызовы
процедур и результаты их работы. Программы, которые пишутся на
FORTRAN, C, и C++ компилируются обычными компиляторами и
связаны с MPI–библиотекой.
 MPI − описание, а не реализация. Все поставщики параллельных
компьютерных систем
предлагают реализации MPI для своих
машин как бесплатные, и они могут быть получены из Интернета.
Правильная
MPI-программа
должна
выполняться
на
всех
реализациях без изменения.
 MPI соответствует модели многопроцессорной ЭВМ с передачей
сообщений.
В модели передачи сообщений процессы, выполняющиеся параллельно,
имеют раздельные адресные пространства. Связь происходит, когда часть
адресного пространства одного процесса скопирована в адресное пространство
другого процесса. Эта операция совместная и возможна только когда первый
процесс выполняет операцию передачи сообщения, а второй процесс −
операцию его получения.
11
Процессы в MPI принадлежат группам. Если группа содержит n процессов,
то процессы нумеруются внутри группы номерами, которые являются целыми
числами от 0 до n-l. Имеется начальная группа, которой принадлежат все
процессы в реализации MPI.
Понятия контекста и группы объединены в едином объекте, называемом
коммуникатором. Таким образом, отправитель или получатель, определенные в
операции посылки или получения, всегда обращается к номеру процесса в
группе, идентифицированной данным коммуникатором.
В MPI используются коллективные операции, которые можно разделить на
два вида:
 операции перемещения данных между процессами. Самый простой
из них – широковещание (broadcasting), MPI имеет много и более
сложных коллективных операций передачи и сбора сообщений;
 операции коллективного вычисления (минимум, максимум, сумма и
другие, в том числе и определяемые пользователем операции).
В обоих случаях библиотеки функций коллективных операций строятся с
использованием знания о преимуществах структуры машины, чтобы увеличить
параллелизм выполнения этих операций.
Часто
предпочтительно
описывать
процессы
в
проблемно-
ориентированной топологии. В MPI используется описание процессов в
топологии графовых структур и решеток.
В MPI введены средства, позволяющие определять состояние процесса
вычислений, которые позволяют отлаживать программы и улучшать их
характеристики.
Программы MPI могут выполняться на сетях машин, которые имеют
различные длины и форматы для одного и того же типа datatype, так что каждая
коммуникационная операция определяет структуру и все компоненты datatype.
Следовательно, реализация всегда имеет достаточную информацию, чтобы
делать преобразования формата данных, если они необходимы. MPI не
12
определяет, как эти преобразования должны выполняться, разрешая реализации
производить оптимизацию для конкретных условий.
Процесс есть программная единица, у которой имеется собственное
адресное пространство и одна или несколько нитей. Процессор − фрагмент
аппаратных средств, способный к выполнению программы. Некоторые
реализации MPI устанавливают, что в программе MPI всегда одному процессу
соответствует один процессор; другие − позволяют размещать много процессов
на каждом процессоре.
Если в кластере используются SMP–узлы (симметричная многопроцессорная система с множественными процессорами), то для организации
вычислений возможны два варианта:
 Для каждого процессора в SMP-узле порождается отдельный MPIпроцесс.
MPI-процессы
внутри
этого
узла
обмениваются
сообщениями через разделяемую память (необходимо настроить
MPICH соответствующим образом).
 На каждой узле запускается только один MPI-процесс. Внутри
каждого MPI-процесса производится распараллеливание в модели
"общей памяти", например с помощью директив OpenMP.
Чем
больше
функций
содержит
библиотека
MPI,
тем
больше
возможностей представляется пользователю для написания эффективных
программ.
13
ГЛАВА 2. Эффективность реализации численных методов
2.1 Метод формульного анализа масштабируемости (ФАМ)
Масштабируемость – это свойство системы (задача + кластер), сохранять
вычислительную эффективность при увеличении размера задачи или размеров
кластера. Предельные значения параметров, при которых величина ускорения R
все еще остается приемлемой, называются диапазоном масштабируемости [5].
Эффективность вычислений на кластере определяется сетевым законом
Амдала:
R
T1

Tn
1
,
1  a 0t 0
ad*

n
t
рис. 1
Здесь: R – ускорение вычислений, T1 и Tn – время выполнения одной и той
же задачи на однопроцессорной и n – процессорной системе, a – удельный вес
не распараллеливаемых операций, d – коэффициент дисбаланса,  и  0 –
общее количество операций в задаче и количество операций обмена, t и to –
время выполнения одной вычислительной операции и одной операции обмена
Очевидно, что с увеличением размера задачи и числа процессоров удельный
вес операций обмена
0
t
и удельный вес одной операции обмена 0 возрастают

t
и, соответственно, уменьшается значение R. Величина этого уменьшения
характеризует масштабируемость задачи.
Закон Амдала можно представить и в такой форме:
R
W t
1
1

n
 ,

1

a
W 
a

Wск  пр   t a 
n
n 

рис. 2
где W  Wск  Wпр , где W - общее число операций в задаче, W пр - число операций,
которые можно выполнить параллельно, Wск
14
- число
скалярных (не
распараллеливаемых) операций, t −
время выполнения одной операции,
a  Wск / W - удельный вес скалярных операций.
Закон Амдала определяет принципиально важные для параллельных
вычислений положения:
 Ускорение зависит от потенциального параллелизма задачи (величина
1  a ) и параметров аппаратуры (число процессоров n ).
 Предельное ускорение определяется свойствами задачи.
Сетевой закон Амдала является полноценной моделью для оценки
масштабируемости алгоритмов и кластеров. Он расширяем и позволяет учесть
неограниченное число дополнительных параметров.
Для измерения масштабируемости можно использовать ряд параметров,
основной – коэффициент полезного действия
h
R
.
n
КПД является
относительным параметром, но часто необходимо знать абсолютное значение
параллельного счета Tn.
Например, для кластеров, использующих очень
быстрый коммуникатор SCI и медленный коммуникатор Fast Ethernet
ускорения на одной и той же задаче при увеличении числа процессоров могут
оказаться близкими, а времена вычислений – существенно разным.
Важным свойством
базовой модели является возможность во многих
случаях отделить параметры алгоритма
позволяет
анализировать
свойства
0
t
от параметров аппаратуры 0 . Это

t
алгоритмов
0

независимо
от
характеристик каких-либо кластеров. Основной задачей в этом случае
становится выбор вариантов алгоритмов с наименьшим
0
и составление

списков наилучших параллельных алгоритмов для различных приложений.•
Аналогично,
можно
составить
таблицы
классов
отношений
t0
t
для
существующей и прогнозируемой аппаратуры кластеров, что позволит
15
оперативно
получить
характеристики
параллельного алгоритма.
16
масштабируемости
для
любого
2.1. Эффективность параллельных алгоритмов
Большое количество программного обеспечения, написанного ранее для
последовательной (однопроцессорной) вычислительной техники, не обладает
необходимым запасом параллелизма и попытки его распараллеливания на
уровне распараллеливания отдельных циклов, как правило, не приводят к
хорошим результатам. Производительность кода остается низкой.
Другим подходом к разработке
параллельных
программ является
использование модели программирования с распараллеливанием данных (dataparallel programming model), когда в последовательный код вставляются
директивы компилятору и распараллеливание происходит на автоматическом
уровне. Если программа логически простая и обладает ресурсом параллелизма,
этот подход может дать хорошие результаты. Однако рекордных результатов
удается получить только при использовании знаний программиста о структуре
алгоритма и управлении вручную потоком данных. Это достигается при
использовании стиля программирования с передачей сообщений (message
passing style) [5].
Одной из основных характеристик параллельного алгоритма является
ускорение S (Speedup), которое определяется как отношение общего времени
прохождения программы для последовательного алгоритма ко времени работы
параллельного алгоритма с использованием Р процессоров.
Другой
важной
характеристикой
алгоритма
является
параллельная
эффективность E, которая определяется как отношение ускорения к числу
процессоров, то есть E =S / P.
Получение близкой к пиковой производительности и высокой параллельной
эффективности программ представляет собой сложную задачу.
Возможные причины потери параллельной эффективности следующие:
1) стартовое время инициализации параллельной программы (startup),
2) дисбаланс загрузки процессоров (load imbalance),
3) коммуникационные затраты (communication costs),
17
4) наличие последовательных частей кода (serial part of the code).
Стартовое время инициализации параллельных программ.
Работа программы начинается с подготовительного этапа, когда выполняется
генерация начальных данных (возможно на одном процессоре), а результаты
потом рассылаются по всем процессорам. В качестве примера можно привести
генерацию сетки, выполняемую на одном процессоре.
Сбалансированность загрузки процессоров.
Время выполнения параллельной программы определяется временем
работы процессора, выполняющего наибольший объем работы. Если имеется
несбалансированность загрузки процессоров, то часть процессоров вынуждена
простаивать, пока остальные заканчивают свою вычислительную работу. Для
получения хорошей сбалансированности процессоров необходимо каждому
процессору выделить одинаковую часть работы. На первый взгляд кажется, что
разбиение расчетной области на P подобластей с одинаковым количеством
расчетных узлов будет гарантировать идеальную сбалансированность загрузки
процессоров. Это действительно так, если расчет каждого вычислительного
узла
требует
вычислительной
идентичной
вычислительной
работы
от
зависит
работы.
местоположения
Если
же
расчетного
объем
узла
(например, приграничные узлы), то ситуация становится более сложной. В этом
случае необходимо выписывать функционал объема вычислительной работы,
разбивать его на P частей (подобластей) так, чтобы минимизировать
максимальную вычислительную работу на подобласти. В особо сложных
случаях альтернативным и эффективным может оказаться подход, основанный
на динамической загрузке процессоров и использовании модели клиент-сервер,
когда один выделенный процессор управляет работой остальных процессоров.
Коммуникационные затраты.
Как правило, процессоры вынуждены обмениваться данными в процессе
решения задачи. Часто соседние процессоры обмениваются значениями в своих
приграничных
ячейках.
Наиболее
распространенными
18
конфигурациями
процессоров являются линейное расположение (pipeline) и двумерная решетка
(mesh). Предположим, что расчетная область состоит из N2 узлов и задача
решается
на
P=n2
процессорах.
Тогда
при
линейном
расположении
процессоров объем пересылаемых данных будет пропорционален N (все P=n2
процессоров передают данные одновременно). В случае двумерной решетки
объем пересылаемых данных будет пропорционален 2N/n, что почти всегда
меньше, чем N. Эта простая оценка показывает, что двумерная решетка
процессоров
является
более
выгодной
с
точки
зрения
минимизации
коммуникационных затрат. В то же время использование трехмерной решетки
процессоров является еще более эффективным с точки зрения отношения
вычислительных затрат к коммуникационным, хотя и усложняет логику
программы и увеличивает объем программирования.
Межпроцессорная
передача
сообщений
характеризуется
скоростью
передачи и временем задержки (latency), необходимым для подготовки
аппаратуры к передаче сообщения.
Латентность продолжает играть существенную роль при средней длине
сообщения (обычно 1000 байтов). В случае решетки процессоров за один цикл
процессор выполняет вычислительную работу за время aN2/(n2X) (a –
количество арифметических операций, необходимое для расчета одного узла),
обмен данными происходит за время 2bN(nY)(-1) (b − количество переменных,
которыми происходит обмен). Отношение времени обмена данными к времени
вычислений оказывается 2bNX(aNY)(-1).
Минимизация коммуникационных затрат может быть достигнута за счет
использования встречных обменов данными и асинхронной передачи данных.
Как правило, проблема формулируется так, что процессор посылает данные
соседнему и сам принимает от него данные. Аппаратные средства большинства
параллельных систем и программные средства MРI допускают использование
встречных обменов, когда данные передаются одновременно в обе стороны.
Это позволяет добиться почти двойного уменьшения времени обмена данными
по сравнению с однонаправленными обменами.
19
Асинхронные обмены предполагают межпроцессорную передачу данных
без
прекращения
вычислительной
работы
процессоров.
Большинство
современных параллельных компьютеров поддерживает асинхронность на
аппаратном и программном уровнях. Однако использование асинхронности
возможно
только
для
определенных
алгоритмов
и
предполагает
соответствующий стиль программирования, когда заранее известно, что
передаваемые
данные
потребуются
только
на
более
поздних
этапах
вычислительной работы и имеется достаточный запас по времени для передачи
данных. Использование асинхронности (наложение коммуникационной работы
на вычислительную) позволяет свести к минимуму, а иногда и полностью
избавиться от коммуникационных затрат.
Обмен данными на фоне вычислительной работы на кластерах и сетях
рабочих станций с высокой латентностью и низкой скоростью передачи данных
позволяет обнаружить дополнительный ресурс параллелизма в алгоритмах,
традиционно считавшихся плохо распараллеливаемыми.
Заметим также, что отношение вычислительных затрат к
коммуникационным и соответственно ускорение будет выше для
вычислительных систем с медленными процессорами (больше
время вычислительной работы) и быстрой коммуникационной
сетью.
20
ГЛАВА 3. Решение задач линейного программирования
3.1. Постановка задачи линейного программирования
Произвольная форма задачи линейного программирования (ЗЛП) имеет
вид:
n
max(min)
c
j 1
n
a
j 1
j 1
x j  bi (i  1,..., m1 ),
ij
x j  bi (i  m1  1,..., m2 ),
ij
x j  bi (i  m2  1,..., m),
n
a
j 1
xj,
ij
n
a
j
xj  0
( j  1,..., n1 ),
x j  произвольн ые,
( j  n1  1,..., n).
рис. 3
Выражение
n
c x
j 1
j
j
называется целевой функцией (или критерием) задачи.
Величины ( x1 , x2 ,..., xn ) – переменные задачи. Система неравенств в задаче (рис.
3) определяет область допустимых значений (планов) задачи D, которая имеет
форму выпуклого многогранника.
Неравенства и равенства в задаче (рис. 3) называются ограничениями.
Каждое неравенство определяет полупространство, а равенство – плоскость в
пространстве переменных ( x1 , x2 ,..., xn ) .
Решение задачи (рис. 3) называется оптимальным решением (или
оптимальным планом) и обозначается как X *  ( x1* , x 2* ,..., x n* ) . Оптимальные
решения лежат на границе области D.
Если область D ограничена, то задача ЛП имеет либо единственное, либо
бесконечно много решений. Если решение единственно, то оно совпадает с
одной из вершин многогранника D.
21
Если градиент целевой функции C  (c1 , c2 ,..., cn ) коллинеарен градиенту
одного из ограничений, то задача имеет бесконечно много решений, лежащих
на данном ограничении.
Если ограничения несовместны, или целевая функция неограниченна, то
задача (рис. 3) не имеет решения.
Если область области D не ограничена, то решение может существовать
либо быть неограниченным.
Всякая задача на минимум может быть сведена к задаче на максимум и
наоборот, умножением целевой функции на –1. Оптимальный план задачи при
этом не изменится, а значение целевой функции изменит знак. После решения
надо снова изменить знак целевой функции.
Симметричная форма ЗЛП на максимум имеет вид:
n
max  c j x j ,
j 1
n
a
j 1
ij
x j  bi ,
x j  0,
j  (1,..., n).
рис. 4
Симметричная форма ЗЛП на минимум имеет вид:
n
min
c
j 1
n
a
j 1
ij
j
xj,
x j  bi ,
x j  0,
j  (1,..., n).
рис. 5
Если все bi  0 , то задача (рис. 4) обычно имеет следующий экономический
смысл: x j − объемы производства j-го вида продукции, ci − цены или прибыль
единицы продукции, a ij − нормативы затрат i-го вида ресурса на производство
единицы j-го вида продукции, bi − имеющийся запас i-го вида ресурса. Надо
22
определить план производства продукции X *  ( x1* , x 2* ,..., x n* ) , который дает
максимальную выручку или прибыль, при заданных ограничениях на
имеющиеся ресурсы. Ограничения, на которых в оптимальном плане
достигнуто равенство, соответствуют дефицитным ресурсам, остальные
ресурсы называются недефицитными.
Каноническая форма ЗЛП представлена ниже:
n
max(min)
c
j 1
n
a
j 1
ij
j
xj,
x j  bi ,
x j  0,
j  (1,..., n).
рис. 6
Из линейной алгебры известно, что количество линейно независимых
уравнений не может быть больше числа неизвестных. Поэтому в (рис. 6) можно
считать, что n  m .
Определение. Если в ограничении задачи (рис. 6) есть переменная с
коэффициентом, равным единице, отсутствующая в других ограничениях, то
она называется базисной, остальные переменные ограничения называются
свободными.
Если базисные переменные есть во всех ограничениях, то такая форма ЗЛП
называется канонической с базисными переменными. Каноническая форма с
базисными переменными является исходной для решения задачи симплексным
алгоритмом.
Определение. Опорным планом называется любой вектор X  ( x1 , x 2 ,..., x n ) ,
удовлетворяющий условиям (рис. 6) и имеющий не более чем m ненулевых
компонент.
Определение. Если в канонической форме все bi  0 , то задача (рис. 6) имеет
опорный план, в котором базисные переменные равны bi , а остальные
23
(свободные) переменные равны 0. Такой план называется начальным опорным
планом.
Определение. Балансовой называется переменная, которая добавляется или
вычитается из левой части неравенства для получения равенства. В задачах
(рис. 4), (рис. 5) балансовые переменные будут базисными.
Любая форма ЗЛП приводится к канонической форме с помощью
следующих преобразований:
 замена переменной, которая принимает произвольные значения, на
разность двух новых положительных переменных;
 введение балансовых переменных.
Определение. Искусственная переменная вводится, когда в канонической
форме ЗЛП в ограничении нет базисной переменной. В этом случае целевая
функция
изменяется
путем
вычитания
искусственной
переменной
с
коэффициентом М в задаче на максимум и путем прибавления – в задаче на
минимум. Коэффициент М считается большим положительным числом.
Определение. При вводе искусственных переменных и корректировке
целевой функции измененная задача называется М-задачей.
24
3.2. Двойственность задач линейного программирования
Каждой задаче линейного программирования соответствует двойственная
задача. Двойственная задача по отношению к исходной задаче строится по
следующим правилам:
Если исходная задача ставится на максимум, то двойственная ставится на
минимум и наоборот.
Коэффициенты целевой функции исходной задачи становятся правыми
частями ограничений двойственной задачи. Правые части ограничений
исходной задачи становятся коэффициентами целевой функции двойственной
задачи.
Если A-матрица коэффициентов исходной задачи, то транспонированная
матрица AT будет матрицей коэффициентов двойственной задачи.
В задаче на максимум все ограничения имеют знак ≤ (=), а в задаче на
минимум все ограничения имеют знак ≥.
Число переменных в двойственной задаче равно числу ограничений в
исходной задаче. Каждому ограничению исходной задачи соответствует
переменная двойственной задачи. Если ограничение исходной задач имеет знак
(≥), то соответствующая переменная двойственной задачи неотрицательна.
Если
ограничение
имеет
знак
(=),
то
соответствующая
переменная
двойственной задачи может принимать положительные и отрицательные
значения и наоборот.
В матричном виде двойственные задачи, заданные в симметричной форме,
имеют вид:
Прямая задача
Двойственная задача
max( c T , x)  (c T , x * ),
min( b T , y )  (b T , y * ),
A  x  b,
x  0,
A T  y  c,
y  0,
25
где
c  (c1 , c2 ,..., c n ) T ,
A  aij
mn
,
b  (b1 , b2 ,..., bm ) T , y  ( y1 , y 2 ,..., y m ) T ,
x *  ( x1* , x2* ,..., xn* ) T , y *  ( y1* , y 2* ,..., y m* ) T  оптимальные
решения
задач
рис. 7
Переменные y  ( y1 , y2 ,..., ym ) называются двойственными (или объективно
обусловленными) оценками.
26
3.3. Постановка транспортной задачи
Транспортная задача является специальным типом задач линейного
программирования. Экономическая постановка этой задачи следующая.
Имеется m поставщиков и n потребителей некоторой продукции. Заданы
тарифы (стоимость) перевозок единицы продукции от поставщиков к
потребителям, известны объемы запасов у поставщиков и потребности каждого
потребителя в продукции.
Требуется составить план поставок продукции от поставщиков к
потребителям так, чтобы суммарная стоимость перевозок была минимальной.
Математическая постановка этой задачи имеет вид:
m
min
n
 c
i 1 j 1
m
X
i 1
j 1
X ij
ij
 bj ,
j  1,2,..., n
ij
 ai ,
i  1,2,..., m
n
X
ij
рис. 8
Здесь X ij - объем, cij - тариф поставки продукции от i-го поставщика к j-му
потребителю, b j - потребности потребителей в продукции, ai - запасы
продукции у поставщиков.
Видно, что (рис. 8)
является задачей линейного программирования со
специальной матрицей. В задаче (рис. 8) имеется m*n неизвестных Xij и (m+n)
уравнений.
Решение транспортной задачи называется оптимальным планом перевозок
(поставок) продукции.
Задача (рис. 8) называется сбалансированной (закрытой), если суммарный
объем потребностей равен суммарному объему предложения продукции, т.е.
27
n
m
b   a
j 1
j
i 1
i
рис. 9
Если условие (рис. 9) не выполняется, то задача называется открытой. Для
решения открытую задачу преобразуют в закрытую. Для этого в задачу вводят
либо
фиктивного
поставщика
недостающего
объема
продукции
(если
потребности больше предложения), либо фиктивного потребителя лишней
продукции (если предложение больше потребностей), тарифы которых
полагаются равными нулю.
При решении задачи используется свойство, которое состоит в том, что
ранг матрицы A задачи (рис. 8) на единицу меньше числа уравнений r(A) = m +
n – 1. С учетом этого число ненулевых переменных Xij > 0 в опорном плане
будет не больше (m + n – 1).
Если число ненулевых Хij в опорном плане равно (m + n – 1), то план
называется невырожденным, иначе – вырожденным.
Для решения задачи (1) составляется таблица (
рис. 10)
Зап
Поставщ
ики
Потреб
ители
1
…
2
асы
ндексы,
продукции
U
n
1
c11
c12
c1n
a1
2
c21
c 22
c2n
a2
c m1
cm 2
c mn
am
b1
b2
bn
…
M
Потребно
сти
в
продукции
Индексы,
V
28
И
рис. 10
В случае открытой задачи в таблицу вводят либо фиктивного поставщика,
либо фиктивного потребителя, с целью получения равенства (рис. 9), с
соответствующим объемом продукции. Поэтому будем считать, что в таблице
выполняется соотношение (рис. 9).
29
3.4. Общая схема программы
Программа, реализующая алгоритмы вычисления решения транспортной
задачи, написана на языке C++ в полном соответствии со спецификацией
стандарта MPI. Таким образом, она (программа) является платформеннонезависимым приложением, и не должно возникнуть никаких проблем при
запуске на каком-либо кластере (при условии, что для платформы существует
компилятор языка C++).
Для
написания
исходных
текстов
программного
комплекса
была
использована IDE (интегрированная среда разработки, integrated development
environment, IDE) Microsoft Visual Studio 6.0.
Программа представляет собой проект, который включает в себя 3-x
модуля:
 Модуль генерации начальных данных;
 Модуль,
реализующий
последовательную
версию
алгоритма
решения транспортной задачи (метод минимального элемента, метод
северо-западного угла, метод штрафов, метод потенциалов);
 Модуль, реализующий параллельную версию алгоритма решения
транспортной задачи.
Логическая схема программы:
Конфигурационные
данные
Генерация начальных данных
Последовательный
алгоритм
Параллельный алгоритм
рис. 11
30
Конфигурационные данные представляют собой текстовый файл. В нем
можно определить значения некоторых переменных (минимальный или
максимальный размер пакета, передаваемого от корневого процесса рабочему
за один раз; имена файлов). Они (конфигурационные данные) являются
глобальными и влияют на работу всех модулей.
Для наглядности приведем блок-схемы модулей и поясним суть связей,
возникающих
между
ключевыми
функциональными
элементами.
Под
ключевыми функциональными элементами подразумеваются классы, которые
подключаются в ходе выполнения программы.
31
3.5. Генерирование исходных данных
Командная строка
generating.exe [m-число
строк] [n-число столбцов]
[диапазон случайных
чисел]
myConfig.cpp
myConfig.h
Глобальный
файл настроек
(myConfig.txt)
Main.cpp
(generatin.exe)
myGenerator.cpp
myGenerator.h
4 файла, содержащие
начальные данные
(c - матрица тарифов
поставки; a - вектор запасов
продукции у поставщиков; b вектор потребности
потребителей в продукции;
config – размерность
транспортной задачи)
рис. 12
Этот модуль предназначен для создания исходных данных. В контексте
транспортной задачи таковыми являются:
 Матрица тарифов поставок;
 Вектор запасов продукции у поставщиков;
 Вектор потребностей продукции у поставщиков;
 Размерность задачи
Нужно отметить, что генерируются псевдослучайные числа, так как
генератор случайных чисел компьютера работает относительно системного
времени операционной системы.
32
При
запуске
exe-файла
модуля
(generating.exe)
генерирования
из
командной строки необходимо задавать следующие параметры:
 Размерность задачи (число строк и столбцов);
 Диапазон псевдослучайных чисел;
В результате получаем: матрицу тарифов поставок (размерность – m*n), вектор
запасов продукции у поставщиков (размерность – m*1), вектор потребностей
продукции у поставщиков (размерность – 1*n) и файл содержащий значения m
и n.
33
3.6. Последовательный алгоритм
Начальные (исходные) данные
myConfig.cpp
myConfig.h
Глобальный
файл настроек
(myConfig.txt)
myMatrix.cpp
myMatrix.h
main.cpp
myMatrixElem.cpp
myMatrixElem.h
x – матрица поставок
(решение)
mySolver.cpp
mySolver.h
myVector.cpp
myVector.h
solvers.h
рис. 13
Данный модуль, реализует последовательную версию алгоритма решения
транспортной задачи.
В состав модуля входит 5 классов:
 myConfig (осуществляет чтение конфигурационных данных)
 myMatrix (класс матрица)
 myMatrixElem (класс элемент матрицы)
 mySolver (решатель)
 myVector (класс вектор)
При отладке промежуточные результаты выводились не только на экран.
Они также могут сохраняться в файл. Например, класс матрица имеет метод
myMatrix::writeMatrix();
34
Приведем блок-схему последовательного алгоритма решения транспортной
задачи методом потенциалов.
Инициализация переменных
Чтение из файла
начальных данных,
(матрицы а,b,c)
Проверка типа
транспортной
задачи
Открытый тип
Приведение
к закрытому
типу
Закрытый тип
Поиск опорного плана
1) Метод минимального элемента
2) Метод северо-западного угла
3) Метод штрафов
Проверка
вырожденности
опорного плана
План вырожден
Исправление
опорного плана
План невырожден
Восстановление значений
элементов матриц a, b, c
Метод потенциалов
Проверка
оптимальности
рис. 14
35
Решение
Рассмотрим подробнее методы нахождения опорного плана:
Метод северо-западного угла:
1) Строится нулевая матрица размером n*m.
2) Начиная
с
северо-западного
угла
в
естественном
порядке
осуществляется заполнение матрицы.
3) Заполнение
Для
осуществляется
каждого
элемента
по
выбирается
следующему
минимальное
правилу:
число
из
соответствующих ему значений вектора производства и потребления.
4) Это минимальное число вычитается из соответствующих данному
элементу
значений
векторов
производства
и
потребления.
Так как при корректировке один из элементов, либо а, либо b,
становится равным нулю, то соответствующая строка или столбец
исключаются в дальнейшем из рассмотрения.
5) Процесс заполнения продолжается до тех пор, пока все элементы
векторов производства и потребления не станут равными нулю.
6) Проверяется вырожденность полученного плана.
Метод минимальной стоимости:
1) Строится нулевая матрица размером n*m.
2) Производится индексирование матрицы стоимости в порядке
возрастания.
3) Согласно индексам, полученным на предыдущем этапе производится
заполнение элементов опорного плана. При этом элементы и правила
коррекций вычисляются также как и метод северо-западного угла.
4) Процесс заполнения продолжается до тех пор, пока все элементы
векторов производства и потребления не станут равными нулю.
5) Проверяется вырожденность полученного плана.
В ходе тестирования алгоритма было отмечено, что при индексации
отсутствует правило в присвоении индекса к матрице стоимости.
36
К положительным моментам данного метода можно отнести то, что он дает
лучший опорный план нежели метод северо-западного угла.
Метод штрафов:
1) Штрафы для строки или столбца представляют положительную
разницу между минимальным элементом строки (столбца) и
следующим за ним по величине минимальным элементом строки или
столбца.
2) Рассчитываются штрафы для всех строк и столбцов матрицы.
3) Заполнение опорного плана начинается с минимального элемента
строки или столбца с максимальным штрафом.
4) Выбор элементов плана Х и коррекция векторов потребления и
постановок осуществляется, как рассмотрено выше (1-ый и 2-ой
метод)
5) Строка или столбец матрицы С, которым соответствует нулевое
значение потребности или поставки при дальнейшем вычислении не
участвуют в формировании штрафов. Процесс продолжается до тех
пор, пока не обнулятся все вектора.
В ходе тестирования было замечено, что в данном методе отсутствует
правило выбора альтернативы при равенстве штрафов.
Рассмотрим подробнее построение оптимального плана транспортной
задачи с помощью метода потенциалов.
Опорный план невырожден, если количество ненулевых Хij равно (m + n –
1).
Затем для Хij > 0 составляется система уравнений:
u i  v j  cij
рис. 15
Неизвестные ui, vj называются индексами (потенциалами).
37
Поскольку в системе (рис. 15) количество уравнений на единицу больше
числа неизвестных, то одному неизвестному надо присвоить произвольное
значение
(обычно
0).
Система
(рис.
15)
решается
последовательной
подстановкой полученных значений в следующие уравнения.
После решения системы (рис. 15) для свободных клеток таблицы
определяют потенциалы:
S ij  C ij  (u i  v j )
рис. 16
Если все Sij > 0, то полученный план является оптимальным.
Иначе выбирают клетку с минимальным Sij < 0.
Hачиная с выбранной клетки матрицы перевозок, стоится замкнутый
прямоугольный цикл (цепочка, коммуникация) с вершинами в заполненных
клетках (в том числе символом 0 ).
Выбранной клетке присваивается знак «+», следующей вершине цикла по
(или против) часовой стрелке – знак «–», далее «+»,«–», и т.д. по циклу. Данная
цепочка знаков обязательно заканчивается знаком «–». Цепочка называется
вырожденной, если она состоит из одного элемента.
Среди клеток цикла, отмеченных знаком «–», выбирается клетка с
наименьшим значением переменной Хij, затем из нагрузки клеток, отмеченных
знаком «–», вычитают это значение, а клетки, отмеченных знаком «+»,
прибавляют это значение. Получают новый опорный план, который проверяют
на невырожденность и в случае необходимости выполняют переход к
невырожденному.
После этого заново строится система уравнений (рис. 15).
При реализации алгоритма построения замкнутой цепочки в способ
описанном ранее чувствуется громоздкость. Поэтому было принято решение
использовать более подходящий аналог:
Цепочка строится следующим образом. Начиная со строк матрицы Х
вычеркиваются те из них, в которых один не нулевой элемент. Подобную
операцию повторяют затем по столбцам, следом по строкам и т.д.
38
В результате проведенной процедуры не вычеркнутыми оказываются элементы,
которые составляют цепочку. Цепочка замкнута, содержит четное число
элементов и строится, начиная от базового элемента, безразлично в каком
направлении, по ходу ладьи в шахматах. При этом элементы, стоящие на
нечетных местах помечаются минусом, а на четных - плюсом.
39
3.7. Параллельный алгоритм
Наибольший интерес представляет модуль, в котором реализуется
параллельное решение транспортной задачи.
Параллельный алгоритм (блок-схема)
Начальные (исходные) данные
myConfig.cpp
myConfig.h
Глобальный
файл настроек
(myConfig.txt)
myMain.cpp
myPMatrix.cpp
myPMatrix.h
myPSolver.cpp
myPSolver.h
x – матрица
поставок
(решение)
myInc.h
рис. 17
Данный модуль реализует параллельную версию алгоритма решения
транспортной задачи.
В состав модуля входят следующие классы:
 myConfig (осуществляет чтение конфигурационных данных)
 myPMatrix (класс матрица)
 myPSolver (решатель)
В последовательной версии реализации алгоритма поля и методы были
инкапсулированы в одном классе. В параллельной версии необходимо
разделить данные и методы работы с ними.
40
Следовательно, необходимо создать специальный пользовательский тип,
который удовлетворял требования MPI, которые предъявляются к объектам,
участвующих в операциях обмена.
typedef struct
{
INT x;
INT y;
REAL value;
CHAR ox;
CHAR oy;
CHAR isBlocked;
} MyMElem;
В итоге в процедурах обмена параметром будет являться переменная типа
MyMElem* - которая по сути представляет собой вектор (либо матрицу с
числом строк = 1).
Класс myPMatrix во многом повторяет функционал класса myMatrix (он
используется в последовательном алгоритме). И как параметр в методы
принимает тип MyMElem*.
Так как в программе мы заранее не знаем, какой размер будет у массива, то
память под матрицы выделяется динамически.
Посредством класса myPMatrix мы можем осуществлять следующие
базовые действия с вектором:
Динамическое выделение памяти:
 MyMElem* allocatemyMatrix();
 MyMElem* allocatemyMatrix(int im, int in);
Инициализация элементов нулевыми значениями:
 void initmyMatrix(MyMElem* pVector);
 void initmyMatrix(int im, int in, MyMElem* pVector);
41
Заполнение матрицы:
 void fillmyMatrix(MyMElem* pVector);
 void fillmyMatrix(int im, int in, MyMElem* pVector);
Как особенность можно выделить то, что класс myPMatrix работает с
вектором как с обыкновенной матрицей. То есть проход по всем элементам
осуществляется через вложенный цикл с пересчетом индекса.
Например:
for (i = 0; i <m; i++) {
for (j = 0; j <n; j++) {
index = i*n +j;
}
printf("\n");
}
Для того, чтобы динамический массив типа MyMElem* мог участвовать в
каких-либо операциях обмена, необходимо создать и зарегистрировать для MPI
специальный тип.
MPI_Datatype elemtype;
MPI_Datatype
oldtypes[3]
=
{MPI_INT,
MPI_CHAR};
INT blockcounts[3] = {2, 1, 3};
// MPI_Aint type used to be consistent with syntax of
// MPI_Type_extent routine
MPI_Aint offsets[3];//, extent;(ïî èäåå íå íóæíà)
MPI_Aint baseaddrr, addrr1, addrr2;
//! testing
MPI_Address(&(va_buffer[0]), &baseaddrr);
MPI_Address(&(va_buffer[0].value), &addrr1);
MPI_Address(&(va_buffer[0].ox), &addrr2);
42
MPI_LONG_DOUBLE,
//! end of testing
offsets[0] = 0;
offsets[1] = addrr1 - baseaddrr;
offsets[2] = addrr2 - baseaddrr;
// Now define structured type and commit it
MPI_Type_struct( 3, blockcounts, offsets, oldtypes, &elemtype);
MPI_Type_commit(&elemtype);
С помощью функции MPI_Type_struct(int count, int *array_of_blocklengths,
MPI_Aint *array_of_displacements, MPI_Datatype *array_of_types, MPI_Datatype
*newtype) мы создаем структурный тип данных newtype из count блоков по
array_of_blocklengths элементов типа
array_of_types. Причем i-й блок
начинается через array_of_displacements[i] байт с начала буфера посылки. Этот
момент является очень важным, так как память для переменной может
выделять не целым куском. И между элементами могут возникать пробелы.
Затем с помощью MPI_Type_commit(MPI_Datatype *datatype) регистрирую
производный тип данных. После регистрации этот тип данных можно
использовать в операциях обмена наравне с предопределенными типами
данных (предопределенные типы данных регистрировать не нужно).
В конце необходимо освободить память:
MPI_Type_free(&elemtype);
С помощью этой функции происходит аннулирование производного типа
данных. Параметр функции принимает значение MPI_DATATYPE_NULL.
Причем гарантируется, что любой начатый обмен, использующий данные
аннулируемого типа, будет нормально завершен. При этом производные от
elemtype типы данных остаются и могут быть использованы далее. А
предопределенные типы данных не могут быть аннулированы.
43
Далее для наиболее эффективной рассылки необходимо выбрать способ
обмена данными между элементами кластера в ходе вычислений.
Наиболее распространенной схемой является та, в которой рассылающий
процесс сам участвует в вычислениях.
Однако если нужно переслать массив значительной размерности, то имеет
смысл использовать настраиваемую схему рассылки. Через конфигурационный
файл
myConfig.txt
можно
настроить
количество
элементов
вектора
передаваемых за один раз от корневого процесса какому-либо из рабочих.
Для наглядности приведем логическую блок-схему такого метода рассылки
данных.
Корневой процесс (root)
Рабочий процесс №1
Рабочий процесс №2
…
Рабочий процесс №N
рис. 18
На первом этапе работы корневой процесс рассылает всем рабочим
процессам по одному пакету. Если пакетов не хватает, то посылается сигнал,
говорящий о том, что пакеты закончились. Затем корневой процесс переходит в
режим ожидания ответа, о том, что посланный пакет успешно получен
адресатом (рабочим процессом). Как только приходит уведомление о приеме
пакета принявшему процессу отправляется дополнительный пакет, и корневой
процесс снова переходит в режим ожидания ответа. Это продолжается до тех
пор пока не будут разосланы все пакеты и не получены ответы об их успешной
доставке адресатам (рабочим процессам).
Следует отметить процесс, который будет находиться на самом быстром
участке кластера, получит свою порцию данных самым первым.
44
К достоинствам данного алгоритма стоит отнести тот момент что как
только рабочий процесс получает свою порцию данных, то он отсылает
сообщение корневому процессу о своей переполненности.
Итак, в группе процессов определяется корневой процесс (root), который
занят тем, что считывает исходные данные, рассылает их другим процессам и
аккумулирует результат. Все остальные процессы автоматически становятся
рабочими, т.е. участвуют только в приеме данных, вычислениях и отсылке
вычислений.
Для
реализации
параллельных
вычислений
необходимо
выделить
независимые части алгоритма. Для распараллеливания подходят:
 методы поиска опорных планов,
 проверка типа транспортной задачи,
 решение уравнения (рис. 15).
В качестве примера рассмотрим параллельную реализацию метода
минимального элемента.
Логически программный код состоит из двух частей:
 Код, выполняемый на корневом процессе
 Код, выполняемый на подчиненном процессе (рабочем)
В программе это реализуется функцией:
myPSolver::findBasisMin( myPMatrix a, myPMatrix b, myPMatrix c, myPMatrix x,
MyMElem* va, MyMElem* vb, MyMElem* vc, MyMElem* vx, ofstream& out)
Исходный код этой функции приводится в приложении.
45
3.8. Проверка эффективности работы программы
Для анализа эффективности программа запускалась на кластере БЕЛТА.
Этот кластер был построен на основе сети FAST ETHERNET. Сеть находиться
под управлением сервера, то есть все компьютеры находятся в одном домене
(одно из условий корректной установки пакета MPI).
Кластер состоял из четырех машин (Pentium-4 1800 МГц, 512 МБ ОЗУ,
40ГБ).
Этапы развертывания MPICH:
1. Установка пакета MPICH (mpich.nt.1.2.5.exe) на все машины.
Желательно устанавливать в одну и ту же директорию;
2. Установка
значении
переменных
окружения
(path
=
%SystemRoot%\system32;%SystemRoot%;c:\Program
Files\MPICH\mpd\bin\; c:\Program Files\MPICH\SDK\Lib\). То есть
необходимо для каждой машины прописать местоположение файла
mpirun.exe;
3. Создание на всех компьютерах share-папки. Ее абсолютный путь
должен быть одинаковым для всех хостов;
4. Затем необходимо зарегистрировать MPICH. Для этого необходимо
запустить mpiregister.exe;
5. Для того чтобы без проблем выполнялась команда mpirun c ключом
(–np) необходимо запустить mpiconfig.exe;
6. Затем exe-файлы программы необходимо скопировать во все shareпапки.
46
Результаты тестирования:
Поиск опорного плана методом минимального
элемента
Ускорение
Число процессов
Размерность
задачи (m*n)
100
500
1000
10000
100000
1
1
1
1
1
1
2
3
0,841
1,632
1,651
1,756
1,89
4
0,825
1,857
2,211
2,401
2,91
0,773
2,015
2,31
2,682
3,4
Поиск опорного плана методом северо-западного
угла
Ускорение
Число процессов
Размерность
задачи (m*n)
100
500
1000
10000
100000
1
1
1
1
1
1
2
3
0,851
1,653
1,698
1,802
1,925
4
0,836
1,863
2,345
2,5
2,947
0,778
2,185
2,485
2,751
3,68
Поиск оптимального плана методом потенциалов
Ускорение
Число процессов
Размерность
задачи (m*n)
100
500
1000
10000
100000
1
1
1
1
1
1
2
3
0,741
1,558
1,642
1,686
1,88
рис. 19
Подписи
графика
Ряд 1
Ряд 2
Ряд 3
Ряд 4
Ряд 5
Размерность
задачи
100
500
1000
10000
10000
47
4
0,814
1,734
2,148
2,341
2,908
0,744
1,985
2,291
2,583
3,501
График для метода минимального элемента
4
3,5
3
Ряд1
2,5
Ряд2
2
Ряд3
1,5
Ряд4
Ряд5
1
0,5
0
1
2
3
4
График для метода северо-западного угла
4
3,5
3
Ряд1
2,5
Ряд2
2
Ряд3
1,5
Ряд4
Ряд5
1
0,5
0
1
2
3
48
4
График для метода потенциалов
4
3,5
3
Ряд1
2,5
Ряд2
2
Ряд3
1,5
Ряд4
Ряд5
1
0,5
0
1
Согласно
размерностях
2
полученным
задачи
3
результатам
значительно
меньше
4
ускорение
1.
Это
при
значит
небольших
алгоритм
неэффективно работает при небольших размерностях задачи. Однако для
больших размерностей мы получаем значительный выигрыш. Таким образом
при увеличении размерности матриц соотношение операций пересылок и
полезных операций уменьшается.
49
Заключение
В
ходе
работы
были
рассмотрены
технологии
параллельного
программирования (классификация архитектур параллельных ЭВМ, кластеры,
интерфейс
параллельного
программирования
MPI),
способы
анализа
эффективности реализации численных методов посредством формульного
анализа, проанализирована эффективность параллельных алгоритмов. Был
изучен математический аппарат задач линейного программирования. Было
создана и оттестирована программа, реализующая последовательную и
параллельную версии решения транспортной задачи. В результате тестирования
был сделан вывод, что данный алгоритм подходит для решения транспортных
задач. Также были выявлены факторы, влияющие на масштабируемость
параллельных вычислений.
50
Список литературы
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Программирование для многопроцессорных систем в стандарте MPI:
Пособие / Г.И. Шпаковский, Н.В. Серикова. – Мн.: БГУ, 2002
Руководство по работе на вычислительном кластере: Пособие / Г.И.
Шпаковский, А.Е. Верхотуров, Н.В. Серикова. – Мн.: БГУ, 2004
Вл.В.Воеводин, А.П.Капитонова. "Методы описания и классификации
вычислительных систем". Издательство МГУ,1994.
Параллельное программирование с использованием технологии MPI:
Пособие / Анотонов А.С. – М.: Изд-во МГУ, 2004, 71 с.
Метод формульного анализа масштабируемости (ФАМ): Пособие по
курсу “Архитектура высокопроизводительных ЭВМ” / Шпаковский Г.И.
– Мн.: БГУ, 2005
Мулярчик С.Г. Численные методы: Конспект лекций. Мн., БГУ, 2001
Программирование многопроцессорных вычислительных систем:
Пособие / Букатов А.А., Дацюк В.Н., Жегуло А.И. – Ростов-на-Дону:
ООО «ЦВВР», 2003, 208 с.
Hwang K., Briggs F.A. Computer Architecture and Parallel Processing. 1984.
P.32-40.
Flynn M. Very high-speed computing system // Proc. IEEE. 1966. N 54.
P.1901-1909.
Skillicorn D. A Taxonomy for Computer Architectures // Computer. 1988.
V.21. N 11. P.46-57.
Dasgupta S. A Hierarchical Taxonomic System for Computer // 1990. V.23.
N 3. P.64-74.
Интернет адрес: http://www.parallel.ru
Интернет адрес: http://www.mcs.anl.gov/mpi
51
Приложение
52
Download