Как отправить вложенную структуру, используя MPI_Datatype в MPI, используя C
Я пытаюсь использовать MPI_Datatype для отправки приведенной ниже структуры, но MPI_Send падает при отправке структуры. Мне интересно, как справиться с этой ситуацией. Вот код, который я написал, чтобы определить новый тип данных MPI:
typedef struct
{
double x;
double y;
} vertex;
typedef struct
{
int num_vertices;
vertex vertex[2];
} vertex_list;
MPI_Datatype vertexType;
MPI_Type_contiguous(2,MPI_DOUBLE,&vertexType);
MPI_Type_commit(&vertexType);
MPI_Datatype vertexListType;
MPI_Datatype typev[3] = {MPI_INT, vertexType, MPI_UB};
int blocklenv[3] = {1, 2, 1};
MPI_Aint dispv[3];
/* compute displacements of structure components */
MPI_Address( vertexl, dispv);
MPI_Address( vertexl[0].vertex, dispv+1);
MPI_Address( vertexl+1, dispv+2);
base = dispv[0];
for (i=0; i <3; i++)
dispv[i] -= base;
/* build datatype describing structure */
MPI_Type_struct( 3, blocklenv, dispv, typev, &vertexListType);
MPI_Type_commit(&vertexListType);
https://docs.google.com/document/d/1OQFtx0ClkKQx7X91BlVgiizs5D9jShhtgsKafrgC7hk/edit?hl=en
1 ответ
Я не уверен, что ваши структуры будут работать так, как вы собираетесь здесь, но я могу поделиться своим опытом отправки структур с MPI_Send.
Вместо создания явного типа данных MPI можно просто отправить саму структуру, так как все ее содержимое находится в непрерывном фрагменте памяти. Хитрость заключается в предоставлении правильного размера и типа данных для операции MPI_Send.
Используя ваши структуры, вот что я делал в прошлом (предполагая переменную vertex_list list
уже определено):
MPI_Send(&list, sizeof(vertex_list), MPI_BYTE, <rankToSendTo>, <tagInteger>, <comm>);
Таким образом, буфер данных для отправки является указателем на структуру списка, размер буфера - это размер vertex_list в байтах, а тип данных MPI - просто байты.
На приемном конце вам просто нужно указать ссылку vertex_list в качестве приемного буфера:
vertex_list receiveList;
MPI_Recv(&receiveList, sizeof(vertex_list), MPI_BYTE, <rankOfSender>, <tagInteger>, <comm>, <status>);
Надеюсь, это поможет!