Как отправить вложенную структуру, используя MPI_Datatype в MPI, используя C - PullRequest
1 голос
/ 11 мая 2011

Я пытаюсь использовать 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 Ответ

3 голосов
/ 23 июня 2011

Я не уверен, что ваши структуры будут работать так, как вы собираетесь здесь, но я могу поделиться своим опытом с отправкой структур с помощью 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>);

Надеюсь, это поможет!

...