Здавалка
Главная | Обратная связь

MPI_Gatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, root, comm)



IN sendbufначальный адрес буфера отправителя

IN sendcountколичество элементов в отсылаемом сообщении (целое)

IN sendtypeтип элементов в отсылаемом сообщении

OUT recvbufадрес буфера процесса сборки данных (существ-но для корневого процесса)

IN recvcountsмассив цел. чисел (gsize), содержит количество элементов, полученных от каждого процесса (используется корневым процессом)

IN displsмассив целых чисел (gsize). Эл-нт i определяет смещение относит. recvbuf, в котором размещаются данные из процесса i (исп-ся корневым процессом)

IN recvtypeтип данных элементов в буфере процесса-получателя

IN rootномер процесса-получателя (целое)

IN commкоммуникатор

 

MPI_Gatherv имеет аналогичные параметры, за исключением int*recvcountsиint*displs –это массивы целых чисел, размеры которых равны размеру группы (числу процессов).

В отличие от MPI_Gather при использовании функции MPI_Gatherv разрешается принимать от каждого процесса переменное число элементов данных, поэтому в функции MPI_Gatherv аргумент recvcountsявляется массивом. Если Вы выполняете операцию вне ветки какого-либо процесса, значение sendcount будет одно для всех процессов в группе. Для того, чтобы процессы могли выполнить операцию с различным sendcountфункцию надо вызывать в каждой ветке, определяющей код процесса, правильно определяя значения элементов массива recvcountsна корневом процессе.

Выполнение MPI_Gatherv будет давать такой же результат, как если бы каждый процесс, включая корневой, посылал корневому процессу сообщение: MPI_Send(sendbuf, sendcount, sendtype, root, …),а принимающий процесс выполнил nопераций приема: MPI_Recv(recvbuf+displs[i]*extern(recvtype), recvcounts[i], recvtype, i, …).

Сообщения помещаются в буфер принимающего процесса в порядке возрастания номеров процессов, от которых они приходят, то есть данные, посланные процессом i, помещаются в i-ю часть принимающего буфера recvbufна корневом процессе. i-я часть recvbufначинается со смещения displs[i].

В принимающем процессе используются все аргументы функцииMPI_Gatherv, а на всех других процессах используются только аргументы sendbuf, sendcount, sendtype, root, comm. Переменные commи rootдолжны иметь одинаковые значения во всех процессах.

Рассылка данных

MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm);

IN sendbufадрес буфера рассылки (исп-ся только корневым проц.)

IN sendcountкол-во эл-ов, посылаемых каждому процессу (исп-ся корневым проц.)

IN sendtypeтип данных элементов в буфере посылки (исп-ся корневым проц.)

OUT recvbufадрес буфера процесса-получателя

IN recvcountколичество элементов в буфере корневого процесса (целое)

IN recvtypeтип данных элементов приемного буфера

IN rootномер процесса-получателя (целое)

IN commкоммуникатор (дескриптор)

 

MPI_Scatter – обратная функция по отношению к MPI_Gather. Результат ее выполнения таков, как если бы корневой процесс выполнил nопераций посылки: MPI_Send(senbuf + i * extent(sendtype), sendcount, sendtype, i, …),и каждый процесс выполнит прием: MPI_Recv(recvbuf, recvcount, recvtype, i, …).

Значения sendcount[i], sendtypeна главном процессе, должны быть теми же, что и recvcount, recvtypeна процессе i. Количество посланных и полученных данных должно совпадать для всех процессов. Процесс, который выполняет рассылку использует все аргументы функции, принимающие процессы используют только аргументы recvbuf, recvcount, recvtype, root, comm. Аргументы rootи commдолжны быть одинаковыми во всех процессах.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.