Как отправить вложенную структуру с использованием MPI_Datatype в MPI с использованием C

#c #distributed #mpi #distributed-computing

#c #распределенный #mpi #распределенные вычисления

Вопрос:

Я пытаюсь использовать 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,amp;vertexType);
        MPI_Type_commit(amp;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, amp;vertexListType);
        MPI_Type_commit(amp;vertexListType);
  

https://docs.google.com/document/d/1OQFtx0ClkKQx7X91BlVgiizs5D9jShhtgsKafrgC7hk/edit?hl=en

Комментарии:

1. Вы можете редактировать свой пост, а не добавлять комментарии. Код в самом сообщении может быть красиво отформатирован, и вопрос будет лучше во всем.

2. Я скопировал код для вас (просто жду экспертной оценки). В будущем, как pmg сказано, вы сможете редактировать свой собственный пост, а использование форматирования кода поможет получить более быстрый ответ.

3. Вы также должны показать отправку.

4. спасибо за ваш ответ @Captain @Head. как отправить MPI_Send в случае несмежных данных во вложенной структуре, например, когда vertices является полем указателя: typedef struct{ double x; double y; } vertex; typedef struct {int num_vertices; vertex *вершины; } vertex_list;

Ответ №1:

Я не уверен, что ваши структуры будут работать так, как вы намереваетесь здесь, но я могу поделиться своим опытом отправки структур с помощью MPI_Send.

Вместо создания явного типа данных MPI можно просто отправить саму структуру, поскольку все ее содержимое находится в непрерывной части памяти. Хитрость заключается в предоставлении правильного размера и типа данных для операции MPI_Send.

Используя ваши структуры, вот что я делал в прошлом (предполагая, что переменная vertex_list list уже определена):

 MPI_Send(amp;list, sizeof(vertex_list), MPI_BYTE, <rankToSendTo>, <tagInteger>, <comm>);
  

Таким образом, буфер данных, который нужно отправить, является указателем на структуру списка, размер буфера равен размеру vertex_list в байтах, а тип данных MPI — это просто байты.

На принимающей стороне вам просто нужно указать ссылку на vertex_list в качестве принимающего буфера:

 vertex_list receiveList;
MPI_Recv(amp;receiveList, sizeof(vertex_list), MPI_BYTE, <rankOfSender>, <tagInteger>, <comm>, <status>);
  

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

Комментарии:

1. @Head спасибо за ваш ответ. как отправить MPI_Send в случае несмежных данных во вложенной структуре, например, когда vertices является полем указателя, т.Е. «vertex * вершина» вместо «vertex вершина[2]»

2. Это, безусловно, становится сложнее, потому что (я предполагаю, что в данном случае) у принимающего процесса нет простого способа узнать, сколько вершин в списке *vertex. Редактировать: Возможно, дополнительная информация о том, что вы пытаетесь сделать с этими вершинами на принимающей стороне, может вызвать некоторые идеи.