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

Андрей Карпов
Статей: 321



Аннотация

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

Читателю

Данный документ является частью серии статей, посвященных вопросам создания качественных и эффективных программных решений для современных 64-битных многоядерных систем. Ознакомиться с другими статьями вы можете на сайте http://www.viva64.com.

Введение

Программистам, начинающим использовать многопроцессорные ЭВМ, очень трудно сориентироваться во всех тонкостях их использования при разработке программ по прикладным задачам. Как показывает практика, трудности начинаются, когда к разрабатываемому параллельному программному обеспечению предъявляется требование его эффективности и мобильности. Это связано с тем, что универсальные средства, облегчающие труд программиста и обеспечивающие полноценный доступ к отладочной информации, находятся в стадии разработки. Проблема заключается в отсутствии стандартов в области создания и отладки программ для параллельных систем, по причине молодости компьютерной отрасли. Соответственно на настоящий момент отсутствуют логически завершенные учебные курсы по параллельному программированию для начинающих.

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

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

1. История развития многопроцессорных комплексов и параллельных вычислений

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

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

Вычислительное направление применения компьютеров всегда оставалось основным двигателем прогресса в компьютерных технологиях. Не удивительно поэтому, что в качестве основной характеристики компьютеров используется такой показатель, как производительность - величина, показывающая, какое количество арифметических операций он может выполнить за единицу времени. Именно этот показатель с наибольшей очевидностью демонстрирует масштабы прогресса, достигнутого в компьютерных технологиях. Так, например, производительность одного из самых первых компьютеров EDSAC составляла всего около 100 операций в секунду, тогда как пиковая производительность Earth Simulator, одного из самых мощных на сегодняшний день суперкомпьютеров, оценивается в 40 триллионов операций в секунду. Т.е. произошло увеличение быстродействия в 400 миллиардов раз! Невозможно назвать другую сферу человеческой деятельности, где прогресс был бы столь очевиден и так велик. Естественно, что у любого человека сразу же возникает вопрос: за счет чего это оказалось возможным? Как ни странно, ответ довольно прост: примерно 1000-кратное увеличение скорости работы электронных схем и максимально широкое распараллеливание обработки данных.

Идея параллельной обработки данных как мощного резерва увеличения производительности вычислительных аппаратов была высказана Чарльзом Бэббиджем примерно за сто лет до появления первого электронного компьютера. Однако уровень развития технологий середины 19-го века не позволил ему реализовать эту идею. С появлением первых электронных компьютеров эти идеи неоднократно становились отправной точкой при разработке самых передовых и производительных вычислительных систем [3]. Без преувеличения можно сказать, что вся история развития высокопроизводительных вычислительных систем - это история реализации идей параллельной обработки на том или ином этапе развития компьютерных технологий, естественно, в сочетании с увеличением скорости и надежности работы электронных схем.

Принципиально важными решениями в повышении производительности вычислительных систем были: введение конвейерной организации выполнения команд; включение в систему команд векторных операций, позволяющих одной командой обрабатывать целые массивы данных; распределение вычислений на множество процессоров. Сочетание этих 3-х механизмов в архитектуре суперкомпьютера Earth Simulator, состоящего из 5120 векторно-конвейерных процессоров, и позволило ему достичь рекордной производительности, которая в 20000 раз превышает производительность современных персональных компьютеров.

Очевидно, что такие системы чрезвычайно дороги и изготавливаются в единичных экземплярах [4]. Ну, а что же производится сегодня в промышленных масштабах? Широкое разнообразие производимых в мире компьютеров с большой степенью условности можно разделить на четыре класса: персональные компьютеры (Personal Computer - PC); рабочие станции (WorkStation - WS); суперкомпьютеры (Supercomputer - SC); кластерные системы [5].

Условность разделения связана в первую очередь с быстрым прогрессом в развитии микроэлектронных технологий. Производительность компьютеров в каждом из классов удваивается в последние годы примерно за 18 месяцев (в соответствии с так называемым законом Мура). В связи с этим, суперкомпьютеры начала 90-х годов зачастую уступают в производительности современным рабочим станциям, а персональные компьютеры начинают успешно конкурировать по производительности с рабочими станциями. Тем не менее, попытаемся каким-то образом классифицировать их.

Персональные компьютеры. Как правило, в этом случае подразумеваются однопроцессорные системы на платформе Intel или AMD, работающие под управлением однопользовательских операционных систем (Microsoft Windows и др.). Используются в основном как персональные рабочие места.

Рабочие станции. Это чаще всего компьютеры с RISC процессорами с многопользовательскими операционными системами, относящимися к семейству ОС UNIX. Содержат от одного до четырех процессоров. Поддерживают удаленный доступ [6]. Могут обслуживать вычислительные потребности небольшой группы пользователей.

Суперкомпьютеры. Отличительной особенностью суперкомпьютеров является то, что это, как правило, большие и, соответственно, чрезвычайно дорогие многопроцессорные системы. В большинстве случаев в суперкомпьютерах используются те же серийно выпускаемые процессоры, что и в рабочих станциях. Поэтому зачастую различие между ними не столько качественное, сколько количественное. Например, можно говорить о 4-х процессорной рабочей станции фирмы SUN и о 64-х процессорном суперкомпьютере фирмы SUN. Скорее всего, в том и другом случае будут использоваться одни и те же микропроцессоры.

Кластерные системы. В последние годы широко используются во всем мире как дешевая альтернатива суперкомпьютерам. Система требуемой производительности собирается из готовых серийно выпускаемых компьютеров, объединенных опять же с помощью некоторого серийно выпускаемого коммуникационного оборудования. Таким образом, многопроцессорные системы, которые ранее ассоциировались в основном с суперкомпьютерами, в настоящее время прочно утвердились во всем диапазоне производимых вычислительных систем, начиная от персональных компьютеров и заканчивая суперкомпьютерами на базе векторно-конвейерных процессоров. Это обстоятельство, с одной стороны, увеличивает доступность суперкомпьютерных технологий, а с другой, повышает актуальность их освоения, поскольку для всех типов многопроцессорных систем требуется использование специальных технологий программирования для того, чтобы программа могла в полной мере использовать ресурсы высокопроизводительной вычислительной системы [7, 8]. Обычно это достигается разделением программы с помощью того или иного механизма на параллельные ветви, каждая из которых выполняется на отдельном процессоре.

2. Использование многопроцессорных систем

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

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

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

3. Параллелизм в задачах численного моделирования

3.1. Статистическая и динамическая балансировка

При решении широкого круга задач математической физики на многопроцессорных системах с помощью сеточных методов [10], широко используются два подхода для построения параллельных программ. Первый получил название метода геометрического параллелизма, второй - метод коллективного решения [11]. Идеи, положенные в основу этих методов, отличает простота и элегантность. Не будет преувеличением утверждение, что подавляющее большинство решаемых в настоящее время с помощью методов конечных разностей или конечных элементов задач газовой динамики, микроэлектроники, экологии, и многих других эффективно решаются именно методом геометрического параллелизма. Методом коллективного решения целесообразно пользоваться при построении параллельных алгоритмов решения задач методами Монте-Карло, при проведении серий однотипных расчетов и в ряде других случаев.

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

3.2. Параллелизм типа "коллективного решения"

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

Рассмотрим в качестве примера разностную сетку как набор независимых узлов, в каждом из которых следует определять ряд параметров на каждом временном слое с помощью решения системы ОДУ с соответствующими начальными данными [12]. Решение системы в каждом узле зависит только от локальных значений переменных в этом узле. При этом вычислительная нагрузка в различных узлах значительно отличается. При построении параллельной программы с помощью классического метода "коллективного решения" используется следующая стратегия распределения вычислительной нагрузки.

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

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

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

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

3.3. Геометрический параллелизм

Исходную задачу мы можем разбить на группу областей, независимых друг от друга на каждом расчетном шаге и пересекающихся только по границе разбиения. Т.е. мы рассчитываем (n+1)-м временной слой в каждой области, затем согласуем границы и переходим к расчету следующего слоя.

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

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

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

4. Эффективность параллельной программы

4.1. Понятие эффективной параллельной программы

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

Написать эффективную параллельную программу намного труднее, чем последовательную. Создание программного обеспечения для параллельных компьютеров - это центральная проблема суперкомпьютерных вычислений [13].

Частично проблема выбора оптимального числа параллельных ветвей в соответствии с критерием минимума суммарных затрат времени может быть решена в автоматах генерации параллельной программы. Частный случай разрешения этой проблемы для вычислительных систем с MIMD архитектурой рассмотрен в статье Костенко В.А. "К вопросу об оценке оптимальной степени параллелизма" [14].

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

4.2. Свойства идеальной параллельной программы

Отметим, что идеальная параллельная программа обладает следующими свойствами:

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

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

  • укрупнением единиц распараллеливания;
  • уменьшением сложности алгоритмов генерации параллельных процедур (подпрограмм);
  • изначальной подготовкой пакета различных вариантов исходных данных;
  • распараллеливанием алгоритмов генерации параллельных процедур (подпрограмм).

4.3. Адаптации программ к архитектуре параллельных компьютеров

Основные этапы самого процесса адаптации программ к архитектуре параллельных компьютеров, а также описание задач, возникающих на каждом из этих этапов, представлены в статье Антонова А.С. "Эффективная адаптация последовательных программ для современных векторно-конвеерных и массивно- параллельных супер-ЭВМ" [15]. На некоторые из задач, с которыми столкнулись авторы проведенного исследования, хотелось бы обратить особое внимание. Среди них:

  • исследование общей структуры программы;
  • выделение основного вычислительного ядра, локализация ввода-вывода;
  • определение потенциального параллелизма фрагмента;
  • выделение последовательных фрагментов вычислений и попытка использования альтернативных алгоритмов для таких фрагментов;
  • определение и минимизация точек перераспределения данных;
  • преобразование традиционных циклов под параллельные алгоритмы;
  • минимизация числа и объема временных массивов для оптимизации работы с кэш-памятью;
  • переход от исходной программы, работающей с полными массивами, к программе, обрабатывающей только локальную порцию, распределенную на процессор: изменение размеров массивов и соответствующее преобразование текста программы.

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

Процесс разработки параллельной программы очень длителен и трудоемок, не смотря на то, что, как правило, на момент ее создания уже имеется реализация ее "последовательного" аналога. Обычно программа разрабатывается на машине с одной архитектурой, а ее практическое применение производится на другой, с отличной от первой топологией, но при этом более мощной. Такой подход позволяет экономить машинное время на более мощных суперЭВМ, число которых на порядок меньше, по сравнению с более дешевыми моделями суперкомпьютеров.

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

На сегодняшний день не существует универсальных средств адаптации программ к конкретной архитектуре суперЭВМ, поэтому большую часть этой проблемы приходится решать вручную, что делает процесс очень трудоемким [15]. Для облегчения труда программиста в математических институтах РАН разрабатываются библиотеки эффективных процедур и алгоритмов под конкретные архитектуры суперЭВМ (УРО РАН, НИВЦ МГУ им. М.В.Ломоносова). Обращение к этим библиотекам может частично облегчить труд программиста-прикладника не только на этапе модификации программы под более мощные суперЭВМ, но и на этапе первичной разработки параллельной программы.

5. Проблемы отладки и мониторинга

Проблема отладки и мониторинга очень актуальна, ввиду отсутствия менеджеров, которые предоставляли бы разработчику прикладного ПО промежуточную информацию, особенно актуальную на начальном этапе проектирования [16]. Ситуация становится еще сложнее, если речь идет об управлении распределенными разнородными системами. В общем случае задача отладки и мониторинга таких систем ставится следующим образом [17, 18]. Имеется сеть разнородных по аппаратным и/или программным платформам узлов, на каждом из которых параллельно выполняется множество процессов (нитей) [19]. Имеется также совокупность пользователей, каждый из которых желает отслеживать и/или воздействовать на свое подмножество программных и/или аппаратных компонентов.

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

Для дальнейшего развития средств отладки/мониторинга важно формирование набора спецификаций, определяющих функциональность разрабатываемых программ-менеджеров [20].

Программы представляют собой сложные динамические системы. Особенно это относится к параллельным и интерактивным программам (работающим в диалоговом режиме), которые включают в себя сложные взаимодействия между процессами программы и взаимодействие с внешним миром. Исследование таких программ нельзя проводить в терминах отношений между входными и выходными значениями программы, как это обычно делается для последовательных программ. Это показывает, что проверка и доказательство правильности работы таких программ требует разработки адекватных средств формальной спецификации. В частности, необходимо иметь возможность формально выражать отношения между состояниями системы в моменты времени, когда происходят те или иные события при работе программной системы. В статье Валиева М.К. "Применение временной логики к спецификации программ" [21] обсуждается подход к анализу параллельной программы, основанный на применении методов математической логики.

Функция управления процессами является одной из важнейших задач операционной системы. Для выполнения этой задачи на суперЭВМ может использоваться технология семафоров [22], которая заключается в блокировке и разблокировке процессов.

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

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

6. Моделирование объектов распараллеливания

Разрабатываемые подходы использования компьютеров основаны на тезисе: компьютер - это инструмент познания, при помощи которого добывают новую информацию об исследуемом объекте или явлении [23]. Следовательно, квалифицированный пользователь должен владеть современной методологией познания - моделированием. Моделирование - это не только конструирование объекта познания, но и метод познания. Моделирование есть методология работы, эффективность которой раскрывается лишь при высокой квалификации специалистов и при их свободном владении современными средствами формализации - логикой и математикой.

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

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

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

Принимая во внимание, что разработка параллельного программного обеспечения (объекта распараллеливания) на сегодняшний день представляется достаточно сложной, проблема создания теоретических основ его проектирования стоит еще более остро. Кроме анализа структуры и свойств разрабатываемых программ на всех этапах проектирования моделирование может позволить описать все особенности взаимодействия параллельных процессов на уровне имитационной модели. В работе Маркова Н.Г. "Моделирование параллельного программного обеспечения с использованием PS-сетей" [25], на основании требований, предъявляемых к параллельному программному обеспечению, предлагается использование графоаналитического подхода к имитационному моделированию проекта программы. Целью упомянутой работы явилась выработка требований к аппарату имитационного моделирования параллельного программного обеспечения, а также создание аппарата, сохраняющего баланс между математической простотой и строгостью - с одной стороны, и практической применимостью - с другой.

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

Проблема создания современных пакетов прикладных программ, ориентированных на широкий класс задач механики, выходит далеко за рамки синтеза этих задач из отдельных программных модулей. Она связана с глобальной оптимизацией всей вычислительной последовательности задач [27]. Поэтому пакет программ, как продукт, используемый в научно-прикладных целях не только самими создателями, но и конечными пользователями, должен производиться на качественно новом уровне программирования. При разработке современного программного обеспечения необходимо не только учитывать нелинейные (с обратным влиянием) связи между всеми звеньями вычислительной цепочки, но и реализовывать возможность сегментации программы на высоком, среднем и низшем уровнях параллелизации вычислительного процесса. Сегментация необходима для более эффективного использования многопроцессорных систем. Кроме этого, при разработке численного алгоритма следует увязывать между собой вопросы точности и надежности конечного программного обеспечения, а также вопросы его эффективности и переносимости под конкретную архитектуру суперЭВМ. Такое параллельное программирование существенно отличается от традиционного - последовательного программирования.

6.1. Уровни декомпозиции объектов распараллеливания

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

В общем случае, при создании операционных систем параллельной обработки данных центральными являются две взаимосвязанные проблемы: первая - минимизация времени выполнения заданных объемов вычислений; вторая - синхронизация большего числа одновременно взаимодействующих параллельных процессов [28]. Для решения каждой из них разрабатываются свои подходы. В упомянутой работе предлагается учитывать тот факт, что при реализации сложных механизмов синхронизации происходит рост накладных расходов, что самым негативным образом сказывается на оперативности решения задач. Выявленная проблема в многопроцессорных системах с ограниченным параллелизмом по числу процессоров разрешается методом минимизации общего времени выполнения для заданных объемов вычислений.

Результаты реализации такого подхода относятся, прежде всего, к "операционному параллелизму". В таких системах может оказаться полезным метод, основанный на построении расписания моментов запуска и окончания каждого из конкурирующих процессов. Это дает возможность не только наиболее эффективно решить проблему синхронизации процессов, но и существенно минимизировать системные затраты и непроизводительные простои процессоров. Метод по управлению взаимодействием между параллельными процессами осуществляется с помощью технологии "семафоров" [29].

При создании исследователями прикладного программного обеспечения практическая ценность разрабатываемых ими численных методик определяется не только результатами, полученными с их помощью при исследовании сложных явлений, но и их применимостью на конкретных суперЭВМ. Обнаружено, что с ростом производительности персональных компьютеров, стимулирующим развитие вычислительных методов, происходят также качественные изменения в архитектуре суперкомпьютеров, ориентированные на углубление параллелизма и специализации процессоров. А это, в свою очередь, стимулирует поиск новых представлений физических явлений, допускающих более прямое отображение на архитектуру вычислительной техники. Так, например, появился клеточно-автоматный подход в газо- и гидродинамике [30]. В статье представлена новая модель параллельных вычислений - клеточно-нейронная сеть (КНС). В ней описывается суть клеточно-автоматной модели, а также показаны широкие возможности КНС для представления пространственно-временной динамики активных сред. Эта модель может служить основой для создания параллельных программ, предназначенных для решения дифференциальных уравнений в частных производных, а также для имитации явлений нелинейной динамики. Отмечается, что применение КНС-методов вычисления с использованием параллельных процессоров позволит резко повысить решение задач такого класса.

Целью любой работы, связанной с параллельным программированием, является рассмотрение взаимосвязей между структурой математического алгоритма и архитектурой многопроцессорной вычислительной системы. В зависимости от сложности поставленной задачи возможна реализация различных видов взаимосвязей. Последние называются уровнями декомпозиции исходной задачи. Они могут быть определены следующим образом [31]:

Первый уровень - разбивка задачи на подзадачи.

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

Третий уровень - распараллеливание отдельных процедур.

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

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

6.2. Возможность распараллеливания объектов в алгоритмах численного моделирования

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

Основные численные методы (метод конечных элементов, метод конечных разностей и другие) сводят исходную задачу к формированию системы линейных алгебраических уравнений (СЛАУ) и последующему ее решению [32, 33]. В последовательной программе, например, реализующей метод конечных элементов, основная часть времени приходится на формирование самой СЛАУ (расчет коэффициентов), а не на ее решение. Важно также отметить, что элементы матрицы СЛАУ зависят только от своего положения в ней и не зависят друг от друга. В этом случае складывается благоприятная ситуация для применения параллельных алгоритмов формирования СЛАУ. При этом необходимо выполнить следующие операции:

  • расщепить вычислительную задачу на параллельные ветви;
  • провести вычисления в этих ветвях;
  • сформировать и решить СЛАУ (тем или иным способом).

В статье [34] приводится пример описания параллельного алгоритма формирования СЛАУ, а также особенности применения технологии MPI.

В статье [35] рассматривается реализация метода Гауса для решения разреженных систем линейных алгебраических уравнений на ЭВМ с параллельными процессами и общей памятью. Отмечается, что разбиение на несколько потоков команд возможно либо по функциональному признаку, либо непосредственно по данным. В предложенной постановке задачи возможна только реализация разбиения по данным. При этом обращается внимание на допустимость выделения из задачи несвязных областей.

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

Можно выдвинуть тезис о том, что циклы - это одни из наиболее важных программных конструкций с доступным параллелизмом. Проблема извлечения мелкозернистого параллелизма (параллелизма внутри циклов) из этих конструкций имеет важное значение в свете возрастающей популярности суперскалярных ЭВМ [36].

В статье [37] представлены алгоритмы вычислительных процедур, а также полученные с их помощью результаты, основанные на методологии сверхточной параллельной арифметики. Эту методологию предлагается применять для решения прикладных задач линейной алгебры и математической физики. Упомянутая работа посвящена созданию алгоритмических и программных средств поддержки точных матричных вычислений, основанных на комплексном использовании параллелизма MIMD-систем [38] и многоразрядной арифметики с динамической длиной операндов. Особое внимание уделяется влиянию округлений в базовых матричных операциях на точность вычисления матричных задач. В работу включены библиотека программ, а также тестовые примеры, демонстрирующие эффективность разработанного подхода. Представленные результаты демонстрируют возможность выполнения на параллельных ЭВМ точных матричных вычислений с одновременной передачей сообщений. Разработанный пакет прикладных программ может быть легко адаптирован к выполнению на параллельных компьютерах различных типов.

Очевидно, что использование многоразрядной арифметики не является типичным для суперкомпьютеров. Ее применение неизбежно ведет к замедлению выполнения приложения. Однако потери времени в этом случае могут быть компенсированы не только проведением расчетов с максимальным использованием стандартных типов данных, но также и адаптацией высокоэффективных параллельных алгоритмов, изначально приспособленных к исполнению на однопроцессорной ЭВМ, к средствам высокоточной обработки. Многоразрядная арифметика должна применяться только в самых "тяжелых" участках алгоритма. Но даже в этом случае динамическая длина операндов помогает обрабатывать только ограниченное количество разрядов. Именно таким образом предлагается достигать баланс между скоростью и точностью вычислений.

В статье [39] подробно анализируется векторно-конвейерная архитектура суперЭВМ семейства CRAY. В результате проведенных исследований обнаружены факторы программирования, снижающие производительность суперЭВМ. К ним относятся:

  • секционирование длинных векторных операций (увеличивает накладные расходы);
  • перегрузка буферов команд (увеличивает накладные расходы);
  • конфликты при обращении в память (в случае использования общих ресурсов);
  • ограниченная пропускная способность каналов передачи данных (зависит от архитектуры суперЭВМ);
  • и другие.

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

В ряде вышеупомянутых исследовательских работ особо выделяется разработка, в которой структура алгоритма не приспосабливается к структуре ЭВМ, а сама определяет структуру последней [40]. Работа ориентирована на создание новых современных вычислительных технологий и методов параллельного программирования, направленных на повышение эффективности решения фундаментальных научных и прикладных проблем в области численного моделирования задач аэродинамики и газовой динамики. Особое внимание в ней уделено теоретическим вопросам распараллеливания. В работе рассматриваются различные методы декомпозиции полной задачи на ряд одновременно выполняемых подзадач. Весьма важным, имеющим стратегическое значение, является теоретический этап исследования проблемы распараллеливания программного комплекса, то есть разработка принципов (а на их основе - конкретных методов и способов) оптимальной декомпозиции всей совокупности алгоритмов, составляющих процессорную систему и ее операционную среду.

В статье предлагаются три основных вида декомпозиции (сегментации) для планируемого к разработке программного комплекса "Поток-3" в процессе подготовки к параллелизации составляющих его алгоритмов:

  • физико-математический;
  • геометрический;
  • технологический.

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

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

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

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

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

Применение последнего вида декомпозиции предполагает повышенное внимание к эффективности параллельной программы.

Заключение

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

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

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

Библиографический список использованной литературы

  • Дацюк В.Н., Букатов А.А., Жегуло А.И. Электронное методическое пособие по курсу "Многопроцессорные системы и параллельное программирование" Часть I. Введение в организацию и методы программирования многопроцессорных вычислительных систем. Ростов-на-Дону, 2000.
  • Неупокоев Е.В., Тарнавский Г.А., Вшивков В.А. Распараллеливание алгоритмов прогонки: целевые вычислительные эксперименты. // Автометрия, N 4, том 38, 2002, стр. 74-87.
  • Корнеев В.В. Параллельные вычислительные системы. М:"Нолидж", 1999. - 320 с.
  • Шпаковский Г.И. Архитектура параллельных ЭВМ. - Минск, 1989. - 136 c.
  • Лацис А.О. Как построить и использовать суперкомпьютер. М.: изд-во Бестселлер, 2003. 274 с.
  • Лабутин Д.Ю. Система удаленного доступа к вычислительному кластеру (менеджер доступа): Высокопроизводительные параллельные вычисления на кластерных системах. Материалы второго международного научно-практического семинара, Нижний Новгород: Издательство Нижегородского университета, 2002. С.184-187.
  • Афанасьев К.Е. Многопроцессорные вычислительные системы и параллельное программирование: Учебное пособие/ Афанасьев К.Е., Стуколов С.В., Демидов А.В., Малышенко В.В.; Кемеровский госуниверситет. - Кемерово: Кузбассвузиздат, 2003. - 182 с.
  • Немнюгин С.А., Стесик О.Л. Параллельное программирование для многопроцессорных вычислительных систем. - СПб.: БХВ-Петербург, 2002. - 400с.
  • Демидов А.В., Сидельников К.В. Эмуляция параллельной обработки данных на персональном компьютере // XLI Международная научная студенческая конференция "Студент и научно-технический прогресс". Сб. трудов. Новосибирск, 2003. С. 110-111.
  • Самарский А.А., Николаев Е.С. Методы решения сеточных уравнений. М.:Наука,1978. 561с.
  • Самофалов В.В., Коновалов А.В., Шарф С.В. Динамизм или статичность: поиск компромисса // Труды Всероссийской научной конференции "Высокопроизводительные вычисления и их приложения". М., 2000. C. 165-167.
  • Годунов С.К., Рябенький В.С. Разностные схемы. - М.: Наука, 1973. - 400 c.
  • Воеводин В.В. Суперкомпьютеры: вчера, сегодня, завтра. // Сборник научно-популярных статей Российская наука на заре нового века. Под редакцией академика В.П. Скулачева. М.: научный мир, 2001. С. 475-483.
  • Костенко В.А. К вопросу об оценке оптимальной степени параллелизма. // Программирование. 1995, 4, с. 24-28.
  • Антонов А.С., Воеводин Вл.В. Эффективная адаптация последовательных программ для современных векторно-конвейерных и массивно- параллельных супер-ЭВМ. // Программирование. 1996, 4, с. 37-51.
  • Салливан Э. Время — деньги. Создание команды разработчиков программного обеспечения/Пер, с англ. - М.: Издательско-торговый дом "Русская Редакция", 2002. - 368 стр.: ил.
  • Галатенко В.А., Костюхин К.А. Отладка и мониторинг распределенных разнородных систем. // Программирование, 2002, 1. С. 27-37.
  • Крюков В.А., Удовиченко Р.В. "Отладка DVM программ" Программирование. - 2001. N. 3.-C.19-29.
  • Сапожников А.П., Сапожникова Т.Ф. Реинжениринговая технология распределенных вычислений в локальной сети. Труды международной конференции "Распределенные вычисления и Грид-технологии в науке и образовании" (Дубна, 29 июня-2 июля 2004 г.). 11-2004-205, Дубна, ОИЯИ, 2004. Стр.183-190.
  • Самофалов В.В., Коновалов А.В. Технология отладки программ для машин с массовым параллелизмом // "Вопросы атомной науки и техники". Сер. Математическое моделирование физических процессов. 1996. Вып. 4. С. 52-56.
  • Валиев М.К. Применение временной логики к спецификации программ. // Программирование. 1998, 2, с. 3-9.
  • Крюков В.А. Операционные системы распределенных вычислительных систем. (учебный курс).
  • Захарьева Н.Л., Хозиев В.Б., Ширков П.Д. Моделирование и образование.// Математическое моделирование, 1999, т. 11, N 5, с. 101-116.
  • Шалыто А.А. Автоматное проектирование программ. Алгоритмизация и программирование задач логического управления. Журнал "Известия академии наук. Теория и системы управления" Номер 6. Ноябрь-Декабрь 2000. С.63-81.
  • Марков Н.Г. Мирошниченко Е.А., Сарайкин А.В. Моделирование параллельного программного обеспечения с использованием PS-сетей. // Программирование. 1995, N 5, с. 24-32.
  • Ершов Н.М. Построение графов вычислительных алгоритмов методом автотрассировки. // Программирование. 2000, N 6, с. 58-64.
  • Гергель В.П., Стронгин Р.Г. Основы параллельных вычислений для многопроцессорных вычислительных систем. Учебное пособие. Нижний Новгород: Изд-во ННГУ им. Н.И. Лобачевского, 2000. - 176 с.
  • Иванников В.П., Ковалевский Н.С., Метельский В.М. О минимальном времени реализации распределенных конкурирующих процессов в синхронных режимах. // Программирование. 2000, N 5, с. 44-52.
  • Валиев М.К. Применение временной логики к спецификации программ. // Программирование. 1998, 2, с. 3-9.
  • Бандман О.Л. Клеточно-нейронные модели пространственно-временной динамики. // Программирование. 1999, N 1, с. 4-17.
  • Дуйсекулов А.Е., Елизарова Т.Г. Использование многопроцессорных вычислительных систем для реализации кинетически-согласованных разностных схем газовой динамики. // Математическое моделирование, 1990, т. 2, N 7, C. 139-147.
  • Дмитриева О.А. Параллельные алгоритмы численного решения систем обыкновенных дифференциальных уравнений. //Мат. Моделирование N 5, 2000, C. 81-86.
  • Бахвалов Н.С. Численные методы // Главня редакция физико-математической литературы изд-ва "Наука", М., 1975 г. - 632 с.
  • Москвин Д.Б., Павлов В.А. Опыт использования MPI технологии для решения системы интегральных уравнений Фредгольма второго порядка. //Математическое моделирование, 2000, N 8, C. 3-8.
  • Заворин А.Н. Параллельное решение линейных систем при моделировании электрических цепей. // Математическое моделирование, 1991, т. 3, N 3, C. 91-96.
  • Ки-Чанг Ким. Мелкозернистое распараллеливание неполных гнезд циклов. // Программирование. 1997, N 2, C. 52-66.
  • Морозов В.А., Важенин А.П. Матричная арифметика многократной точности для параллельных систем с передачей сообщений. // Программирование. 1999, N1, C. 66-77.
  • Воеводин В.В. Математические модели и методы в параллельных процессах. - М.: Наука, 1986. - 296 с.
  • Воеводин В.В. Просто ли получить обещанный гигафлоп? // Программирование. 1995, N 4, C. 13-23.
  • Тарнавский Г.А., Шпак С.И. Декомпозиция методов и распараллеливание алгоритмов решения задач аэродинамики и физической газовой динамики: вычислительная система "Поток-3". // Программирование. 2000, N 6, C. 45-57.

Дополнительная литература

  • Антонов А.С. Параллельное программирование с использованием технологии MPI: Учебное пособие. - М.: Изд-во МГУ, 2004. - 71 с.
  • Березин С.Б., Пасконов В.М. Компонентная система визуализации результатов расчетов на многопроцессорных вычислительных системах // Материалы Всероссийской научной конференции "Высокопроизводительные вычисления и их приложения" ,2000 г., C. 202-203.
  • Бочаров Н.В. Технологии и техника параллельного программирования. Обзор. // "Программирование", 2003, N 1. С. 5-23. УДК 681.3.06
  • Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 600 с.
  • Гергель В.П., Свистунов А.Н. Разработка интегрированной среды высокопроизводительных вычислений для кластера Нижегородского университета: Высокопроизводительные параллельные вычисления на кластерных системах. Материалы второго международного научно-практического семинара, Нижний Новгород: Издательство Нижегородского университета, 2002. С.78-82.
  • Ильин В.П. О стратегиях распараллеливания в математическом моделировании. // Программирование. 1999, N 1, с. 41-46.
  • Карпов А.Н. Визуализация данных на параллельных вычислительных комплексах // 15-я Международная конференция ГРАФИКОН-2005. Новосибирск, Россия, 20-24 июня 2005 г.
  • Коновалов Н.А., Крюков В.А., Погребцов А.А., Сазанов Ю.Л. C-DVM - язык разработки мобильных параллельных программ. // Программирование. - 1999. N1. С. 20-28.
  • Коновалов Н.А., Крюков В.А., Михайлов С.Н., Погребцов Л.А. Fortran-DVM - язык разработки мобильных параллельных программ. // Программирование. 1995, N 1. С. 49-54.
  • Попова С.В., Шарф С.В. Организация сохранения промежуточных данных на МВС // Тез. докл. Всероссийской конференции "Актуальные проблемы прикладной математики и механики" (Екатеринбург, 3-7 февраля 2003 г.), с. 62.
  • Прангишвили И.В., Виленкин С.Я., Медведев И.Л. Параллельные вычислительные системы с общим управлением. - М.: Энергоатомиздат, 1983. - 312 с.
  • Соколинский Л.Б. Параллельные машины баз данных. // Сборник научно-популярных статей "Российская наука на заре нового века". Под редакцией академика В.П. Скулачева. -М.: научный мир, 2001. С. 484-494.
  • Таненбаум Э. Распределенные системы. Принципы и парадигмы. - СПб.: Питер, 2003. - 877 с.
  • Якобовский М.В., Суков С.А. Динамическая балансировка загрузки // Материалы конференции "Высокопроизводительные вычисления и их приложения", г. Черноголовка, 2000, С. 34-39.
  • Комолкин А.В., Немнюгин С.А.. Электронное пособие "Программирование для высокопроизводительных ЭВМ".

Об Авторе

Карпов Андрей Николаевич, http://www.viva64.com

Занимается вопросами создания программных решений в области повышения качества и быстродействия ресурсоемких приложений. Является одним из разработчиков статического анализатора Viva64 для верификации 64-битного программного обеспечения. Участвует в разработке открытой библиотеки VivaCore для работы с Си/Си++ кодом.



Используйте PVS-Studio для поиска ошибок в C, C++ и C# коде

Предлагаем попробовать проверить код вашего проекта с помощью анализатора кода PVS-Studio. Одна найденная в нём ошибка скажет вам о пользе методологии статического анализа кода больше, чем десяток статей.

goto PVS-Studio;

Андрей Карпов
Статей: 321


А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++ и C#

goto PVS-Studio;