#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. Редактировать: Возможно, дополнительная информация о том, что вы пытаетесь сделать с этими вершинами на принимающей стороне, может вызвать некоторые идеи.