我不得不承认,看到用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);
就我而言,所有进程都在同一架构上运行。填充是唯一的问题吗?
答案 0 :(得分:8)
MPI_BYTE
是发送无类型数据时使用的数据类型,而不是MPI_CHAR
。如果两台计算机具有相同的体系结构但使用不同的字符编码,则使用MPI_CHAR
可能会损坏您的数据。将数据作为MPI_BYTE
发送将保留二进制表示,并且不执行任何表示转换。
那说,是的,从技术上讲,以这种方式发送结构是正确的,如果(并且只有)你可以保证数据表示在发送和接收端是相同的。但是,编程实践很糟糕,因为它模糊了代码的目的,并引入了平台依赖性。
请记住,您只需要定义和提交一次数据类型,而您通常需要编写代码以多次发送它。为了在单一定义上节省几行,降低所有发送的清晰度并不是一种交易。
答案 1 :(得分:3)
就个人而言,我更关心可理解性和可维护性,甚至是可移植性,而不是填充。如果我发送的结构我喜欢我的代码,以表明我发送的是一个结构,而不是一个字节或字符序列。而且我希望我的代码能够在多代架构上运行,涵盖多代语言标准和编译器。
我想我所说的只是,如果值得定义一个结构(你显然认为它是),那么值得定义一个结构。保存几行(近似)样板并不是反对的理由。