Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР №5_MPI_Введение в MPI.doc
Скачиваний:
6
Добавлен:
14.11.2019
Размер:
252 Кб
Скачать
☆

Виртуальные топологии

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

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

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

Базовые функции mpi

Первой вызываемой функцией MPI должна быть функция

int MPI_Init(int *argc, char ***argv)

argc

указатель на количество параметров командной строки

argv

параметры командной строки

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

Последней вызываемой функцией MPI обязательно должна являться функция: int MPI_Finalize(void).

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

#include "mpi.h"

int main(int argc, char *argv[]) {

<программный код без использования функций MPI>

MPI_Init(&argc, &argv);

<программный код с использованием функций MPI>

MPI_Finalize();

<программный код без использования функций MPI>

return 0;

}

Следует отметить:

  • файл mpi.h содержит определения именованных констант, прототипов функций и типов данных библиотеки MPI;

  • функции MPI_Init и MPI_Finalize являются обязательными и должны быть выполнены (и только один раз) каждым процессом параллельной программы;

  • перед вызовом MPI_Init может быть использована функция MPI_Initialized для определения того, был ли ранее выполнен вызов MPI_Init, а после вызова MPI_Finalize – MPI_Finalized аналогичного предназначения.

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

int MPI_Abort(MPI_Comm comm, int errcode).

Эта функция корректно прерывает выполнение параллельной программы, оповещая об этом событии среду MPI.

Рассмотренные примеры функций дают представление синтаксиса именования функций в MPI: MPI_Xxx(..).

Определение количества и ранга процессов

Определение количества процессов в выполняемой параллельной программе осуществляется при помощи функции:

int MPI_Comm_size(MPI_Comm comm, int *size)

comm

коммуникатор, размер которого определяется

size

определяемое количество процессов в коммуникаторе

Для определения ранга процесса используется функция:

int MPI_Comm_rank(MPI_Comm comm, int *rank)

comm

коммуникатор, в котором определяется ранг процесса

rank

ранг (порядковый номер) процесса в коммуникаторе

Как правило, вызов функций MPI_Comm_size и MPI_Comm_rank выполняется сразу после MPI_Init для получения общего количества процессов и ранга текущего процесса:

#include "mpi.h"

int main(int argc, char *argv[]) {

int ProcNum, ProcRank;

<программный код без использования функций MPI>

rc = MPI_Init(&argc, &argv);

if (rc != 0) {

printf("Error starting MPI program. Terminating.\n");

MPI_Abort(MPI_COMM_WORLD, rc);

}

MPI_Comm_size(MPI_COMM_WORLD, &ProcNum);

MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank);

<программный код с использованием функций MPI>

MPI_Finalize();

<программный код без использования функций MPI>

return 0;

}

Следует отметить:

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

  • ранг, получаемый при помощи функции MPI_Comm_rank, является рангом процесса, выполнившего вызов этой функции, т. е. переменная ProcRank примет различные значения у разных процессов.