1 / 23

Параллельное программирование с использованием технологии MPI

Параллельное программирование с использованием технологии MPI. Лекция 5 Томский политехнический университет. Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ. Селекция сообщения Для получения сообщения процессу необходимо знать: - идентификатор процесса отправителя

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 Лекция 5 Томский политехнический университет Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  2. Селекция сообщения • Для получения сообщения процессу необходимо знать: • - идентификатор процесса отправителя • тег сообщения • коммуникатор процесса отправителя • Процесс-получатель может задавать значение • MPI_ANY_SOURCE для отправителя и/или значение • MPI_ANY_TAG для тэга, определяя, что любой отправитель и/илитэг разрешен. Атрибуты сообщения Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  3. Статусная информация – структура, содержащая три поля • MPI_SOURCE • MPI_TAG • MPI_ERROR. Статусная информация Возвращение числа полученных элементов intMPI_Get_count (MPI_Status *status,MPI_Datatypedatatype, int *count) Вход status: Статусная информация Входdatatype: Тип элементов в приёмном буфере Выход count: Количество полученных единиц Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  4. Посылка может стартовать вне зависимости от того, выполнен ли соответствующий прием. Она может быть завершена до окончания приема. В этом режиме решение о том, будет ли исходящее сообщение буферизовано или нет, принимает MРI. MРI может буферизовать исходящее сообщение. В таком случае операция посылки может завершиться до того, как будет вызван соответствующий прием. С другой стороны, буферное пространство может отсутствовать или MРI может отказаться от буферизации исходящего сообщения из-за ухудшения характеристик обмена. В этом случае вызов sendне будет завершен, пока данные не будут перемещены в процесс-получатель. Стандартный блокирующий режим Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  5. intMPI_Send(void *buf, intcount, MPI_Datatypedatatype, intdest, inttag, MPI_Commcomm) Стандартный блокирующий режим Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  6. Передача сообщения в буферизованном режиме может быть начата независимо от того, зарегистрирован ли соответствующий прием. Источник копирует сообщение в буфер, а затем передает его в неблокирующем режиме, так же как в стандартном режиме. Эта операция локальна, поскольку ее выполнение не зависит от наличия соответствующего приема. Если объем буфера недостаточен, возникает ошибка. Выделение буфера и его размер контролируются программистом. Буферизированный режим посылки Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  7. int MPI_Bsend(void *buf, intcount, MPI_Datatypedatatype,intdest, inttag, MPI_Commcomm) Буферизированный режим посылки Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  8. MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if (rank == 0) { MPI_Bsend(&buf1,10,MPI_INT,1,25,MPI_COMM_WORLD); MPI_Bsend(&buf2,20,MPI_DOUBLE,1,26,MPI_COMM_WORLD); } if (rank==1) { MPI_Recv(&source1, 10, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD,&status); MPI_Recv(&source2, 20, MPI_DOUBLE, 0, 26, MPI_COMM_WORLD,&status); } Пример: необгоняемые сообщения Процесс 1. Отправка сообщения buf1. Буферизированиеbuf1 Процесс 2. Получение данных из буфера buf1→source1 Процесс 1. Отправка сообщения buf2. Буферизированиеbuf2 Процесс 2. Получение данных из буфера buf2 →source2 Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  9. Выделение буфера и его размер контролируются программистом. Размер буфера должен превосходить размер сообщения на величину MPI_BSEND_OVERHEAD. Установка буфера Распределение и использование буферов int MPI_Buff_attach(void *buf, intsize) Вход buf: Начальный адрес буфера Вход size: Размер буфера в байтах Назначение:Создание буфера bufразмером size байтов Отключение буфера int MPI_Buff_detach(void *buf, int *size) Выход buf: Начальный адрес буфера Выход size: Размер буфера в байтах Назначение:Отключение буфера. Получение адреса bufи размера отключаемого буфера buf. Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  10. int *buffer; • int rank; • MPI_Status status; • intbuffsize = 40; • MPI_Init(&argc, &argv); • MPI_Comm_rank(MPI_COMM_WORLD, &rank); • if (rank == 0) • { • buffer = (int *) malloc(buffsize*sizeof(int) + MPI_BSEND_OVERHEAD); • MPI_Buffer_attach(buffer, buffsize); • //Заполнение buffer • MPI_Bsend(buffer, buffsize, MPI_INT, 1, 25, MPI_COMM_WORLD); • MPI_Buffer_detach(&buffer, &buffsize); • } • elseif (rank==1) • MPI_Recv(buffer, buffsize, MPI_INT, 0, 25, MPI_COMM_WORLD, &status); • MPI_Finalize(); Пример Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  11. Посылка может стартовать вне зависимости от того, был ли начат соответствующий прием. Посылка будет завершена успешно, только если соответствующая операция приема стартовала. Завершение синхронной передачи не только указывает что буфер отправителя может быть повторно использован, но также и отмечает, что получатель начал выполнение приема. Синхронный режим Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  12. intMPI_Ssend(void *buf, intcount, MPI_Datatypedatatype, intdest, inttag, MPI_Commcomm) Синхронный режим Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  13. MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if (rank == 0) { MPI_Bsend(&buf1,20,MPI_INT,1,25,MPI_COMM_WORLD); MPI_Ssend(&buf2,20,MPI_INT,1,26,MPI_COMM_WORLD); } else if (rank==1) { MPI_Recv(&source1, 20, MPI_INT, 0, 26, MPI_COMM_WORLD,&status); MPI_Recv(&source2, 20, MPI_INT, 0, 25, MPI_COMM_WORLD,&status); } Пример: пересекающиеся пары Процесс 1. Отправка сообщения buf1. Буферизированиеbuf1 Процесс 1. Отправка сообщения buf2. Процесс 2. Прием сообщения buf2→source1 Процесс 2. Получение данных из буфера buf1 →source2 Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  14. Посылка может быть запущена только тогда, когда прием уже инициирован. В противном случае операция является ошибочной, и результат будет неопределенным. Завершение операции посылки не зависит от состояния приема и указывает, что буфер посылки может быть повторно использован. Операция посылки, которая использует режим готовности, имеет ту же семантику, как и стандартная или синхронная передача. Обмен по готовности Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  15. int MPI_Rsend(void *buf, intcount, MPI_Datatypedatatype, intdest, inttag, MPI_Commcomm) Обмен по готовности Параллельное программирование с использованием технологии MPI Аксёнов С.В.

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

  17. Передача intMPI_Isend (void* buf, int count, MPI_Datatypedatatype, intdest, inttag,MPI_Commcomm, MPI_Request *request) intMPI_Ibsend (void* buf, int count, MPI_Datatypedatatype, intdest,int tag, MPI_Comm comm, MPI_Request *request) intMPI_Issend (void* buf, int count, MPI_Datatypedatatype, intdest, int tag,MPI_Commcomm, MPI_Request *request) intMPI_Irsend (void* buf, int count, MPI_Datatypedatatype, intdest, inttag, MPI_Commcomm, MPI_Request *request) Приём intMPI_Irecv (void* buf, int count, MPI_Datatypedatatype, int source, int tag, MPI_Commcomm, MPI_Request *request) Выходrequest: Запрос обмена Остальные аргументы аналогичны аргументам функций блокирующего приёма/ блокирующей передачи Фнкции инициации обмена Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  18. Завершение операции посылки указывает, что отправитель теперь может изменять содержимое ячеек буфера посылки (операция посылки сама не меняет содержание буфера). Операция завершения не извещает, что сообщение было получено, но дает сведения, что оно было буферизовано коммуникационной подсистемой. Завершение операции приема указывает, что приемный буфер содержит принятое сообщение, что процесс-получатель теперь может обращаться к нему. Завершение обмена Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  19. Подпрограмма MPI_Wait блокирует работу процесса до завершения приема или передачи сообщения. intMPI_Wait (MPI_Request *request, MPI_Status *status) Вход/Выход request: Запрос обмена Выход status: Статус Функции завершения обмена Подпрограмма MPI_Test выполняет неблокирующую проверку завершения приема или передачи сообщения. intMPI_Test (MPI_Request *request, int *flag, MPI_Status *status) Вход/Выход request: Запрос обмена Выход flag: 1 – если операция завершена Выход status: Статус Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  20. MPI_Request request; MPI_Status status; MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if (rank == 0) { MPI_Isend(&buf1,20,MPI_INT,1,25,MPI_COMM_WORLD, &request); MPI_Wait(&request, &status) } if (rank==1) { MPI_Irecv(&source2, 20, MPI_INT, 0, 25, MPI_COMM_WORLD,&request); MPI_Wait(&request, &status); } Пример Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  21. MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if (rank == 0) { MPI_Send(&buf1,20,MPI_INT,1,25,MPI_COMM_WORLD); MPI_Recv(&source1, 20, MPI_INT, 1, 25, MPI_COMM_WORLD,&status); } if (rank==1) { MPI_Recv(&source2, 20, MPI_INT, 0, 25, MPI_COMM_WORLD,&status); MPI_Send(&buf2,20,MPI_INT, 0,25,MPI_COMM_WORLD); } Задача 1 Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  22. MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if (rank == 0) { MPI_Recv(&source1, 20, MPI_INT, 1, 25, MPI_COMM_WORLD,&status); MPI_Send(&buf1,20,MPI_INT,1,25,MPI_COMM_WORLD); } if (rank==1) { MPI_Recv(&source2, 20, MPI_INT, 0, 25, MPI_COMM_WORLD,&status); MPI_Send(&buf2,20,MPI_INT, 0,25,MPI_COMM_WORLD); } Задача 2 Параллельное программирование с использованием технологии MPI Аксёнов С.В.

  23. MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if (rank == 0) { MPI_Send(&buf1,20,MPI_INT,1,25,MPI_COMM_WORLD); MPI_Recv(&source1, 20, MPI_INT, 1, 25, MPI_COMM_WORLD,&status); } if (rank==1) { MPI_Send(&buf2,20,MPI_INT, 0,25,MPI_COMM_WORLD); MPI_Recv(&source2, 20, MPI_INT, 0, 25, MPI_COMM_WORLD,&status); } Задача 3 Параллельное программирование с использованием технологии MPI Аксёнов С.В.

More Related