Кластерные вычисления

Основы программирования на 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 включает в себя следующие базовые функции:

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

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

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

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

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

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

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

  • MPI_Init

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

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

    MPI_Init ( argc, argv)
  • MPI_Initialized

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

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

    MPI_Initialized ( flag )
  • MPI_Finalize

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

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

    MPI_Finalize()
  • MPI_Comm_size

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

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

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

    MPI_Comm_size ( comm., size )
  • MPI_Comm-rank

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

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

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

    MPI_Comm-rank ( comm., rank )
  • 2.3. Методы передачи данных в MPI: "точка-точка" и радиовещательные (broadcast) сообщения

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

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

  • Блокирующий Send / блокирующий Receive
  • Неблокирующий Send / неблокирующий Receive
  • Синхронный Send
  • Буферированный Send
  • Комбинированный Send / Receive
  • Send по готовности ( "ready" Send ).
  • С любым типом операции Send может состоять в паре любой тип операции Receive.

    Функции передачи данных типа "точка-точка" имеют список аргументов одного из следующих форматов:

  • Блокирующий Send:
    MPI_Send ( buffer, count, type, dest, tag, comm )
  • Неблокирующий Send:
    MPI_Isend ( buffer, count, type, dest, tag, comm, request )
  • Блокирующий Receive:
    MPI_Recv ( buffer, count, type, source, tag, comm., status )
  • Неблокирующий Receive:
    MPI_Irecv ( buffer, count, type, source, tag, comm., request )
  • Аргументы в этих функциях имеют следующее назначение:

  • buffer - место хранения данных, которые посылаются или принимаются;
  • count - количество элементов данных конкретного типа, которые посылаются или принимаются;
  • type - тип элементарных данных, задаваемый через встроенные MPI-типы, такие как (для языка С): MPI_CHAR, MPI_SHORT, MPI_INT, MPI_LONG, MPI_FLOAT, MPI_DOUBLE, MPI_BYTE, MPI_PACKED и др.
  • dest - указывает процесс, которому должно быть доставлено сообщение - задается через ранг принимающего процесса;
  • source - аргумент функций приема сообщений, указывающий номер посылающего процесса; указание значения MPI_ANY_SOURCE означает прием сообщения от любого процесса;
  • tag - произвольное неотрицательное целое число, присваиваемое программистом для однозначной идентификации сообщения; у парных операций Send и Reсeive эти числа должны совпадать; указание у операции Receive значения MPI_ANY_TAG может быть использовано для приема любого сообщения, независимо от значения tag ;
  • comm - указывает на коммуникатор, в рамках которого трактуются значения аргументов dest и source ; чаще всего используется встроенный коммуникатор MPI_COMM_WORLD ;
  • status - для операции Receive, указывает источник (source) сообщения и его тег ( tag ); в языке С, этот аргумент есть указатель на встроенную структуру MPI_Status ; из этой же структуры может быть получено количество принятых байт посредством функции MPI_Get_count ;
  • request - используется в неблокирующих операциях Send и Receive, и задает уникальный "номер запроса"; в языке С, этот аргумент является указателем на встроенную структуру MPI_Request.
  • К наиболее часто используемым блокирующим функциям передачи сообщений относятся следующие функции:

    MPI_Send

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

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

    MPI_Send ( buf, count, datatype, dest, tag, comm. )

    MPI_Recv

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

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

    MPI_Recv ( buf, count, datatype, source, tag, comm, status )

    MPI_Ssend

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

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

    MPI_Ssend ( buf, count, datatype, dest, tag, comm )

    MPI_Bsend, MPI_Buffer_attach

    Перед вызовом MPI_BSend, программист должен вызвать функцию MPI_Buffer_attach для размещения буфера, используемого в MPI_Bsend. Буферированная блокирующая операция посылки сообщения заканчивает свою работу, когда данные из программного буфера скопированы в буфер посылки.

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

    MPI_Buffer_attach ( buffer, size )
    MPI_Bsend ( buf, count, datatype, dest, tag, comm )

    В нижеследующем примере, процесс 0 посылает однобайтовое сообщение процессу 1, и ждет от него аналогичного сообщения.

    Основные особенности и отличия радиовещательных (коллективных) обменов данными от обменов типа "точка-точка" состоят в следующем:

  • принимают и/или передают данные одновременно все процессы группы для указываемого коммуникатора;
  • радиовещательная (коллективная) функция выполняет одновременно и прием, и передачу данных, а потому она имеет параметры, часть из которых относится к приему, а часть - к передаче данных;
  • как правило, значения всех параметров (за исключением адресов буферов) должны быть идентичны во всех процессах;
  • коллективные операции являются блокирующими;
  • коллективные операции могут использоваться только для встроенных (predefined) MPI-типов данных, но не могут использоваться для производных (derived) MPI-типов данных.
  • MPI_Bcast

    Посылает сообщение от процесса с рангом "root" (обычно, это процесс с рангом 0) всем другим процессам в группе.

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

    MPI_Bcast ( buffer, count, datatype, root, comm )

    MPI_Gather

    Собирает сообщения от каждого из процессов в группе в приемный буфер процесса с рангом 'root".

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

    MPI_Gather ( sendbuf, sendcount, sendtype, recvbuf, recvcount,
                 recvtype, root, comm )

    Cледует заметить, что

  • sendtype и recvtype, в общем случае, могут различаться, а потому будут задавать разную интерпретацию данных на приемной и передающей стороне;
  • процесс root также отправляет данные, но в свой же приемный буфер.
  • MPI_Scatter

    Эта функция является обратной к функции MPI_Gather: отдельные части передающего буфера процесса с рангом 'root распределяются по приемным буферам всех других процессов в группе.

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

    MPI_Scatter ( sendbuf, sendcount, sendtype, recvbuf, recvcount,
                  recvtype, root, comm )

    MPI_Allgather

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

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

    MPI_Allgather ( sendbuf, sendcount, sendtype, recvbuf, recvcount,
                    recvtype, comm )

    MPI_Alltoall

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

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

    MPI_Alltoall ( sendbuf, sendcount, sendtype, recvbuf, recvcount, 
                   recvtype, comm )

    В нижеследующем примере, с помощью функции MPI_Scatter строки массива рассылаются отдельным процессам:

    Вывод на консоль данной программы будет таким:

    rank= 0  Results: 1.000000 2.000000 3.000000 4.000000
    rank= 1  Results: 5.000000 6.000000 7.000000 8.000000
    rank= 2  Results: 9.000000 10.000000 11.000000 12.000000
    rank= 3  Results: 13.000000 14.000000 15.000000 16.000000

    2.4. Коллективные операции и их исполнение

    Коллективные операции в MPI выполняют следующие функции:

  • MPI_Reduce,
  • MPI_Allreduce,
  • MPI_Reduce_scatter и
  • MPI_Scan.
  • Помимо встроенных, пользователь может определять использовать свои собственные коллективные операции. Для этого служат функции MPI_Op_create и MPI_Op_free, а также специальный тип данных MPI_Usr_function.

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

    MPI_Reduce

    Данная функция выполняет коллективную операцию во всех процессах группы и помещает результат в процесс с рангом root.

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

    MPI_Reduce ( sendbuf, recvbuf, count, datatype, op, root, comm )

    Пример поэлементного суммирования массивов:

    Встроенных коллективных операций в MPI насчитывается 12:

  • MPI_MAX и MPI_MIN - поэлементные максимум и минимум
  • MPI_SUM - сумма векторов
  • MPI_PROD - произведение векторов
  • MPI_LAND, MPI_BAND, MPI_LOR, MPI_BOR, MPI_LXOR, MPI_BXOR - логические и двоичные (бинарные) операции И, ИЛИ, исключающее ИЛИ
  • MPI_MAXLOC, MPI_MINLOC - поиск индекса процесса с максимумом/минимумом значения и самого этого значения
  • Эти функции могут работать только со следующими типами данных (и только ними):

  • MPI_MAX, MPI_MIN - целые и вещественные
  • MPI_SUM, MPI_PROD - целые, вещественные (комплексные - для Фортрана)
  • MPI_LAND, MPI_LOR, MPI_LXOR - целые
  • MPI_BAND, MPI_BOR, MPI_BXOR - целые и типа MPI_BYTE
  • MPI_MAXLOC, MPI_MINLOC - вещественные
  • MPI_Allreduce

    Применяет коллективную операцию и рассылает результат всем процессам в группе.

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

    MPI_Allreduce (sendbuf, recvbuf, count, datatype, op, comm)

    MPI_Reduce_scatter

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

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

    MPI_Reduce_scatter (sendbuf, recvbuf, recvcount, datatype, op, comm)

    MPI_Scan

    Данная операция аналогична функции MPI_Allreduce в том отношении, что после ее выполнения каждый процесс получает результирующий массив. Главное отличие данной функции состоит в том, что содержимое результирующего массива в процессе i является результатом выполнения коллективной операции над массивами из процессов с номерами от 0 до i включительно.

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

    MPI_Scan ( sendbuf, recvbuf, count, datatype, op, comm )

    2.5. Управление процессами в MPI

    Управление процессами в MPI происходит посредством организации их в группы, управляемые коммуникаторами

    Группа есть упорядоченное множество процессов. Каждому процессу в группе присваивается уникальный целочисленный номер - ранг. Значения ранга изменяются от 0 до N - 1, где N есть количество процессов в группе. В MPI, группа представляется в памяти компьютера в виде объекта, доступ к которому программист осуществляет с помощью "обработчика" (handle) MPI_Group. С группой всегда связывается коммуникатор, также представляемый в виде объекта.

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

    Основные цели средств организации процессов в группы:

  • позволяют организовывать задачи, объединяя в группы процессы, основываясь на их функциональном назначении;
  • позволяют осуществлять коллективные операции (см. Раздел 4) только на заданном множестве процессов;
  • предоставляют базис для организации пользователем виртуальных топологий;
  • обеспечивают безопасную передачу сообщений в рамках одной группы.
  • Группы/коммуникаторы являются динамическими - они могут создаваться и уничтожаться во время исполнения программы.

    Процессы могут относиться к более, чем одной группе/коммуникатору. В каждой группе/коммуникаторе, каждый процесс имеет уникальный номер (ранг).

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

  • Получить обработчик глобальной группы, связанной с коммуникатором MPI_COMM_WORLD, используя функцию MPI_Comm_group.
  • Создать новую группу как подмножество глобальной группы, используя функцию MPI_Group_incl.
  • Создать новый коммуникатор для вновь созданной группы, используя функцию MPI_Comm_create.
  • Получить новый ранг процесса во вновь созданном коммуникаторе, используя функцию MPI_Comm_rank.
  • Выполнить обмен сообщениями между процессами в рамках вновь созданной группы.
  • По окончании работы, освободить (уничтожить) группу и коммуникатор, используя функции MPI_Group_free и MPPI_Comm_free.
  • Пример, показанный ниже, демонстрирует создание двух отдельных групп процессов для выполнения коллективных операций внутри каждой из них.

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

    rank= 7 newrank= 3 recvbuf= 22
    rank= 0 newrank= 0 recvbuf= 6
    rank= 1 newrank= 1 recvbuf= 6
    rank= 2 newrank= 2 recvbuf= 6
    rank= 6 newrank= 2 recvbuf= 22
    rank= 3 newrank= 3 recvbuf= 6
    rank= 4 newrank= 0 recvbuf= 22
    rank= 5 newrank= 1 recvbuf= 22

    2.6. Организация логических топологий процессов

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

    В MPI поддерживается два основных типа топологий - декартовые (решеточные) топологии и топологии в виде графа.

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

    Виртуальные топологии строятся на основе групп и коммуникаторов, и "программируется" разработчиком параллельного приложения.

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

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

    Вывод данной программы на консоль будет следующим:

    rank= 0 coords= 0 0  neighbors(u,d,l,r)= -3 4 -3 1
    rank= 0                inbuf(u,d,l,r)= -3 4 -3 1
    rank= 1 coords= 0 1  neighbors(u,d,l,r)= -3 5 0 2
    rank= 1                inbuf(u,d,l,r)= -3 5 0 2
    rank= 2 coords= 0 2  neighbors(u,d,l,r)= -3 6 1 3
    rank= 2                inbuf(u,d,l,r)= -3 6 1 3
            . . . . .
    rank= 14 coords= 3 2  neighbors(u,d,l,r)= 10 -3 13 15
    rank= 14                inbuf(u,d,l,r)= 10 -3 13 15
    rank= 15 coords= 3 3  neighbors(u,d,l,r)= 11 -3 14 -3
    rank= 15                inbuf(u,d,l,r)= 11 -3 14 -3

    2.7. Отладка параллельных программ с использованием Microsoft Visual Studio 2005

    Visual Studio 2005 включает в себя важные функции, которые позволяют отлаживать параллельные приложения в удаленном режиме.

    MPI-отладчик из Visual Studio использует файл Mpishim.exe для автоматического присоединения отладочных средств к MPI-процессам, исполняющимся на узлах кластера. Совокупность стандартных средств отладки, уже имевшееся в составе Visual Studio 2005, расширено на параллельные приложения, и обеспечивает точки останова и пошаговое выполнение на уровне процессов и на уровне потоков. С помощью этих средств, возможно отладить приложения, в которых имеются несоответствия в передаче и приеме сообщений, дедлоки и условия для возникновения гонок.

    Установка и конфигурирование средств отладки в Visual Studio 2005

    Visual Studio 2005 Professional Edition и Visual Studio 2005 Team System позволяют отлаживать приложения, включая и параллельные приложения, в удаленном режиме. При отладке MPI-приложений в рамках Visual Studio используются следующие средства:

  • Msvsmon - монитор удаленной отладки
  • Smpd - процесс-демон, который запускает приложение Mpishim.exe
  • Mpishim - приложение, которое связывается с Msvsmon и запускает процедуру Mpiexeс.
  • Mpiexec - процедура запуска приложения пользователя в виде MPI-задания.
  • Общие шаги по установке и конфигурированию средств отладки MPI приложений в рамках Visual Studio состоят в следующем:

  • Установить и сконфигурировать MS MPI на каждом узле кластера. MS MPI включен в пакет Windows Compute Cluster Server 2003, но поддерживаются и другие версии MPI.
  • Установить Mpishim.exe на каждом узле кластера в одной и той же директории на каждом из узлов. Например, можно поместить Mpishim.exe в директорию C:\Windows\system32 на каждом узле кластера.
  • Установить монитор удаленной отладки (Msvsmon.exe) на каждом узле кластера.
  • Установить на компьютере, с которого будет производиться удаленная отладка, достаточные привилегии для запуска заданий на кластере. Этот компьютер должен находиться в таком сегменте сети и в такой подсети, чтобы с него был возможен доступ к вычислительным узлам кластера.
  • Чтобы установить все требуемые компоненты для удаленной отладки, на каждом вычислительном узле необходимо выполнить следующие действия:

  • Вставить в дисковод последний из установочных дисков Visual Studio 2005.
  • Отыскать на нем директорию Remote Debugger\x64.
  • Запустить из нее файл rdbgsetup.exe для установки компонент для удаленной отладки.
  • Дополнительные замечания:

  • При большом количестве узлов на вычислительном кластере, рекомендуется скопировать содержимое папки Remote Debugger\x64 на диск, доступный всем узлам, и запускать процедуру установки оттуда.
  • Пользователь, задействованный в сессии отладки MPI-приложений в Visual Studio 2005, должен также быть пользователем, запустившим Msvsmon.exe на удаленных машинах, поскольку Visual Studio проверяет, чтобы пользователь, выполняющий отладку, и пользователь, запустивший процессы на удаленных компьютерах, совпадали.
  • Отладка MPI-приложений

    Visual Studio 2005 имеет средства, которые делают ее эффективным инструментом отладки MPI-приложений. Пользователь может выполнять MPI-приложения непосредственно в рамках сессии из Visual Studio в двух режимах:

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

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

    Чтобы установить конфигурационные параметры для MPI-приложения, для которого будет производиться отладка, необходимо выполнить следующие шаги:

  • Открыть в Visual Studio решение, которое содержит требуемое MPI приложение.
  • На странице (рис 2.1) Отладка MPI-приложения с использованием Visual Studio
  • Заполнить соответствующими аргументами поля, как показано на Рис 2.1. Те же самые аргументы используются и в обычном MPI-задании, за исключением файла Mpishim.exe, который необходим для взаимодействия отладчика с MPI-сервисом.
  • Проверить, что значение поля Application Command содержит значение, которое верно для каждого из узлов кластера. Легче всего это обеспечить, если указанный путь относится к общей директории для всех узлов.
  • В главном меню Visual Studio 2005, выберите пункт (рис 2.2) Диалоговое окно Options
  • Установить необходимые точки остановки, и заново запустить процесс Build повторного построения изображения.
  • Замечание.

    Важное свойство отладки параллельных приложений в Visual Studio 2005 состоит в том, что в ней возможно устанавливать точки остановки отдельно для каждого процесса. Например, можно установить точку остановки только для процесса с конкретным Windows Process ID (PID) или же для множества процессов с выбранными PID.

    Запуск MPI-приложения в режиме отладки

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

    Чтобы просмотреть процессы приложения, необходимо нажать Ctrl-Alt-Z, чтобы открыть окно Processes, пример которого показан на Рис 2.3.

    (рис 2.3) Окно Processes

    Отметим, что в поле ID этого окна отображается Windows Process ID (PID), а не ранг процесса в смысле MPI.

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

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

    Замечание.

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

    Вернуться к учебному плану