首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不总是使用MPI_BYTE呢?

为什么不总是使用MPI_BYTE呢?
EN

Stack Overflow用户
提问于 2013-01-28 06:47:56
回答 3查看 865关注 0票数 0

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

为什么不使用MPI_BYTE进行所有的通信?

特别是对于集体和处理组合数据类型时,这将使生活变得容易得多。

编辑:,我刚刚找到了MPI and C structs。答案适用于我的问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-28 13:28:23

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

代码语言:javascript
复制
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_BYTE而不使用其他类型的构造函数有什么更简单的、没有类型的方法呢?

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

如果您在MPI_Type_create_struct上遇到了麻烦,那么您已经来到了正确的地方(或其中的一个)。如果你是来找一个同意你的观点的人的话,那就是,学习新东西太难了,也不值得,你可能是在错误的地方。

编辑添加:。我同意,对于C和Fortran中的序列化(不仅仅是MPI )来说,结构化是一种痛苦,我将其归咎于它们不可原谅的缺乏任何一种甚至是最基本的内省。要描述它们,你必须重申它们的类型和数量,这违反了枯燥原则。到处都是乱七八糟的东西,而且可能有不止一个代码使用了MPI_BYTEs (Struct)来描述它们。但这里有一个具体的例子,说明这将在哪里失败。

现在您已经正确地发送和接收了这些信息,您决定使用MPI(或者是HDF5或NetCDF或.)将它们保存到一个文件中。当然,使用与通信方法相同的方法将它们描述为(Struct)字节。

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

但是现在,当您不可避免地使用相同的代码加载该文件,但使用不同的编译器编译,甚至使用相同的编译器,但使用不同的标志时,所有的赌注都结束了。数据布局可能是不同的,从而导致垃圾值--或者填充量可能不同,从而导致您在文件结束后读取。

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

票数 1
EN

Stack Overflow用户

发布于 2013-01-28 10:43:49

好吧,我对我尖刻的评论的回答是:

..。同样的原因,我们没有在所有计算中使用字节。在处理现代计算机程序中遇到的复杂类型时,数据类型是一个巨大的帮助。为了支持这种说法,我引用了他们在汇编语言级别之上的所有编程语言中的存在,但是即使在这个级别上也有数据类型的痕迹。

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

我不同意您的结论,即只处理字节将使(MPI)编程更容易,这将使我的编程更加困难。如果我想从一个进程发送一个包含24个整数的消息到另一个进程,我想发送一个24类型的整数和24类型的消息,我不想把它转换成很多字节。

票数 1
EN

Stack Overflow用户

发布于 2022-10-28 13:25:04

像OpenFOAM这样的代码遵循这种错误的做法:“对MPI的所有调用都封装在所谓的Pstream库中,从发送方传递给接收方的对象被序列化成一个连续的数据块,去掉它的类型信息(接收方知道预期的数据类型)。因此,所有数据都可以以MPI字节的形式传递,从而降低了低级别通信方法的复杂性。”

除了MPI_BYTE讨论的可移植性问题之外,所有语言都引入数据类型构造的原因是性能:“利用已知的数据对齐非常重要;它允许使用更广泛的加载和存储指令。动态检测对齐也是可能的,但将此测试从循环中提升是另一个重要的优化。”https://www.google.com/ https://wgropp.cs.illinois.edu/bib/papers/pdata/1999/mpidc99.ps

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14556826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档