使用 MPI 集体通信发送 Struct
Posted
技术标签:
【中文标题】使用 MPI 集体通信发送 Struct【英文标题】:Sending a Struct using MPI collective communications 【发布时间】:2016-03-02 10:46:50 【问题描述】:我正在 C 上处理 MPI。我有这个自定义结构,我想使用 MPI 集体通信(Gather、Scatter、Broadcast)序列化并发送到其他节点
结构如下
typedef struct
double x[2]; /* Old and new X-axis coordinates */
double y[2]; /* Old and new Y-axis coordinates */
double xf; /* force along X-axis */
double yf; /* force along Y-axis */
double xv; /* velocity along X-axis */
double yv; /* velocity along Y-axis */
double mass; /* Mass of the body */
double radius; /* width (derived from mass) */
bodyType;
我试图了解 MPI 上自定义结构的序列化,但无法真正了解该过程。如果有人可以在这里帮助我,那就太好了
谢谢
【问题讨论】:
MPI_Type_struct
是你的朋友!
@simpel01, MPI_Type_struct
在 MPI-2 中已弃用,在 MPI-3 中不再存在。应该改用MPI_Type_create_struct
。
关于如何实际使用它们的任何帮助?
看看这个answer
感谢@PoojaNilangekar 该链接能够帮助我找到解决方案:)
【参考方案1】:
你的结构只有十个连续的双精度数。因此,您不需要通知 MPI 您的类型,因为它可以被视为一个数组。如果您有一个包含七个结构的数组,只需告诉 MPI 您有一个包含 70 个双精度数的数组。您应该告诉编译器“打包”您的结构(例如,GCC 或 Clang 中的 __attribute__((__packed__))
),使其没有填充。
【讨论】:
您不必这样做,打包结构可能会对其他地方的性能产生负面影响。在所有双打的情况下这可能无关紧要,但总的来说这是个坏建议。 MPI 是关于使用它的程序的可移植性。我第二个杰夫。 @Jeff:包装仅包含双精度的结构不会对性能产生负面影响。这应该很明显,因为一个充满双精度的结构在布局方面与双精度数组相同。包装的东西是腰带和吊带,实际上在大多数系统上都不需要,如果你仍然觉得它有点疼的话。您可以不进行打包并添加一个编译时断言,即两个结构的数组的大小与 20 个双精度数的大小相同。【参考方案2】:好的,所以我能够浏览文档并写了这个
const int nitems=8;
int blocklengths[8] = 2,2,1,1,1,1,1,1;
MPI_Datatype types[8] = MPI_DOUBLE,MPI_DOUBLE,MPI_DOUBLE,MPI_DOUBLE,MPI_DOUBLE,MPI_DOUBLE,MPI_DOUBLE,MPI_DOUBLE;
MPI_Datatype mpi_body_type;
MPI_Aint offsets[8];
offsets[0] = offsetof(bodyType, x);
offsets[1] = offsetof(bodyType, y);
offsets[2] = offsetof(bodyType, xf);
offsets[3] = offsetof(bodyType, yf);
offsets[4] = offsetof(bodyType, xv);
offsets[5] = offsetof(bodyType, yv);
offsets[6] = offsetof(bodyType, mass);
offsets[7] = offsetof(bodyType, radius);
MPI_Type_create_struct(nitems, blocklengths, offsets, types, &mpi_body_type);
MPI_Type_commit(&mpi_body_type);
【讨论】:
以上是关于使用 MPI 集体通信发送 Struct的主要内容,如果未能解决你的问题,请参考以下文章
带有 MPI_Type_struct 的 MPI_Scatterv 子矩阵
使用 MPI_Type_create_struct() 在 C 中传输包含动态数组的结构