MPI和C结构

我不得不承认,看到用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); 

在我的例子中,所有进程都在相同的架构上运行。 填充是唯一的问题吗?

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

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

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

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

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