5

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

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

4

2 回答 2

8

MPI_BYTE是发送无类型数据时使用的数据类型,而不是MPI_CHAR. 如果两台机器具有相同的架构但使用不同的字符编码,则使用MPI_CHAR可能会损坏您的数据。按原样发送数据MPI_BYTE将使二进制表示保持原样,并且不执行任何表示转换。

也就是说,是的,从技术上讲,以这种方式发送结构是正确的,如果(且仅当)您可以保证发送端和接收端的数据表示形式相同。然而,这是一种糟糕的编程实践,因为它混淆了代码的用途,并引入了平台依赖性。

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

于 2010-05-04T12:45:38.843 回答
3

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

我想我想说的是,如果值得定义一个结构(你显然认为是这样),那么就值得定义一个结构。保存几行(接近)样板代码并不是反对这一点的理由。

于 2010-05-02T16:39:38.147 回答