Как отправить структуру как массив через MPI? - PullRequest
0 голосов
/ 30 мая 2018

У меня есть эта структура

typedef struct {float x, y, z, vx, vy, vz;} Body;

float *buf, *bufSlave;
Body *p;
bytes = nBodies*sizeof(Body);
buf = (float*)malloc(bytes);
p = (Body*)buf;

Как отправить 15 элементов с помощью MPI_SEND и как получить с помощью MPI_RECEIVE?

MPI_Send(&p[(i - 1) * lung], 6, MPI_FLOAT, i, 99, MPI_COMM_WORLD); 

У меня ошибка сегментации.

1 Ответ

0 голосов
/ 02 июня 2018

Во-первых, обратите внимание, что подход действителен для однородных кластеров с идентичными архитектурами.

Для общего случая и высокой стабильности выберите безопасный транспортный протокол, такой как JSON или протокольные буферы.

В-третьих, boost :: serialization в stringstream может оказаться полезным.Аналогичные ограничения, но библиотеки не нужны.

В любом случае, теперь ответ: при отправке структур, как вы хотите, делайте это с типом данных MPI_CHAR и считайте N * sizeof (Struct)

Для получениялибо вы уже знаете N, либо используете MPI_Probe и извлекаете счетчик из сообщения.Это будет количество байтов.Выделите в нем буфер такого размера, MPI_RECV, и переинтерпретируйте его как массив Buffer посредством приведения.

Обоснование - использовать MPI_CHAR, так как структура может иметь заполнение.

...