Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
void *buf1 - адрес переменной, где хранится аргумент глобальной функции
void *buf2 - адрес переменной, где будет храниться результат действия глобальной функции
int count - количество аргументов на одном процессе
MPI_Datatype type - тип аргументов и результата в терминологии MPI
MPI_Op op - идентификатор глобальной операции
int root - идентификатор процесса, на котором будет записан результат глобальной операции
MPI_Comm comm - идентификатор коммуникатора группы, которой принадлежат процессы
Процесс, обратившийся к данной функции проверят свой rank с параметром root. Если совпадает, то он собирает со всех процессов переменную, находящуюся buf1, выполняет глобальную операцию op и записывает результат по адресу buf2. Собирает со всех и у себя тоже. Если идентификатор не совпадает с root, то процесс передает переменную, находящуюся по адресу buf1, количества count и типа type.
Если результат нужно сохранить на всех процессах, то пользуются функцией:
int MPI_Allreduse(void *, void *, int, MPI_Datatype,MPI_Op,MPI_Comm);
Обе функции возвращают 0 в результате успешного завершения.
Функция сбора данных в один массив
int MPI_Gather(void *bufr, int rcount, MPI_Datatype rtype, void *bufw, int wcount, MPI_Datatype wtype, int root, MPI_Comm comm); // r – откуда, w - куда
void *bufr - адрес переменной или массива, которая будет считываться
int rcount - количество принимаемой информации от каждого процесса
MPI_Datatype rtype - тип элементов в принимаемом сообщении
void *bufw - адрес массива, куда будет записана информация
int root - идентификатор где будет сохранен массив
Процесс с номером root получает последовательно от всех процессов и от себя тоже данные, находящиеся по адресу bufr и записывает по адресу bufw. Если необходимо собрать массив на всех процессах, то пользуются функцией:
MPI_Allgather(void*, int*, MPI_Datetype, void*, int*, MPI_Datatype, MPI_Comm);
Функции возвращают 0 в случае успешного завершения.
Функция рассылки частей массива на все процессы
int MPI_Scatter(void *bufr, int rcount, MPI_Datatype rtype, void *bufw, int wcount, MPI_Datatype wtype, int root, MPI_Comm comm);
Процесс root из массива по адресу bufr по rcount элемента типа rtype рассылает последовательно по номеру процесса и себе тоже. Все остальные процессы получают от root данные и записывают по адресу bufw, wcount элементов типа wtype, которые должны совпадать. Все процессы принадлежат группе с коммуникатором comm.
6. Функции обмена с блокировкой: MPI_Send(), MPI_Recv(), MPI_Ssent(),MPI_Bsend(), MPI_Rsend(), MPI_Buffer_attach(), MPI_Buffer_detach().
Функции передачи с блокировкой
int MPI_Send (void* buf, int count, MPI_Datatype type, int des, int msgtag, MPI_Comm comm)
void *buf - адрес переменной или массива, откуда будет передаваться информация
int count - количество элементов в передаваемом сообщении
MPI_Datatype type - тип элементов передаваемого сообщения в терминологии MPI
int des - идентификации процесса получателя
int msgtag - идентификатор сообщения, должен совпадать у переедающего и принимающего процессов
MPI_Comm comm - идентификатор коммуникатора группы, которой принадлежат переедающие и принимающие процессы
Функция MPI_Send - передача точка-точка
При обращении к функции данные будут либо переданы, либо помещены в буфер, если процесс-получатель не готов к обмену и закончит работу успешно. Блокировка означает, что на момент реального обмена будут переданы те данные, которые были на момент обращения к функции. То есть выполняется на данные. Это обеспечивается тем, что в буфер помещаются значения. Функция возвращает 0 в случае успешного завершения, иначе код ошибки. Так как после выполнения функции нельзя быть уверенным, что сообщение было передано ввели следующие 3 функции с теми же параметрами:
- int MPI_Ssend(...) - синхронная передача, завершение работы функции возможно только после того, как сообщение полностью передано. Если процесс-получатель не готов приему, возможно бесконечное ожидание.
- int MPI_Bsend(...) - программист сам создает буфер, куда помещается передаваемое сообщение. Для этого необходимы функции:
int MPI_Buffer_attach(void* buffer, int size); - выделение буферного пространства в памяти.
int MPI_Buffer_detach(void* buffer, int* size); - освобождение буферного пространства в памяти.
- int MPI_Rsend(...) - передача по готовности. Функция сразу передает сообщение, если процесс-получатель не готов к приему, функция завершается с ошибкой. Все функции возвращают 0 или код ошибки.
Функция приема сообщения
int MPI_Recv(void *buf, int count, MPI_Datatype type, int source, int msgtag, MPI_Comm comm,
MPI_Status *status);
void *buf - адрес переменной или массива, куда будет записана полученная информация
int count - количество элементов в принятом сообщении. Можно указывать значение больше, чем будет получено, будет записано столько, сколько элементов пришло.
MPI_Datatype type - тип элементов в принятом сообщении в терминологии MPI
int source - идентификатор процесса-отправителя. Можно указывать константу
MPI_ANY_SOURCE, то есть будет получено сообщение от любого процесса, годового к обмену.
int msgtag - идентификатор сообщения, должен совпадать у переедающего и принимающего
MPI_Comm comm - идентификатор коммуникатора группы, которому принадлежат переедающие и принимающие процессы.
MPI_Status *status - указатель на структуру MPI_Status, куда будут записаны атрибуты принятого сообщения, возвращаемое значение.
Функция возвращает 0, иначе код ошибки.
При обращении к функции процесс будет стоять и ждать, пока не получит сообщение. То есть после завершения работы функции можно быть уверенным, что сообщение полностью получено.
Дата публикования: 2015-02-03; Прочитано: 366 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!