使用 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 中传输包含动态数组的结构

MPI - 在使用 MPI_Probe() 时发送我自己的结构

无法理解 MPI_Type_create_struct

无法理解 MPI_Type_create_struct

pybind11:将 MPI 通信器从 Python 发送到 CPP