- •Основні операції мрі-бібліотеки, розробка простої мрі-програми
- •Введение в mpi
- •Что такое mpi
- •Понятие параллельной программы
- •Операции передачи данных
- •Понятие коммуникаторов
- •Типы данных
- •Определение количества и ранга процессов
- •Виртуальные топологии
- •Базовые функции mpi
- •Определение времени выполнение mpi-программы
Виртуальные топологии
Как уже отмечалось ранее, парные операции передачи данных могут быть выполнены между любыми процессами одного и того же коммуникатора, а в коллективной операции принимают участие все процессы коммуникатора. Логическая топология линий связи между процессами имеет структуру полного графа (независимо от наличия реальных физических каналов связи между процессорами).
В 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 примет различные значения у разных процессов.
