Введение к работе
Вычислительная техника развивается в двух основных направлениях: новые процессорные технологии увеличивают производительность отдельных компьютеров, а новые сетевые технологии повышают скорость обмена данными между компьютерами. Соответственно, обеспечить требуемую скорость решения задачи пользователя можно либо с помощью одного достаточно мощного компьютера, либо с помощью нескольких менее мощных компьютеров, связанных достаточно производительным сетевым оборудованием.
Стоимость специализированного высокопроизводительного компьютера существенно выше стоимости равномощной локальной сети. Доступность и распространенность локальных сетей несравненно выше доступности и распространенности суперкомпьютеров. А если учесть, что с начиная с 1992-го года производительность сетевого оборудования растет быстрее производительности процессоров, то можно сделать вывод о перспективности использования локальных сетей компьютеров для высокопроизводительных вычислений. Тем не менее, огромный вычислительный потенциал локальных сетей до сих пор практически не используется.
Это объясняется тем, что новые процессоры и специализированные параллельные компьютеры адекватно поддерживаются языками программирования, компиляторами, системами программирования и другими инструментальными средствами, позволяющими обычному пользователю эффективно использовать их потенциал. Аналогичное программное обеспечение для столь же эффективного использования производительного потенциала локальных сетей все еще отсутствует. Отличительной особенностью этих сетей, состоящих из персональных компьютеров, рабочих станций, серверов и специализированных параллельных компьютеров, является их неоднородность, как с точки зрения производительности отдельных вычислительных узлов, так и с точки зрения скорости обмена сообщениями. Именно неоднородность является принципиальным отличием сети компьютеров от специализированного параллельного компьютера.
Целью диссертационной работы является разработка таких языковых и инструментальных средств программирования неоднородных сетей компьютеров, которые позволяли бы обычному пользователю эффективно использовать их для высокопроизводительных вычислений.
- г -
Для того, чтобы быть полезным широкому кругу пользователей, такой инструментарий должен:
поддерживать и облегчать эффективное параллельное программирование;
поддерживать переносимое параллельное программирование;
поддерживать модульное параллельное программирование;
поддерживать и облегчать эффективно-переносимое параллельное программирование;
поддерживать достаточно простую и прозрачную для пользователя программную модель, обеспечивающую надежное параллельное программирование.
Эффективное параллельное программирование подразумевает возможность разработки программ, эффективно использующих потенциал производительности конкретной сети компьютеров.
Переносимое параллельное программирование подразумевает возможность разработки таких прикладных программ, которые, будучи разработанными и оттестированными для одной сети компьютеров, могли бы без переработки правильно работать на других сетях. Параллельный прикладной программный продукт для сетей не может быть непереносимым.
Модульное параллельное программирование подразумевает возможность разработки пользователем параллельного модуля, который может безопасно использоваться другими пользователями при разработке своих параллельных программ без знания его внутренностей. Не поддерживающий переносимости или модульности инструментарий не может использоваться для разработки параллельных библиотек.
Под эффективно-переносимой понимается такая переносимая параллельная программа, которая эффективно использует потенциал производительности каждой конкретной целевой сети компьютеров, адаптируясь к ее особенностям (числу и производительностям процессоров, пропускной способности и скорости обмена данными между различными процессорами при выполнении различных коммуникационных операций). Идеальная эффективно-переносимая программа выполняется на любой конкретной целевой сети со скоростью, максимально возможной для этой сети. Очевидно, хорошая библиотека параллельных программ должна быть эффективно переносимой.
Наконец, лишь очень немногие даже квалифицированные программисты смогут разработать сколько-нибудь сложную правильную парад-
дельную программу, если система понятий, поддерживаемая используемым инструментарием, не является достаточно простой, прозрачной, легкой в использовании и/или не обеспечивает надежного параллельного программирования.
В настоящее время, имеется два главных подхода к переносимому параллельному программированию вычислительных машин с распределенной памятью.
Первый подход базируется на языках программирования высокого уровня, таких как HPF (High Perfomance Fortran). HPF поддерживает достаточно простую и легкую в использовании программную модель и позволяет разрабатывать надежные параллельные программы. Он был стандартизирован чуть больше 2 лет тому назад, но уже появились высококачественные переносимые компиляторы, поддерживающие принятый стандарт. Поэтому HPF может быть использован для разработки переносимых и модульных параллельных прикладных программ. Однако HPF, как и его предшественники Fortran D и Vienna Fortran и другие языки программирования высокого уровня (такие как CM Fortran, С*, Dataparallel С, Modula-2*, Fortran М, СС++ и т.д.) не предназначены для эффективного параллельного программирования неоднородных сетей компьютеров. Дело в том, что моделью параллельной вычислительной машины, лежащей в основе этих языков, является однородный мультипроцессор с очень быстрыми коммуникациями между его вычислительными узлами. Эта модель уходит корнями в массивно-параллельные компьютеры, бывшие первоначально целевой архитектурой для этих языков. Поэтому, HPF, поддерживая эффективно-переносимое параллельное программирование для массивно-параллельных компьютеров и однородных сетей рабочих станций, связанных с помощью очень быстрого сетевого оборудования, не поддерживает того же самого для неоднородных сетей.
К первому подходу примыкают специализированные пакеты прикладных программ, такие как ScaLAPACK, предназначенные для решения задач на параллельных архитектурах с распределенной памятью. Идеология пакета ScaLAPACK очень близка к идеологии HPF. Как и HPF, ScaLAPACK ориентируется на однородные мультипроцессоры с очень быстрыми межпроцессорными коммуникациями и не обеспечивает эффективной переносимости в классе неоднородных сетей.
Второй основной подход обеспечивает эффективное параллельное программирование конкретных целевых сетей компьютеров и базирует-
ся на расширении языков С, C++ и Fortran 77 с помощью библиотек функций передачи сообщений, таких как MPI (Message-Passing Interface). Было разработано довольно много пакетов передачи сообщений, позволяющих использовать неоднородную сеть компьютеров как единую параллельную машину, однако, в настоящее время, наиболее популярными являются PVM и MPI.
В отличие от PVM, MPI стандартизован как MPI 1.1 и широко реализован в соответствии с этим стандартом. Имеются как высококачественные свободно-распространяемые реализации, поддерживающие MPI 1.1, так и коммерческие реализации практически от всех основных производителей высокопроизводительных компьютеров. Поэтому MPI может быть использован для переносимого параллельного программирования неоднородных сетей.
Другое важное преимущество MPI заключается в том, что введенное в нем понятие коммуникатора позволяет разным пользователям независимо писать, компилировать и использовать различные модули единой параллельной программы. Другими словами, в отличие от PVM, MPI поддерживает модульное параллельное программирование и, следовательно, разработку параллельных библиотек.
В то же время, MPI (как и другие коммуникационные пакеты) имеет два существенных недостатка. Первый из них заключается в низком уровне его системы понятий и параллельных примитивов. Исключительно сложно написать на MPI действительно сложную, полезную и надежную параллельную программу. Поэтому, несмотря на великолепный дизайн, MPI является, по существу, средством параллельного программирования уровня ассемблера и может быть использован для практического (а не учебного) программирования лишь очень узким кругом высококвалифицированных специалистов.
Второй недостаток заключается в том, что MPI не поддерживает эффективной переносимости. Другими словами, в MPI не предусмотрено средств, которые позволяли бы писать программы, адаптирующиеся к особенностям конкретной целевой неоднородной сети компьютеров. Это приводит к тому, что программа на MPI, эффективно решавшая задачу на одной сети, решает ее менее эффективно на другой, даже более мощной по потенциалу производительности, сети. Основная причина заключается в том, что модель параллельной программы, предоставляемая пользователю пакетом MPI. исходит из однородности составляющих выполняющуюся программу процессов и пренебрегает
скоростью коммуникаций между ними.
Таким образом, традиционные инструментальные средства разработки параллельных программ для вычислительных систем с распределенной памятью не поддерживают эффективно-переносимого программирования неоднородных сетей компьютеров. Поэтому разработка системы программирования, поддерживающей и облегчающей эффективно-переносимое параллельное модульное программирование неоднородных сетей, является актуальной научной проблемой.
Для решения этой задачи была создана модель параллельного программирования неоднородных вычислительных систем с распределенной памятью и разработан реализующий эту модель язык параллельного программирования трС. представляющий собой строгое расширение ANSI С. Основная идея заключается в том, что язык трС позволяет пользователю специфицировать топологию и определять так называемые сетевые объекты, а также распределять данные и вычисления между этими сетевыми объектами. Другими словами, пользователь предоставляются языковые средства для описания (в частности, динамического) топологии своей задачи, а система программирования трС использует эту информацию, а также информацию о топологии целевой вычислительной машины с распределенной памятью для того, чтобы динамически (то есть в период выполнения программы) отобразить топологию задачи (сетевые объекты трС) в топологию целевой параллельной машины таким образом, чтобы обеспечить наилучшее время выполнения программы.
Язык трС поддерживает эффективное, переносимое, модульное и эффективно-переносимое параллельное программирования неоднородных сетей компьютеров. Он предлагает пользователю довольно простую и прозрачную модель параллельного программирования и поддерживает разработку надежных параллельных программ.
Текущая версия системы программирования трС написана на ANSI С и компилируется большинством компиляторов языка С (включая gcc). В качестве коммуникационной платформы используется MPI 1.1. Поэтому сама система программирования обладает высокой степенью переносимости и легко устанавливается на различных платформах. Первая версия системы программирования трС была реализована в октябре 1996 года и помещена в Internet для свободного доступа по адресу . В настоящее время доступна версия 1.2.0 системы, оттестированная для неоднородных сетей, состо-
ящих из рабочих станций и персональных компьютеров, и различных реализаций MPI.
Апробация работы. Результаты работы были представлены на:
4-й международной конференции Parallel Architectures and Compilation Techniques (PACT'96), октябрь 1996 года, США;
семинаре по новым технологиям в NASA Ames, ноябрь 1996 года, США;
30-й международной конференции Hawaii International Conference on System Sciences (HICSS'30), январь 1997 года, США;
2-м международном симпозиуме Aizu International Symposium on Parallel Algorithms/Architectures Synthesis (pAs'97), март 1997 года. Япония;
на 11-ом международном симпозиуме International Parallel Processing Symposium (IPPS'97) в рамках 7th Heterogeneous Computing Workshop (HCW'97), апрель 1997 года, Швейцария;
научных семинарах в ряде ведущих университетов США (University of Nebraska at Omaha, California Institute of Technology, Oregon State University, Naval Postgraduate School), октябрь-ноябрь 1997 года.
Основные результаты работы опубликованы в научных журналах, сборниках и трудах конференций. Список основных публикаций по теме работы приведен в конце автореферата. Кроме того, результаты работы (как документация, так и программное обеспечение) помещены в сеть Internet и открыты для свободного доступа.
Структура и объем работы. Диссертация изложена на 141 странице и имеет четыре приложения. Она состоит из четырех глав и заключения. Библиография насчитывает 37 наименований.