Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

malyshkin_ve_korneev_vd_-_parallelnoe_programmirovanie_multikompyuterov

.pdf
Скачиваний:
63
Добавлен:
28.03.2016
Размер:
3.12 Mб
Скачать

математическая модель → дискретная (численная) модель → алгоритмы решения задачи → программирование как реализация алгоритма решения задачи. Именно это программирование и рассматривается. Самые важные проектные решения, в

наибольшей степени влияющие на качество решения всей прикладной задачи, принимаются на этапе «физической» формулировки задачи, где она описывается в терминах предметной области. Следующий по важности этап – математическая модель и алгоритмизация решения задачи и лишь последний этап – программирование. Ошибки, допущенные на более раннем этапе уже непоправимы на последующих.

Например, выбор плохого алгоритма решения задачи невозможно исправить сколь угодно хорошим программированием и, в

частности, последовательный по природе алгоритм параллельно не исполнить. Поэтому максимальные усилия в решении задачи должны прикладываться на ранних этапах. Но надо также иметь ввиду, что неудачное программирование параллельного исполнения алгоритма может многократно (в десятки, сотни и тысячи раз) ухудшить качество решения задачи по сравнению со средне хорошей программой. И в параллельном программировании такое ухудшение очень легко допустить!

Потому так важно знание методов параллельного программирования или хотя бы понимание проблемы.

Книга построена на материалах курсов по параллельному программированию, которые в разных вариантах читаются с 1996

года в Новосибирском государственном техническом университете для студентов факультета Прикладной математики и информатики и в Новосибирском государственном университете для студентов факультета Информационных технологий. Частями материалы книги были опубликованы в нескольких учебных пособиях. Список рекомендованной литературы приведен в конце книги. Конечно, исчерпывающе полной информации о программировании мультикомпьютеров книга не содержит, однако после её прочтения усердный читатель будет в состоянии самостоятельно разобраться с конкретными языками, системами и технологиями параллельного программирования и правильно их применить на практике.

Демонстрируя плюсы и минусы параллелизма, авторы кардинально распараллелили свою работу над книгой: главы 1-8

написаны В.Э.Малышкиным, глава 8 – В.Д.Корнеевым, глава 9 –

В.П.Марковой.

Книга предназначена в первую очередь для студентов и аспирантов вузов. Другая многочисленная категория читателей – начинающие прикладные программисты.

ВВЕДЕНИЕ

После долгого (по компьютерным меркам), примерно 40-

летнего, развития параллельное программирование из экзотического занятия ученых довольно быстро превращается в массовую профессию. Невероятно быстрое развитие электронных технологий обеспечило появление на рынке большого числа коммерческих суперкомпьютеров. Они успешно применяются для решения многих задач в науке (математическое моделирование) и промышленности (банковские задачи,

управление сложными техническими устройствами). Да и хорошо знакомые всем монопроцессорные компьютеры претерпели большие изменения и их функциональные устройства уже давно в большей или меньшей мере используют параллелизм.

Множество проблем параллельного программирования до сих пор не нашли хорошего решения в современных теориях,

языках, системах и технологиях параллельного программирования. По этой причине параллельная реализация алгоритмов наталкивается на значительные трудности.

Разработка, отладка и сопровождение параллельных программ оказываются весьма сложным делом. Нередко встречаются ситуации, когда долго и правильно работающая программа вдруг выдаёт ошибочные результаты.

Такие ситуации известны и в последовательном программировании. Однако в параллельном программировании

подобные проблемы усугубляются дополнительной необходимостью правильно (содержательно и во времени)

запрограммировать управление и межпроцессные коммуникации,

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

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

Каждое срабатывание неверной программы может вырабатывать другой результат. Обнаружить такие ошибки крайне сложно. По этой причине в языках параллельного программирования стараются не допускать большого недетерминизма либо ограничить его некоторыми строго определенными рамками.

Параллельные программы должны обладать необычными динамическими свойствами (настраиваемость на все доступные ресурсы, переносимость в классе мультикомпьютеров,

динамическая балансировка загрузки, динамический учет свойств задачи), без которых обходятся в последовательные программы.

В результате нынешнее общесистемное программное обеспечение и системы программирования оказались плохо пригодными для создания параллельных программ, непомерно

велика оказалась трудоёмкость параллельного программирования. А программы с динамическими свойствами,

как известно, могут бесконечно долго отлаживаться. Хотя,

конечно, есть немало задач, сравнительно просто программируемых для исполнения на мультикомпьютерах, все же многие задачи трудно распараллелить и запрограммировать.

Да и как показывает практика, не так много в мире заготовлено алгоритмов, пригодных для хорошей параллельной реализации.

Все это делает параллельное программирование занятием для людей, хорошо образованных в математике и хорошо обученных нужным технологиям.

Наиболее распространены сейчас системы параллельного программирования на основе MPI (Message Passing Interface).

Идея MPI исходно проста и очевидна. Она предполагает представление параллельной программы в виде множества параллельно исполняющихся процессов (программы процессов обычно разработаны на обычном последовательном языке программирования С или Фортран), взаимодействующих друг с другом в ходе исполнения для передачи данных с помощью коммуникационных процедур. Они и составляют библиотеку

MPI. Однако надлежащая реализация MPI для обеспечения межпроцессорных коммуникаций оказалась довольно сложной.

Такая сложность связана с необходимостью достижения высокой производительности программ, необходимостью использовать

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

большим разнообразием в выборе алгоритмов реализации коммуникационных процедур в зависимости от режима обработки данных в процессорных элементах мультикомпьютера.

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

Другой источник сложности - учет в реализации коммуникаций особенностей передачи данных между процессами. Чем лучше учитываются особенностей оборудования и режима обработки данных в процессорных элементах, тем лучше параллельная программа. Чем меньше учет

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

Программирование с использованием MPI оказалось обманчиво простым делом. Обманчивым, потому что известны простенькие очевидные параллельные программы, состоящие буквально из двух-трёх десятков операторов, которые содержат трудно обнаруживаемые ошибки. И хуже того, эти программы правильно или правдоподобно работают (особенно на тестах) и

обнаруживают ошибку в самый неподходящий момент.

Для нормального освоения материала читателю необходимы знания дискретной математики, операционных систем, систем программирования, архитектуры современных

процессоров, ЭВМ и мультикомпьютеров, умение программировать, все - в рамках университетской программы факультетов прикладной математики и информатики. Следует также быть готовым к тому, что разовым кавалерийским

«наскоком» материалом не овладеть. Книгу придется перечитывать и надо постараться, чтобы эти витки повторений развернулись в спираль растущего понимания предмета.

1. ПОНЯТИЕ ВЫЧИСЛИМОЙ ФУНКЦИИ

1.1.Неформальное ведение

Прежде всего, обсуждаются понятия вычислимой функции и алгоритма, которое понадобится для формирования правильной исходной позиции при анализе, конструировании и размышлениях о программах. Существует много разных формализаций понятия вычислимой функции (в [1]

рассматриваются и сравниваются 12 различных формализаций понятия алгоритм и в заключение автор предлагает еще одно).

Здесь обсуждается формализация Клини, следуя изложению в

[2,3], которое наиболее соответствует нашим целям. За дополнительной информацией можно обратиться в [4].

Понятие вычислимой функции - ключевое понятие из тех,

которыми должен владеть программист и вообще всякий,

работающий в области вычислений. Задача этой главы - дать начальные понятия теории алгоритмов в ее приложении к программированию.

Говоря о программе, всегда имеют ввиду всевозможные способы ее исполнения, включая частный случай -

последовательное исполнение. Термин последовательная программа используется, чтобы подчеркнуть единственно допустимый способ исполнения программы.

5

Многочисленные примеры алгоритмов известны каждому программисту. Интуитивно ясно, какие процессы могут быть отнесены к алгоритмам. Однако на интуитивном уровне понятие алгоритма остается неуловимо понятным и одновременно совершенно непонятным1. Каждый легко может определить,

является ли некоторый предъявленный процесс алгоритмом или нет. Все, по-видимому, согласятся, что вычисление корней квадратного полинома по формуле Виета есть алгоритм. Однако без формализации понятия алгоритма невозможно показать, что не существует алгоритмического решения некоторой проблемы.

Для построения формализации понятия алгоритма можно сначала просмотреть ряд примеров алгоритмов и попробовать выделить неформальные свойства любого процесса,

претендующего быть алгоритмом. Затем можно построить формальную теорию, удовлетворяющую выделенным неформальным свойствам. Так, собственно, и строится любая математическая теория.

Исходя из подобных примеров, А.И.Мальцев [2]

перечисляет следующие неформальные свойства алгоритмов.

а).Алгоритм - это процесс последовательного построения величин, идущий в дискретном времени таким образом, что в

1 В [4] авторы на стр. 13 утверждают, что “... в теории алгоритмов ...

открытия состоят не столько в получении новых результатов, сколько в обнаружении новых понятий и в уточнении старых.”

6

начальный момент задается исходная конечная система величин,

а в каждый следующий момент новая конечная система величин получается по определенному закону (программе) из системы величин, имеющихся в предыдущий момент времени

(дискретность алгоритма).

И действительно, в последовательной программе операторы исполняются, вычисляя шаг за шагом новые значения из предшествующих.

б).Система величин, полученная в какой-то (не начальный) момент времени, однозначно определяется системой величин, полученных в предшествующие моменты времени

(детерминированность алгоритма).

Правильная программа, исполняясь несколько раз с одними и теми же входными данными, должна всегда выработать один и тот же результат.

в).Закон получения последующей системы величин из предшествующей должен быть простым и локальным

(элементарность шагов алгоритма).

г).Если способ получения последующей величины из какой-нибудь заданной величины не дает результата, то должно быть указано, что надо считать результатом алгоритма

(направленность алгоритма).

Если программа не может вычислить нужный результат,

она должна сообщить об ошибке, описать ее и подсказать, как ее

7

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]