Параллельное программирование с использованием технологии MPI Лекция 4 Томский политехнический университет Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Определения и основные положения Процесс есть программная единица, у которой имеется собственное адресное пространство и одна или несколько нитей. Процессор −фрагмент аппаратных средств, способный к выполнению программы. В модели передачи сообщений процессы, выполняющиеся параллельно, имеют раздельные адресные пространства. Связь происходит, когда часть адресного пространства одного процесса скопирована в адресное пространство другого процесса. Процессы в MPI принадлежат группам. Если группа содержит n процессов, то процессы нумеруются внутри группы номерами, которые являются целыми числами от 0 до n-l. Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 2 Возможности MPI-1.2 и MPI-2.0 MPI-1.2 Коммуникация точка-точка Коллективная коммуникация Коммуникаторы Топологии процессов Пользовательские типы данных Интерфейс профилирования MPI-2.0 Динамическое создание процессов Параллельный ввод-вывод Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 3 Функции MPI-1.2 В состав библиотеки входит 129 функций. Для написания подавляющего числа программ принципиально достаточно следующих шести функций MPI_Init Инициализация MPI MPI_Comm_size Определение числа процессов MPI_Comm_rank Определение процессом собственного номера MPI_Send Посылка сообщения MPI_Recv Получение сообщения MPI_Finalize Завершение программы MPI Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 4 Функция MPI_Init() int MPI_Init(int *argc, char **argv) Вход argc, argv: Результат: аргументы функции main() MPI_SUCСESS или код ошибки Назначение: Инициализация MPI. Функция должна быть вызвана каждым процессом MPI до использования им любой другой функции MPI. В каждом выполнении программы может выполняться только один вызов MPI_Init() Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 5 Функция MPI_Finalize() int MPI_Finalize() Назначение: Завершение программы MPI. Предусловие: Все незаконченные коммуникации должны быть завершены. Функция должна быть вызвана каждым процессом MPI до завершения работы процесса. После вызова MPI_Finalize() не может быть вызовов других функций MPI. Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 6 Функция MPI_Comm_size() int MPI_Comm_size(MPI_Comm comm, int *size) Вход comm: Выход size: Коммуникатор Число процессов в коммуникаторе Назначение: Определение коммуникаторе. числа процессов в MPI_COMM_WORLD – предопределённый стандартный коммуникатор. Его группа процессов включает все процессы параллельного приложения Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 7 Функция MPI_Comm_rank() int MPI_Comm_rank(MPI_Comm comm, int *rank) Вход comm: Выход rank: Коммуникатор Номер процесса, запустившего функцию Назначение: Определение процессом своего номера. Единственный способ различения процессов. Номер процесса – уникальный идентификатор внутри группы процессов коммуникатора. Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 8 Функция MPI_Send() int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) Вход Вход Вход Вход Вход Вход buf: count: datatype: dest: tag: comm: Начальный адрес буфера посылки сообщения Число передаваемых элементов в сообщении Тип передаваемых элементов Номер процесса-получателя Идентификатор сообщения Коммуникатор Назначение: Посылка сообщения. Блокирующая операция, не возвращает управление до тех пор, пока данные и атрибуты сообщения не будут сохранены в соответствующий приемный буфер или во временный системный буфер. Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 9 Типы данных MPI MPI C MPI_CHAR signed char MPI_SHORT signed short int MPI_INT signed int MPI_LONG unsigned long int MPI_UNSIGNED_CHAR unsigned char MPI_UNSIGNED_SHORT unsigned short int MPI_UNSIGNED unsigned int MPI_UNSIGNED_LONG unsigned long int MPI_FLOAT float MPI_DOUBLE double MPI_LONG_DOUBLE long double MPI_BYTE 1 байт MPI_PACKED Упакованные данные Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 10 Функция MPI_Recv() int MPI_Send(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status) Выход buf: Вход count: Вход datatype: Вход source: Вход tag: Вход comm: Выход status: Начальный адрес буфера процесса-получателя Число элементов в принимаемом сообщении Тип элементов сообщения Номер процесса-отправителя Идентификатор сообщения Коммуникатор Статусная информация Назначение: Приём сообщения. Блокирующая операция, завершает свою работу после того, как сообщение становится доступным в буфере получателе. Сообщение должно быть меньше чем размер буфера. Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 11 Пример #include “mpi.h” #include <stdio.h> #include <stdlib.h> #define TAG 25 void main(int argc, char *argv[] ) { { char message[20]; int rank; MPI_Status status; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if (rank == 0) { strcpy(message, " Текст сообщения MPI"); MPI_Send(message, 20,MPI_CHAR,1,TAG, MPI_COMM_WORLD); } else if (rank==1) { MPI_Recv(message, 20, MPI_CHAR, 0, TAG, MPI_COMM_WORLD, &status); printf("Полученное сообщение: %s\n", message); } MPI_Finalize(); Параллельное программирование с } использованием технологии OpenMP Аксёнов С.В. 12