создание типа данных, производного от mpi, содержащего структуру с указателем

У меня есть структура, которая определена примерно так:

typedef struct NodeItem {
int* data;
int info1;
int info2;
struct NodeItem* next;
} *Node;

Мне нужно отправить эту структуру в другой процесс MPI. Я знаю, что должен использовать MPI_INT для информации1 и информации2 при определении производного типа данных. Однако я изо всех сил пытаюсь определить производный тип данных с помощью своих указателей. "data" указывает на массив целых чисел, и его размер известен только во время выполнения. «Далее» указывает на следующий элемент в моем связанном списке.

Как мне определить производный тип данных, если моя структура содержит указатели? Заранее спасибо, Двир.


person user3154553    schedule 02.01.2014    source источник


Ответы (1)


Процитирую себя из другого похожего вопроса:

НИКОГДА не отправляйте указатели между процессами MPI! Легко думать о char* как о массиве char, но на самом деле это не так. Это просто адрес памяти, который не будет иметь смысла для процесса, которому вы его отправляете, а даже если и имел, вы на самом деле не отправляли данные, на которые он указывал.

Другими словами, вместо отправки указателей вам нужно отправить данные, на которые указывают указатели, а процесс-получатель должен сам заполнить значения своих указателей. В вашем случае я бы разделил отправку на два раунда:

  • В раунде 1 вы отправляете info1 и info2 из каждой структуры (либо в виде массива 2-целочисленных векторов, либо просто в виде массива целых чисел). Принимающий процесс выделяет соответствующий размер NodeItems и в каждом оставляет data неинициализированным. info1 и info2 заполняются из полученных данных, а next определяется локально (как изначально на процессе-отправителе).
  • Во втором раунде вы создаете сообщение из всех данных, на которые указывают ваши data указатели. Принимающий процесс теперь выделяет место для каждого NodeItem и устанавливает указатель data на выделенный адрес.

Для отправки в раунде 2 вы можете определить тип данных MPI_Indexed. Количество блоков — это количество NodeItem объектов, длины — это размеры каждого массива, а смещения можно рассчитать, вызвав MPI_Address() с первым элементом массива (не указателем data!) в качестве входных данных.

person suszterpatt    schedule 02.01.2014