Опубликован: 22.04.2008 | Доступ: свободный | Студентов: 526 / 50 | Оценка: 4.50 / 4.75 | Длительность: 06:55:00
Специальности: Программист
Лекция 2:

Основы программирования на MPI

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >
Аннотация: Данная лекция посвящена основам программирования на MPI. Рассматривается общая характеристика интерфейсов MPI-1 и MPI-2 и их конкретных реализаций, также внимание уделено коллективным операциям и их исполнению, а также управлению процессами в MPI

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

Для различных операционных систем и разнообразных сетей передачи данных, используемых в кластерах, разработаны и продолжают разрабатываться специальные реализации MPI. MS MPI (Microsoft MPI) есть стандартная реализация интерфейса передачи сообщений для операционной системы Windows. MS MPI, в свою очередь, базируется на MPICH2 - открытой (open source) реализации стандарта MPI 2.0, разработка которой первоначально была начата в Аргонской национальной лаборатории (Argonne National Laboratory), США.

MS MPI может использоваться в программах, написанных на языках Fortan-77, Fortran-90, C и C++. Пакет Compute Cluster Pack не предоставляет библиотеки классов для MPI в рамках .NET Framework. Тем не менее, программы, реализуемые как последовательные задачи для исполнения под управлением CCS, могут разрабатываться на языках, поддерживаемых платформой .NET. С другой стороны, программы, использующие MPI и написанные на языках, поддерживаемых .NET, могут обращаться к MPI-функциям посредством механизма P/Invoke. В будущих версиях CCS ожидается поддержка MPI в виде стандартных классов .NET Framework.

2.1. Общая характеристика интерфейсов MPI-1 и MPI-2 и их конкретных реализаций

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

Стандарт MPI-1 включает в себя следующие базовые функции:

  1. управление вычислительным окружением,
  2. передача сообщений типа "точка-точка",
  3. коллективные операции взаимодействия,
  4. использование производных типов данных,
  5. управление группами и коммуникаторами,
  6. виртуальные топологии.

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

Стандарт MPI-2, помимо функциональности стандарта MPI-1, включает в себя функции:

  1. динамического порождения процессов,
  2. однонаправленной передачи сообщений,
  3. расширенных коллективных операций,
  4. параллельного ввода/вывода.

Кроме реализаций MPICH и MPICH-2 Аргонской национальной лаборатории, на которых базируется MS MPI, имеется еще множество других реализаций стандарта MPI, как коммерческих, так и свободно доступных. Примером коммерческой версии является система ScaMPI фирмы Scali, ориентированная, в частности, на поддержку быстрого интерконнекта SCI. Примером широко используемой свободно доступной реализации является система LAM MPI, разработанная в Суперкомпьютерном центре штата Огайо, США.

В последующих разделах будут изложены основные функции стандарта MPI-1 и способы их применения, а также будут даны сведения об отладке MPI-программ c использованием Visual Studio 2005.

2.2. Функции управления вычислительным окружением

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

Наиболее часто используемые функции (в формате языка С) перечисляются ниже.

  1. MPI_Init

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

    Формат вызова:

    MPI_Init ( &argc, &argv)
  2. MPI_Initialized

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

    Формат вызова:

    MPI_Initialized ( &flag )
  3. MPI_Finalize

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

    Формат вызова:

    MPI_Finalize()
  4. MPI_Comm_size

    Все параллельные процессы, из которых состоит MPI-программа, объединяются в группы, которые управляются так называемыми коммуникаторами (communicators). Именно коммуникаторы обеспечивают взаимодействие параллельных процессов внутри группы.

    Функция MPI_Comm_size определяет количество процессов в группе, связанной с данным коммуникатором. Специальный встроенный коммуникатор с именем MPI_COMM_WORLD управляет всеми MPI-процессами в приложении, и потому чаще всего используется в качестве аргумента в данной функции:


    Формат вызова:

    MPI_Comm_size ( comm., &size )
  5. MPI_Comm-rank

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

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

    Формат вызова:

    MPI_Comm-rank ( comm., &rank )

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >