Содержание
- 2. План MPI PVM
- 3. Литература http://www.mpi-forum.org/docs/docs.html http://www.cluster.kiev.ua/support/documentation/ http://www.cluster.kiev.ua/support/documentation/pvm3/book/pvm-book.html
- 4. Интерфейсы разработки параллельных программ API для распределенного программирования не рассчитаны на разработку сложных схем обмена между
- 5. Стандарт MPI Стандарт интерфейса обмена сообщениями Гарантируется совместимость на уровне исходного кода C и Fortran Существует
- 6. Основные понятия MPI программа – набор параллельно выполняющихся процессов, которые могут обмениваться между собой сообщениями Для
- 7. Запуск MPI машины Зависит от реализации Программы на других машинах запускаются командой $LAMRSH export LAMRSH="rsh“ Виртуальная
- 8. Запуск программ mpirun –np
- 9. Структура MPI программы Все процессы чаще всего выполняют один и тот же исполняемый файл Первой MPI
- 10. Основной коммуникационный домен Все процессы выполняют один исполняемый файл Все процессы принадлежат основному коммуникационному домену с
- 11. Пример MPI программы int main(int argc, char* argv[]){ int my_number; //Мой номер процесса int proc_num; //общее
- 12. Создание новых коммуникационных доменов Иногда необходимо организовать обмен между процессами параллельно с обменом в основном коммуникационном
- 13. Копирование доменов Создание копии существующего домена Обмен в новом домене не перекрывается с обменом в старом
- 14. Разбиение существующего домена на части Существующий коммуникатор можно разбить на части Все процессы старого коммуникатора должны
- 15. Пример расщепления #include "mpi.h" int main(int argc, char* argv[]){ MPI_Comm subComm; int size, rank, subrank, subsize;
- 16. Компиляция и выполнения [saa@cluster mpi]$ mpicc ./comm_split.c -o comm_split [saa@cluster mpi]$ mpirun -np 10 -wd /net/s1/$PWD
- 17. Создание коммуникатора на базе группы Создается группа процессов на базе существующего коммуникатора В/из группы добавляются/удаляются номера
- 18. Создание группы на базе коммуникатора Группа – набор номеров процессов Может выполнить каждый процесс параллельной программы
- 19. Операции с группами Удаление процессов из группы Добавление процессов в группы Объединение групп Удаление групп MPI_Group
- 20. Создание нового коммуникатора на базе группы MPI_Comm subComm; MPI_Group subgroup; MPI_Comm_create(MPI_COMM_WORLD, subgroup,&subComm);
- 21. Пример работы с группами #include "mpi.h" int main(int argc, char* argv[]){ MPI_Comm subComm; int size, rank,
- 22. Компиляция и выполнение [saa@cluster mpi]$ mpicc ./comm_group.c -o comm_group [saa@cluster mpi]$ mpirun -np 10 -wd /net/s1/$PWD
- 23. Получение имени машины, где работает процесс char nm[4096]; int name_size = 4096; MPI_Get_processor_name(nm, &nm_size);
- 24. Операции передачи данных Все передачи данных выполняются в пределах коммуникатора Данные пересылаются в виде сообщений Сообщение
- 25. Операции точка-точка (блокирующие) Передача int buf[10]; MPI_Send( buf, 5, MPI_INT, 1, 0, MPI_COMM_WORLD ); Прием int
- 26. Результат операции (статус) Данные могут прийти неизвестно от кого С неизвестным тегом В неизвестном количестве При
- 27. Коллективные (распределенные) операции MPI_Broadcast MPI_Reduce MPI_Gather MPI_Scatter MPI_All_Gather … Выполняются всеми процессами для эффективного выполнения суммирования,
- 28. #include "mpi.h" int main(int argc, char* argv[]){ MPI_Comm subComm; int size, rank, subrank, subsize; int vector[16],i;
- 29. Пример выполнения [saa@cluster mpi]$ mpirun -np 10 -wd /net/s1/$PWD ./reduce resultVector[0]=4500 resultVector[1]=4510 resultVector[2]=4520 resultVector[3]=4530 resultVector[4]=4540 resultVector[5]=4550
- 30. Типы данных На разных аппаратных платформах одинаковые типы данных представляются по разному Необходимо при передаче преобразовывать
- 31. Встроенные типы данных C MPI_CHAR MPI_SHORT MPI_INT MPI_LONG MPI_UNSIGNED_CHAR MPI_UNSIGNED_SHORT MPI_UNSIGNED_LONG MPI_UNSIGNED MPI_FLOAT MPI_DOUBLE MPI_LONG_DOUBLE MPI_BYTE
- 32. Создание новых типов данных Для сложных структур данных можно создать свой тип Это упрощает сериализацию Новый
- 33. Функции создания новых типов данных MPI_Type_struct( count, /* количество полей */ int *len, /* массив с
- 34. Пример создания типа структуры #include /* подключаем макрос 'offsetof()' */ typedef struct { int i; double
- 35. Упаковка данных (сериализация) Упаковка – запись разнотипных структур данных в один массив int MPI_Pack(void *buf, int
- 36. Распаковка данных int MPI_Unpack(void *packbuf, int packsize, int *packpos, void *buf, int count, MPI_Datatype dtype, MPI_Comm
- 37. Пример упаковки-распаковки #define msgTag 10 struct { int i; float f[4]; char c[8]; } s; Передача
- 38. Асинхронные операции Функция приема-передачи не блокируется Прием-передачу можно выполнять параллельно с обработкой данных К передаваемым данным
- 39. Функции асинхронной передачи-приема MPI_Isend (&buf,count,datatype,dest,tag,comm,&request) MPI_Irecv (&buf,count,datatype,source,tag,comm,&request) Все параметры аналогичные Добавляется еще один Статус выполнения запроса
- 40. Проверка состояния Проверка MPI_Test(MPI_Request *req, int *flag, MPI_Status *stat) Статус может быть MPI_STATUS_IGNORE Ожидание завершения MPI_Wait(MPI_Request
- 41. Пример асинхронной операции MPI_Request reqs[4]; MPI_Status stats[4]; MPI_Irecv(&buf[0], 1, MPI_INT, prev, tag1, MPI_COMM_WORLD, &reqs[0]); MPI_Irecv(&buf[1], 1,
- 42. Расширенные возможности MPI-2 Параллельный ввод-вывод в разные части файла Доступ к памяти на удаленной машине Синхронизация
- 43. PVM Рассчитана на гетерогенные системы Функции Управление процессами Упаковка – распаковка данных Прием – передача сообщений
- 44. Параллельная машина Создается путем запуска демонов на соответствующих хостах Имеет общую среду управления Все системные переменные
- 45. Запуск параллельной машины Машина запускается командой pvm При этом запускается демон на локальной машине Запуск программ
- 46. Функции управления процессами Создание процессов int numt = pvm_spawn( char *task, // имя программы char **argv,
- 47. Функции управления процессами int pvm_kill (int taskid) – завершение другого процесса pvm_exit() – завершение своего процесса
- 48. Управление виртуальной машиной Добавление физических машин int info = pvm_addhosts( char **hosts, int nhost, int *infos
- 49. Пример #include #include int main (int argc, char* argv[]){ char* hosts[]={"node1", "node2", "node3"}; int tids[16]; int
- 50. Пример выполнения и компиляции [saa@cluster pvm]$ gcc ./create.c -I$PVM_ROOT/include -L$PVM_ROOT/lib/$PVM_ARCH -lpvm3 -o create /usr/share/pvm3/lib/LINUXI386/libpvm3.a(lpvmgen.o)(.text+0x292): In function
- 51. Прием и отправка сообщений Инициализация буфера упаковки Упаковка Отправка
- 52. Инициализация буфера упаковки Данные пакуются в специальный буфер В системе может быть несколько буферов Один –
- 53. Упаковка и распаковка сообщений Для сериализации существуют функции упаковки и распаковки разных типов данных Данные пакуются
- 54. Отправка-прием Данные отправляются и принимаются в буфер по умолчанию Отправка int pvm_send(int tid, in tag) Прием
- 55. Пример программы #include #include int main (int argc, char* argv[]){ char* hosts[]={"node1", "node2", "node3"}; int tids[16];
- 56. Пример выполнения [saa@cluster pvm]$ gcc ./msg.c -I$PVM_ROOT/include -L$PVM_ROOT/lib/$PVM_ARCH -lpvm3 -o msg /usr/share/pvm3/lib/LINUXI386/libpvm3.a(lpvmgen.o)(.text+0x292): In function `pvmlogperror': :
- 58. Скачать презентацию