Параллельное программирование с использованием технологии MPI Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 4 Томский политехнический университет 1 Параллельное программирование с использованием технологии MPI Аксёнов С.В.
Определения и основные положения Процесс есть программная единица, у которой имеется собственное адресное пространство и одна или несколько нитей. Процессор фрагмент аппаратных средств, способный к выполнению программы. В модели передачи сообщений процессы, выполняющиеся параллельно, имеют раздельные адресные пространства. Связь происходит, когда часть адресного пространства одного процесса скопирована в адресное пространство другого процесса. Процессы в MPI принадлежат группам. Если группа содержит n процессов, то процессы нумеруются внутри группы номерами, которые являются целыми числами от 0 до n-l. Параллельное программирование с использованием технологии MPI Аксёнов С.В. 2
Возможности MPI-1.2 и MPI-2.0 Параллельное программирование с использованием технологии MPI Аксёнов С.В. 3 MPI-2.0 Динамическое создание процессов Параллельный ввод-вывод MPI-1.2 Коммуникация точка-точка Коллективная коммуникация Коммуникаторы Топологии процессов Пользовательские типы данных Интерфейс профилирования
Функции MPI-1.2 В состав библиотеки входит 129 функций. Для написания подавляющего числа программ принципиально достаточно следующих шести функций MPI_Init Инициализация MPI MPI_Comm_size Определение числа процессов MPI_Comm_rank Определение процессом собственного номера MPI_Send Посылка сообщения MPI_Recv Получение сообщения MPI_Finalize Завершение программы MPI Параллельное программирование с использованием технологии MPI Аксёнов С.В. 4
Функция MPI_Init() Назначение: Инициализация MPI. Параллельное программирование с использованием технологии MPI Аксёнов С.В. 5 Функция должна быть вызвана каждым процессом MPI до использования им любой другой функции MPI. В каждом выполнении программы может выполняться только один вызов MPI_Init() int MPI_Init(int *argc, char **argv) Вход argc, argv: аргументы функции main() Результат: MPI_SUCСESS или код ошибки
Функция MPI_Finalize() Назначение: Завершение программы MPI. Параллельное программирование с использованием технологии MPI Аксёнов С.В. 6 Предусловие: Все незаконченные коммуникации должны быть завершены. Функция должна быть вызвана каждым процессом MPI до завершения работы процесса. После вызова MPI_Finalize() не может быть вызовов других функций MPI. int MPI_Finalize()
Функция MPI_Comm_size() Назначение: Определение числа процессов в коммуникаторе. Параллельное программирование с использованием технологии MPI Аксёнов С.В. 7 MPI_COMM_WORLD – предопределённый стандартный коммуникатор. Его группа процессов включает все процессы параллельного приложения int MPI_Comm_size(MPI_Comm comm, int *size) Входcomm: Коммуникатор Выходsize: Число процессов в коммуникаторе
Функция MPI_Comm_rank() Назначение: Определение процессом своего номера. Параллельное программирование с использованием технологии MPI Аксёнов С.В. 8 Единственный способ различения процессов. Номер процесса – уникальный идентификатор внутри группы процессов коммуникатора. int MPI_Comm_rank(MPI_Comm comm, int *rank) Входcomm: Коммуникатор Выходsize: Номер процесса, запустившего функцию
Функция MPI_Send() Назначение: Посылка сообщения. Параллельное программирование с использованием технологии MPI Аксёнов С.В. 9 Блокирующая операция, не возвращает управление до тех пор, пока данные и атрибуты сообщения не будут сохранены в соответствующий приемный буфер или во временный системный буфер. int MPI_Send(void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm) Входbuf: Начальный адрес буфера посылки сообщения Входcount:Число передаваемых элементов в сообщении Входdtype:Тип передаваемых элементов Входdest:Номер процесса-получателя Входtag:Идентификатор сообщения Входcomm:Коммуникатор
Типы данных MPI Параллельное программирование с использованием технологии MPI Аксёнов С.В. 10 MPIC MPI_CHARsigned char MPI_SHORTsigned short int MPI_INTsigned int MPI_LONGunsigned long int MPI_UNSIGNED_CHARunsigned char MPI_UNSIGNED_SHORTunsigned short int MPI_UNSIGNEDunsigned int MPI_UNSIGNED_LONGunsigned long int MPI_FLOATfloat MPI_DOUBLEdouble MPI_LONG_DOUBLElong double MPI_BYTE1 байт MPI_PACKEDУпакованные данные
Функция MPI_Recv() Назначение: Посылка сообщения. Параллельное программирование с использованием технологии MPI Аксёнов С.В. 11 Блокирующая операция, завершает свою работу после того, как сообщение становится доступным в буфере получателе. Сообщение должно быть меньше чем размер буфера. int MPI_Recv(void *buf, int count, MPI_Datatype dtype, int source, int tag, MPI_Comm comm, MPI_Status *status) Выходbuf: Начальный адрес буфера процесса-получателя Входcount:Число элементов в принимаемом сообщении Входdtype:Тип элементов сообщения Входsource:Номер процесса-отправителя Входtag:Идентификатор сообщения Входcomm:Коммуникатор Выход status: Статусная информация
Пример void main(int argc, char *argv[] ) { char message[20]; int myrank; MPI_Status status; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &myrank ); if (myrank == 0) { strcpy(messageТекст сообщения"); MPI_Send(message,strlen(message),MPI_CHAR,1,99, MPI_COMM_WORLD); } else { MPI_Recv(message, 20, MPI_CHAR, 0, 99, MPI_COMM_WORLD, &status); printf("received :%s:\n", message); } MPI_Finalize(); } Параллельное программирование с использованием технологии MPI Аксёнов С.В. 12