Parallel processing 为什么不总是使用MPI_字节?

Parallel processing 为什么不总是使用MPI_字节?,parallel-processing,multiprocessing,mpi,Parallel Processing,Multiprocessing,Mpi,如果我不必关心异构系统上的可移植性(endianity…): 为什么不在所有通信中使用MPI_字节 特别是对于集体和处理组合数据类型时,这将使生活更加轻松 编辑:我刚找到。这些答案适用于我的问题。好的,请回答我的尖刻评论: 。。。出于同样的原因,我们不使用字节进行所有计算。当处理现代计算机程序中遇到的那种复杂性时,数据类型是一个巨大的帮助。为了支持这一断言,我引用了它们在汇编语言级别以上的所有编程语言中的存在,但即使在该级别上,也有数据类型的痕迹 在MPI最常用的领域中,主要语言是FORTRAN

如果我不必关心异构系统上的可移植性(endianity…):

为什么不在所有通信中使用MPI_字节

特别是对于集体和处理组合数据类型时,这将使生活更加轻松


编辑:我刚找到。这些答案适用于我的问题。

好的,请回答我的尖刻评论:

。。。出于同样的原因,我们不使用字节进行所有计算。当处理现代计算机程序中遇到的那种复杂性时,数据类型是一个巨大的帮助。为了支持这一断言,我引用了它们在汇编语言级别以上的所有编程语言中的存在,但即使在该级别上,也有数据类型的痕迹

在MPI最常用的领域中,主要语言是FORTRAN、C和C++,它们具有与MPI中定义的数据类型紧密对应的数据类型。当然,因果链在另一个方向起作用,MPI有这些类型,因为这些语言有。所有这些语言都允许程序员定义由更基本的数据类型组成的进一步的数据类型,这同样有助于处理在计算机上解决难题的复杂性;MPI也支持创建派生类型


我不同意你的结论,仅仅处理字节会使(MPI)编程更容易,这会使我的编程更难。如果我想从一个进程向另一个进程发送一条包含24个整数的消息,我想发送一条integer类型和长度为24的消息,我不想费劲地将其转换为若干字节。

以下是如何使用类型发送三维NXN数组的切片:

double array[N][N][N];

 /* ... */

MPI_Datatype xslice, yslice, zslice;

int starts[3]   = {0,N-2,0};
int sizes[3]    = {N,N,N};
int subsizes[3] = {N,2,N};

MPI_Type_create_subarray(3, sizes, subsizes, starts, MPI_ORDER_C, MPI_DOUBLE, &yslice);
MPI_Type_commit(&yslice);

/* ... */

MPI_Send(&(array[0][0][0]), 1, yslice, neigh, ytag, MPI_COMM_WORLD);
只使用
MPI\u字节
而不使用其他类型构造函数,哪种更简单、键入更少的方法可以做到这一点

所有的高性能计算最终都归结为对内存和数据布局的理解,而使用更高级别的抽象有助于这一点

如果您在使用
MPI\u Type\u create\u struct
时遇到问题,那么您找到了正确的位置(或其中一个)。如果你发现有人同意你的观点,是的,学习新东西太难而且不值得,那么你可能找错地方了

编辑以添加:。我同意,在C和Fortran中,结构是串行化的一个难题,而不仅仅是MPI,我将此归咎于它们不可原谅地缺乏任何形式的甚至是基本的自省。要描述它们,你必须重复它们的类型和计数,这违反了干燥原则。到处都是乱七八糟的,可能有不止一个代码只是使用sizeof(struct foo)MPI_字节来描述它们。但这里有一个具体的例子说明了这一点会失败

既然您正确地发送和接收了这些数据,您就决定使用MPI-IO(或者HDF5或NetCDF或…)将它们保存到一个文件中。当然,您可以使用与通信它们相同的方法来描述它们,即sizeof(struct foo)字节

然而,C几乎没有告诉你这些结构是如何布置的;编译器可以对布局执行各种操作,特别是插入填充。如果所有任务都在同一种机器上运行使用相同编译器和标志编译的相同代码,那么这通常不会成为通信问题

但现在,当您不可避免地使用相同的代码加载该文件,但使用不同的编译器进行编译,或者甚至使用相同的编译器但使用不同的标志时,所有的赌注都没有了。数据布局可能不同,导致垃圾值,或者填充量可能不同,导致读取超过文件末尾


您可以通过对文件I/O和通信的数据进行不同的描述来解决这个问题,但现在很难说这会使事情变得更简单。最好从正确描述数据开始。

Ahhh是的,我发现所有的整数和浮点数,所有的布尔值和字符都非常麻烦。请注意,我对任何想使用字节的人都有点怀疑,比特有什么问题吗?@HighPerformanceMark:所以。。。字节有什么问题吗?感谢您的详细说明;)。问题是,MPI_字节让我更容易,因为我无法让MPI_类型的结构如此有效。。。我的错,我知道,但它只是用MPI_字节开箱即用。所以我问自己(然后是每个人)出于某种原因这是否是一个愚蠢的想法。而且。。。实际上,它没有太多的麻烦,只是在sendcount和recvcount参数中添加了一个
*sizeof(TYPE)
。啊,因此,您未能使
MPI_TYPE_结构
正常工作,因此得出结论认为
MPI_字节
是用于一切的正确数据类型。从这个特定前提中得出的结论很奇怪。难道你没有想到要寻求帮助来解决你的问题吗!再说一遍:MPI_字节有什么问题?我明白为什么编程语言有类型,我明白为什么MPI有类型。我的问题是,除了美学的论述之外,使用MPI_字节还有什么不对的吗。我没有发现性能问题,endianity在大多数情况下都不是问题,包括我的,而且当使用复杂的数据类型时,它不太容易键入。这是一个MPI_字节不是解决方法的好例子。谢谢当然是切片。在我的例子中,我有一个1-D结构数组,包含int和double。这对MPI_字节很好,到目前为止我还没有发现任何缺点。我要说的是:我远非不想学习新东西我(也)同意这个编辑。我们可以避免或很好地定义填充行为,但正如您所指出的,“它更容易”的论点不再成立。无论如何,我显然会(在使用工作的MPI_BYTE-version;)运行可伸缩性测试时)提出一个关于在MPI中正确处理结构数组的问题。