MPI和C结构

时间:2010-05-02 16:24:39

标签: c struct mpi

我不得不承认,看到用MPI传输一个C结构需要多少行代码,我感到非常震惊。

在什么情况下使用预定义的数据类型MPI_CHAR简单地传输结构会起作用?请考虑以下示例:

struct particle {
   double x;
   double y;
   long   i;
};

struct particle p;
MPI_Isend(&p, sizeof(particle), MPI_CHAR, tag, MPI_COMM_WORLD, &sendr);

就我而言,所有进程都在同一架构上运行。填充是唯一的问题吗?

2 个答案:

答案 0 :(得分:8)

MPI_BYTE是发送无类型数据时使用的数据类型,而不是MPI_CHAR。如果两台计算机具有相同的体系结构但使用不同的字符编码,则使用MPI_CHAR可能会损坏您的数据。将数据作为MPI_BYTE发送将保留二进制表示,并且不执行任何表示转换。

那说,是的,从技术上讲,以这种方式发送结构是正确的,如果(并且只有)你可以保证数据表示在发送和接收端是相同的。但是,编程实践很糟糕,因为它模糊了代码的目的,并引入了平台依赖性。

请记住,您只需要定义和提交一次数据类型,而您通常需要编写代码以多次发送它。为了在单一定义上节省几行,降低所有发送的清晰度并不是一种交易。

答案 1 :(得分:3)

就个人而言,我更关心可理解性和可维护性,甚至是可移植性,而不是填充。如果我发送的结构我喜欢我的代码,以表明我发送的是一个结构,而不是一个字节或字符序列。而且我希望我的代码能够在多代架构上运行,涵盖多代语言标准和编译器。

我想我所说的只是,如果值得定义一个结构(你显然认为它是),那么值得定义一个结构。保存几行(近似)样板并不是反对的理由。