Передача значения из одного запущенного приложения в другое

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

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

0
задан mayank singh 13 July 2018 в 04:44
поделиться