2013-08-25 2 views
2

Я пытаюсь определить, какие параметры операции отправки и операции приема должны совпадать для передаваемого сообщения.Нужно ли MPI Datatypes отправлять/получать?

Я понимаю, что операция приема должна соответствовать (или включать) источник сообщения, тега и коммуникатора. Однако требуется ли сопоставление типа данных?

E.g. я мог соответствовать посылу от ранга 0:

MPI_Send (send_buffer, 1, MPI_INT, 1, 0, MPI_COMM_WORLD); 

с операцией приема на 1-го ранга:

MPI_Recv (recv_buffer, 4, MPI_BYTE, 0, 0, MPI_COMM_WORLD, status); 

В частности, как отправка «количество» меньше, чем получающий кол, которым я знаком является действителен для MPI.

Спасибо.

ответ

5

Короткий ответ: да, типы данных должны совпадать, но есть некоторые оговорки.

При использовании примитивных типов данных MPI, таких как MPI_INT и MPI_FLOAT, типы должны быть идентичными. Единственным исключением является MPI_PACKED, который может соответствовать любому другому типу.

При использовании производных типов данных (определенных пользователем типов данных a.k.a.) все становится немного сложнее. Общий тип данных MPI состоит из двух вещей: типа, который определяет базовые языковые типы данных, которые составляют производный тип данных, и ряд байтов смещений, которые определяют, где эти базовые элементы находятся в памяти. Комбинация обеих последовательностей называется формой типа типа. Примитивные типы данных MPI являются частными случаями таких общих типов данных, имеющих один базовый тип данных в сигнатуре типа с смещением 0, например. MPI_INT имеет следующую карту: { (int, 0) }. Для операции отправки и получения, чтобы соответствовать, подпись типа должна быть одинаковой с обеих сторон, но смещения могут различаться. Например. отправитель может отправить один объект MPI_Type_contiguous, состоящий из 3 MPI_FLOAT s, но приемник может принимать это как MPI_Type_indexed тип 3 MPI_FLOAT s с произвольными смещениями. Отправитель также может предоставить массив из 3 MPI_FLOAT элементов, например. MPI_Send(buf, 3, MPI_FLOAT, ...), и это все равно приведет к сигнатуре того же типа.

Следует подчеркнуть, что подпись типа состоит только из базовых типов данных. Независимо от того, был ли пользовательский тип данных создан непосредственно из примитивных типов MPI или других определяемых пользователем типов данных (или их смесей), не имеет значения.

Пример: отправитель определяет MPI_Type_struct, состоящий из 3 MPI_INT s и 2 MPI_FLOAT s. Приемник определяет MPI_Type_contiguous состоящий из 3-х MPI_INT (назовем этот тип A), другой с (типа B), а затем MPI_Type_struct, состоящий из 1 A и 1 B. Эти два типа данных будут соответствовать, так как в конечном счете они оба равны 3 int с, а затем 2 float с.