gpt4 book ai didi

c - 如何使用 C 在 MPI 中使用 MPI_Datatype 发送嵌套结构

转载 作者:太空宇宙 更新时间:2023-11-04 02:17:08 25 4
gpt4 key购买 nike

我正在尝试使用 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

最佳答案

我不确定您的结构是否会按照您在这里的预期方式工作,但我可以分享我使用 MPI_Send 发送结构的经验。

与其创建显式 MPI 数据类型,还不如简单地发送结构本身,因为它的所有内容都在一 block 连续的内存中。诀窍是为 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>);

希望对您有所帮助!

关于c - 如何使用 C 在 MPI 中使用 MPI_Datatype 发送嵌套结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5969864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com