Санкт-Петербургский государственный университет
Опубликован: 11.10.2012 | Доступ: свободный | Студентов: 956 / 174 | Длительность: 05:14:00
Специальности: Программист, Системный архитектор
Теги:
Лекция 5:
Коллективные обмены
Аннотация: В этой лекции дается общая характеристика коллективных обменов. Рассматриваются широковещательная рассылка, операции распределения и сбора данных, операции приведения, синхронизация коллективных обменов.
Презентацию к данной лекции Вы можете скачать здесь.
Общая характеристика коллективных обменов
Общая характеристика коллективных обменов:
- коллективные обмены не могут взаимодействовать с двухточечными. Коллективная
- передача не может быть перехвачена двухточечной подпрограммой приема;
- коллективные обмены могут выполняться как с синхронизацией, так и без нее;
- все коллективные обмены являются блокирующими для инициировавшего их обмена;
- теги сообщений в коллективных обменах назначаются системой.
Виды коллективных обменов:
- широковещательная передача - выполняется от одного процесса ко всем;
- распределение данных;
- сбор данных;
- обмен с барьером - это форма синхронизации работы процессов, когда обмен сообщениями происходит только после того, как к соответствующей процедуре обратилось определенное число процессов;
- операции сканирования;
- операции приведения. Входными являются данные нескольких процессов, а результат одно значение, которое становится доступным всем процессам, участвующим в обмене.
Широковещательная рассылка
Широковещательная рассылка выполняется подпрограммой
int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm) MPI_Bcast(buffer, count, datatype, root, comm, ierr)
Параметры этой процедуры одновременно являются входными и выходными:
- buffer - адрес буфера;
- count - количество элементов данных в сообщении;
- datatype - тип данных MPI;
- root - ранг главного процесса, выполняющего широковещательную рассылку;
- comm - коммуникатор.
Пример
#include "mpi.h" #include <stdio.h> int main(int argc,char *argv[]) { char data[24]; int myrank, count = 25; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); if (myrank == 0) { strcpy(data, "Hi, Parallel Programmer!"); MPI_Bcast(&data, count, MPI_BYTE, 0, MPI_COMM_WORLD); printf("send: %s\n", data); } else { MPI_Bcast(&data, count, MPI_BYTE, 0, MPI_COMM_WORLD); printf("received: %s\n", data); } MPI_Finalize(); return 0; }
Пример
#include "mpi.h" #include <stdio.h> int main(int argc, char *argv[]) { int myrank; int root = 0; int count = 1; float a, b; int n; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); if (myrank == 0) printf("Enter a, b, n\n"); scanf("%f %f %i", &a, &b, &n); MPI_Bcast(&a, count, MPI_FLOAT, root, MPI_COMM_WORLD); MPI_Bcast(&b, count, MPI_FLOAT, root, MPI_COMM_WORLD); MPI_Bcast(&n, count, MPI_INT, root, MPI_COMM_WORLD); } else { MPI_Bcast(&a, count, MPI_FLOAT, root, MPI_COMM_WORLD); MPI_Bcast(&b, count, MPI_FLOAT, root, MPI_COMM_WORLD); MPI_Bcast(&n, count, MPI_INT, root, MPI_COMM_WORLD); printf("%i Process got %f %f %i\n", myrank, a, b, n); } MPI_Finalize(); return 0; }