1 / 80

Интерфейс передачи сообщений : MPI

Интерфейс передачи сообщений : MPI. Базовые архитектуры. Массивно-параллельные системы (MPP) Симметричные мультипроцессорные системы (SMP) Системы с неоднородным доступом к памяти (NUMA) Кластерные системы. Массивно-параллельные системы (MPP).

viola
Download Presentation

Интерфейс передачи сообщений : MPI

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Интерфейс передачи сообщений: MPI

  2. Базовые архитектуры • Массивно-параллельные системы (MPP) • Симметричные мультипроцессорные системы (SMP) • Системы с неоднородным доступом к памяти (NUMA) • Кластерные системы

  3. Массивно-параллельные системы (MPP) MPP состоят из однородных вычислительных узлов, включающих • один или несколько процессоров • локальную память • коммуникационный процессор или сетевой адаптер • жесткие диски и/или другие устройства ввода/вывода (иногда)

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

  5. … … … … …… …… …… ВУ №1 ВУ №2 ВУ№N Управляющий узел(ы) ВУ№... ВУ№.. ВУ№M Ввод-вывод Схема MPP системы

  6. Общая память Высокоскоростная среда передачи данных CPU CPU CPU CPU CPU Симметричные мультипроцессорные системы (SMP)

  7. CPU CPU CPU CPU CPU CPU CPU CPU CPU Память Память Память Высокоскоростной коммутатор …… Системы с неоднородным доступом к памяти (NUMA)

  8. Узел (ВМ) Узел (ВМ) Узел (ВМ) … Высокоскоростная сеть Кластерные системы

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

  10. Система связи • Система связи включает два компонента: • Программный • Аппаратный • Способы передачи данных: • Через разделяемую память • В виде сообщений

  11. Краткая характеристика MPI • Single program/Multiple data (SPMD) • Multiple instruction/Multiple data (MIMD)

  12. Коммуникаторы, группы и области связи • Группа (MPI_Group) • Область связи (communication domain) • Коммуникатор

  13. Обрамляющие функции. Начало и завершение • Инициализация библиотеки • MPI_Init( &argc, &argv ) • Аварийное закрытие библиотеки • MPI_Abort( описатель области связи,код ошибки MPI ) • Нормальное закрытие библиотеки • MPI_Finalize() • Информационные функции: сообщают размер группы и порядковый номер вызывающей задачиint size, rank: • MPI_Comm_size( MPI_COMM_WORLD, &size ) • MPI_Comm_rank( MPI_COMM_WORLD, &rank )

  14. Пример: использование MPI_Init, MPI_Finalize, MPI_Comm_size, MPI_Comm_rank #include <mpi.h> #include <stdio.h> int main( int argc, char **argv ) { int size, rank, i; … return 0; }

  15. int main( int argc, char **argv) MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &size ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if( rank==0 ) printf("Total processes count = %d\n", size ); printf("Hello! My rank in MPI_COMM_WORLD = %d\n", rank ); MPI_Barrier( MPI_COMM_WORLD ); if( rank == 0 ) for( puts ("Command line of process 0:"), i=0; i<argc;i++) printf( "%d: \"%s\"\n", i, argv[i] ); MPI_Finalize();

  16. int main( int argc, char **argv) MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &size ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if( rank==0 ) printf("Total processes count = %d\n", size ); printf("Hello! My rank in MPI_COMM_WORLD = %d\n", rank ); MPI_Barrier( MPI_COMM_WORLD ); if( rank == 0 ) for( puts ("Command line of process 0:"), i=0; i<argc;i++) printf( "%d: \"%s\"\n", i, argv[i] ); MPI_Finalize();

  17. int main( int argc, char **argv) MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &size ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if( rank==0 ) printf("Total processes count = %d\n", size ); printf("Hello! My rank in MPI_COMM_WORLD = %d\n", rank ); MPI_Barrier( MPI_COMM_WORLD ); if( rank == 0 ) for( puts ("Command line of process 0:"), i=0; i<argc;i++) printf( "%d: \"%s\"\n", i, argv[i] ); MPI_Finalize();

  18. int main( int argc, char **argv) MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &size ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if( rank==0 ) printf("Total processes count = %d\n", size ); printf("Hello! My rank in MPI_COMM_WORLD = %d\n", rank ); MPI_Barrier( MPI_COMM_WORLD ); if( rank == 0 ) for( puts ("Command line of process 0:"), i=0; i<argc;i++) printf( "%d: \"%s\"\n", i, argv[i] ); MPI_Finalize();

  19. int main( int argc, char **argv) MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &size ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if( rank==0 ) printf("Total processes count = %d\n", size ); printf("Hello! My rank in MPI_COMM_WORLD = %d\n", rank ); MPI_Barrier( MPI_COMM_WORLD ); if( rank == 0 ) for( puts ("Command line of process 0:"), i=0; i<argc;i++) printf( "%d: \"%s\"\n", i, argv[i] ); MPI_Finalize();

  20. int main( int argc, char **argv) MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &size ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if( rank==0 ) printf("Total processes count = %d\n", size ); printf("Hello! My rank in MPI_COMM_WORLD = %d\n", rank ); MPI_Barrier( MPI_COMM_WORLD ); if( rank == 0 ) for( puts ("Command line of process 0:"), i=0; i<argc;i++) printf( "%d: \"%s\"\n", i, argv[i] ); MPI_Finalize();

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

  22. Функции MPI • MPI_Recv и MPI_Send – выполняют блокирующую приемопередачу с автоматическим выбором зацепления • Функции коллективных коммуникаций: • broadcast– один-всем • scatter– один-каждому • gather– каждый-одному • allgather– все-каждому • alltoall– каждый-каждому

  23. Связь “точка-точка”. Простейший набор. Пример. Задача 1 передает: int buf[10]; MPI_Send( buf, 5, MPI_INT, 1, 0, MPI_COMM_WORLD ); Задача 2 принимает: int buf[10]; MPI_Status status; MPI_Recv( buf, 10, MPI_INT, 0, 0, MPI_COMM_WORLD, &status ); Аргументы функций: • Адрес буфера • Размер буфера • Тип ячейки буфера • Номер задачи • Идентификатор сообщения • Описатель области связи • Статус завершения приема

  24. Коллективные функции • Точки синхронизации, или барьеры • Функции коллективного обмена данными • Функции поддержки распределенных операций

  25. Основные особенности и отличия от коммуникаций типа “точка-точка” • на прием и/или передачу работают одновременно все задачи-абоненты указываемого коммуникатора • коллективная функция выполняет одновременно и прием, и передачу • как правило, значения ВСЕХ параметров должны быть идентичными во всех задачах • MPI назначает идентификатор для сообщений автоматически

  26. Функции • MPI_Bcast • MPI_Bcast( buf, count, dataType, rootRank, communicator ) • MPI_Gather (MPI_Gatherv) • MPI_Scatter (MPI_Scatterv) • MPI_Allgather (MPI_Allgatherv) • MPI_Alltoall (MPI_Alltoallv)

  27. время Точки синхронизации, или барьеры Без барьеров: 0 xxxx....xxxxxxxxxxxxxxxxxxxx 1 xxxxxxxxxxxx....xxxxxxxxxxxx 2 xxxxxxxxxxxxxxxxxxxxxx....xx int MPI_Barrier( MPI_Comm comm ) С барьерами: 0 xxxx....xx(xxxxxxxx(||||xxxxxxxx(||xx 1 xxxxxx(||||x....xxxxxxx(xxxxxxxx(||xx 2 xxxxxx(||||xxxxxxxx(||||..xxxxxxxx(xx Обозначения: x нормальное выполнение .ветвь простаивает ( вызван MPI_Barrier | MPI_Barrier ждет своего вызова в остальных ветвях

  28. Распределенные операции int vector[16]; int resultVector[16]; MPI_Comm_rank( MPI_COMM_WORLD, &myRank ); for( i=0; i<16; i++ ) vector[i] = myRank*100 + i; MPI_Reduce( vector, resultVector, 16, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); if( myRank==0 ) /* печатаем resultVector,равный сумме векторов */

  29. Распределенные операции int vector[16]; int resultVector[16]; MPI_Comm_rank( MPI_COMM_WORLD, &myRank ); for( i=0; i<16; i++ ) vector[i] = myRank*100 + i; MPI_Reduce( vector, resultVector, 16, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); if( myRank==0 ) /* печатаем resultVector,равный сумме векторов */

  30. Распределенные операции int vector[16]; int resultVector[16]; MPI_Comm_rank( MPI_COMM_WORLD, &myRank ); for( i=0; i<16; i++ ) vector[i] = myRank*100 + i; MPI_Reduce( vector, resultVector, 16, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); if( myRank==0 ) /* печатаем resultVector,равный сумме векторов */

  31. Распределенные операции int vector[16]; int resultVector[16]; MPI_Comm_rank( MPI_COMM_WORLD, &myRank ); for( i=0; i<16; i++ ) vector[i] = myRank*100 + i; MPI_Reduce( vector, resultVector, 16, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); if( myRank==0 ) /* печатаем resultVector,равный сумме векторов */

  32. Распределенные операции int vector[16]; int resultVector[16]; MPI_Comm_rank( MPI_COMM_WORLD, &myRank ); for( i=0; i<16; i++ ) vector[i] = myRank*100 + i; MPI_Reduce( vector, resultVector, 16, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); if( myRank==0 ) /* печатаем resultVector,равный сумме векторов */

  33. Распределенные операции int vector[16]; int resultVector[16]; MPI_Comm_rank( MPI_COMM_WORLD, &myRank ); for( i=0; i<16; i++ ) vector[i] = myRank*100 + i; MPI_Reduce( vector, resultVector, 16, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); if( myRank==0 ) /* печатаем resultVector,равный сумме векторов */

  34. Распределенные операции int vector[16]; int resultVector[16]; MPI_Comm_rank( MPI_COMM_WORLD, &myRank ); for( i=0; i<16; i++ ) vector[i] = myRank*100 + i; MPI_Reduce( vector, resultVector, 16, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); if( myRank==0 ) /* печатаем resultVector,равный сумме векторов */

  35. Распределенные операции int vector[16]; int resultVector[16]; MPI_Comm_rank( MPI_COMM_WORLD, &myRank ); for( i=0; i<16; i++ ) vector[i] = myRank*100 + i; MPI_Reduce( vector, resultVector, 16, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); if( myRank==0 ) /* печатаем resultVector,равный сумме векторов */

  36. Распределенные операции int vector[16]; int resultVector[16]; MPI_Comm_rank( MPI_COMM_WORLD, &myRank ); for( i=0; i<16; i++ ) vector[i] = myRank*100 + i; MPI_Reduce( vector, resultVector, 16, MPI_INT, MPI_SUM, 0,MPI_COMM_WORLD); if( myRank==0 ) /* печатаем resultVector,равный сумме векторов */

  37. Предопределенные описатели операций в MPI • MPI_MAX и MPI_MIN ищут поэлементные максимум и минимум; • MPI_SUM вычисляет сумму векторов; • MPI_PROD вычисляет поэлементное произведение векторов; • MPI_LAND, MPI_BAND, MPI_LOR, MPI_BOR, MPI_LXOR, MPI_BXOR - логические и двоичные операции И, ИЛИ, исключающее ИЛИ; • MPI_MAXLOC, MPI_MINLOC - поиск индексированного минимума/максимума.

  38. Операции • Ассоциативные: (a+b)+c = a+(b+c) • Коммутативные: a+b = b+a • Операции: • MPI_Allreduce • MPI_Reduce_scatter • MPI_Scan

  39. Создание коммутаторов и групп Копирование: MPI_Comm tempComm; MPI_Comm_dup( MPI_COMM_WORLD, &tempComm ); MPI_Comm_free( &tempComm ); Расщепление: MPI_Comm_split( existingComm, indexOfNewSubComm, rankInNewSubComm, &newSubComm ); MPI_Comm_group MPI_Group_xxx MPI_Comm_create MPI_Group_free Создание через группы:

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

  41. Зачем MPI знать тип передаваемых данных • Пользовательские типы данных • Приложение MPI может работать на гетерогенном вычислительном комплексе (коллективе ЭВМ с разной архитектурой) • Фортрановский тип CHARACTER • Структуры в Си

  42. Использование MPI • Средства автоматической декомпозиции • Языки программирования • Оптимизированные библиотеки для стандартных языков • Средства визуального проектирования • Отладчики

  43. MPI-1 и MPI-2 • Нововведения в MPI-2: • Взаимодействие между приложениями. Поддержка механизма "клиент-сервер". • Динамическое порождение ветвей • Для работы с файлами создан архитектурно-независимый интерфейс • Разделяемая память может быть не только каналом связи между ветвями, но и местом совместного хранения данных

  44. Пример #include <mpi.h> #include <stdio.h>  #define tagFloatData 1 #define tagDoubleData 2  #define ELEMS(x) ( sizeof(x) / sizeof(x[0]) )

  45. Пример #include <mpi.h> #include <stdio.h>  #define tagFloatData 1 #define tagDoubleData 2  #define ELEMS(x) ( sizeof(x) / sizeof(x[0]) )

  46. Пример #include <mpi.h> #include <stdio.h>  #define tagFloatData 1 #define tagDoubleData 2  #define ELEMS(x) ( sizeof(x) / sizeof(x[0]) )

  47. Пример int main( int argc, char **argv ) { int size, rank, count; float floatData[10]; double doubleData[20]; MPI_Status status; MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &size ); MPI_Comm_rank( MPI_COMM_WORLD, &rank );

  48. Пример if(size != 2) { if(rank==0) printf("Error: two processes required insteadof%d, abort\n",size ); MPI_Barrier( MPI_COMM_WORLD ); MPI_Abort(MPI_COMM_WORLD,MPI_ERR_OTHER); return -1; }

  49. Пример if(size != 2) { if(rank==0) printf("Error: two processes required instead of%d, abort\n",size ); MPI_Barrier( MPI_COMM_WORLD ); MPI_Abort(MPI_COMM_WORLD,MPI_ERR_OTHER); return -1; }

  50. Пример if(size != 2) { if(rank==0) printf("Error: two processes required instead of%d, abort\n",size ); MPI_Barrier( MPI_COMM_WORLD ); MPI_Abort(MPI_COMM_WORLD,MPI_ERR_OTHER); return -1; }

More Related