Какова цель передачи MPI_Gather recvtype, не равного sendtype? - PullRequest
0 голосов
/ 28 апреля 2018

Рассмотрим документы MPICH для функции MPI_Gather, приведенной ниже. Он принимает аргументы sendtype и recvtype.
Когда имеет смысл не передавать один и тот же тип, например MPI_FLOAT или MPI_DOUBLE, для обоих?

Я спрашиваю, потому что кажется бесполезным передавать один и тот же аргумент дважды, поэтому у MPI, вероятно, есть причина для принятия и получения, и отправки.

MPI_Gather
Собирает значения из группы процессов

Конспект

int MPI_Gather(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
               void *recvbuf, int recvcount, MPI_Datatype recvtype,
               int root, MPI_Comm comm)

Входные параметры

sendbuf
    starting address of send buffer (choice)
sendcount
    number of elements in send buffer (integer)
sendtype
    data type of send buffer elements (handle)
recvcount
    number of elements for any single receive (integer, significant only at root)
recvtype
    data type of recv buffer elements (significant only at root) (handle)
root
    rank of receiving process (integer)
comm
    communicator (handle)

Выходные параметры

recvbuf
     address of receive buffer (choice, significant only at root)

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Для полноты картины я также цитирую ответ Жиля.

MPI требует только соответствующие подписи.

Например, вы можете отправить 10 MPI_INT и получить 1 производный тип данных который является вектором 10 MPI_INT.

Ответ Жиля Гуаиллардета содержит очень полезное замечание о «производном типе данных», которое привело меня к этому объяснению Виктора Эйххоута из Техасского передового вычислительного центра .

Тип вектора описывает серию блоков одинакового размера с интервалом с постоянным шагом. [...] Векторный тип данных дает первое нетривиальная иллюстрация того, что типы данных у отправителя могут быть разными и получатель. Если отправитель отправляет b блоков длиной l каждый, приемник может получать их как непрерывные элементы, либо как непрерывный тип данных или как непрерывный буфер элементарного типа; см рисунок В этом случае получатель не знает о шаг типа данных на отправителя. Figure

[...] В этом примере векторный тип создается только в отправителе, в порядок отправки выделенного подмножества массива; получатель получает данные как непрерывный блок.

В качестве примера этого типа данных рассмотрим пример транспонирования матрица, например, для преобразования между массивами C и Fortran [...] Предположим, что процессор имеет матрицу, хранящуюся в C, мажор строки, макет, и он должен отправить столбец на другой процессор. Если матрица объявлен как int M,N; double mat[M][N], тогда столбец имеет M блоков одного элемента, разнесенных на N мест. Другими словами:

MPI_Datatype MPI_column;
MPI_Type_vector( 
    /* count= */ M, /* blocklength= */ 1, /* stride= */ N,
    MPI_DOUBLE, &MPI_column );

Простая отправка первого столбца:

MPI_Send( mat, 1,MPI_column, ... );

Второй столбец немного сложнее: теперь вам нужно выбрать элементы с одинаковым шагом, но начинающиеся с A 0 .

MPI_Send( &(mat[0][1]), 1,MPI_column, ... );

Вы можете сделать это немного более эффективным (и труднее читать) заменив индексное выражение на mat + 1.

0 голосов
/ 28 апреля 2018

MPI требует только соответствующие подписи.

Например, вы можете отправить 10 MPI_INT и получить 1 производный тип данных, который является вектором 10 MPI_INT.

...