MPI_不在MPI_(I)邻居_ALLTOALLW()中,而在MPI_(I)ALLTOALLW()中为int
在MPI3.0中引入了邻里集体通信。 其中两个(MPI_不在MPI_(I)邻居_ALLTOALLW()中,而在MPI_(I)ALLTOALLW()中为int,mpi,Mpi,在MPI3.0中引入了邻里集体通信。 其中两个(MPI\u-ALLTOALLW和MPI-inighbor\u-ALLTOALLW)中的位移(sdispls和rdispls)是常量MPI\u-Aint的数组。相反,如何定义相同但集合的函数(MPI\u ALLTOALLW和MPI\u ALLTOALLW)是const int的数组 还考虑到MPI标准v3.0对MPI维护的说明(第16页): 2.5.6地址 某些MPI过程使用的地址参数表示 呼叫程序。此类参数的数据类型为C和C中的MPI_Aint F
MPI\u-ALLTOALLW
和MPI-inighbor\u-ALLTOALLW
)中的位移(sdispls
和rdispls
)是常量MPI\u-Aint的数组。相反,如何定义相同但集合的函数(MPI\u ALLTOALLW
和MPI\u ALLTOALLW
)是const int的数组
还考虑到MPI标准v3.0对MPI维护的说明(第16页):
2.5.6地址
某些MPI过程使用的地址参数表示
呼叫程序。此类参数的数据类型为C和C中的MPI_Aint
Fortran中的整数(种类=MPI\U地址\U种类)。这些类型必须具有相同的宽度
以及以相同的方式对地址值进行编码,使得地址值使用一种语言
可以直接传递到另一种语言而无需转换。有一个MPI常量
MPI_底部指示地址范围的开始
我仍然不明白这一点,如果存在的话,int
和MPI_-Aint
之间的差异(另外,MPI_-Aint
不能为负) MPI_Aint
是一种可移植的C数据类型,可以保存内存地址,并且可以比通常的int
大。MPI论坛的策略是不更改现有MPI调用的签名(因为它可能会破坏现有应用程序-请参阅)。新的呼叫取代了旧的呼叫。基本原理是在LP64 64位体系结构流行之前,int
工作得很好,此时int
不能再用于处理单个进程的整个虚拟地址空间。在此实现之后,一些MPI调用在更高版本中获得了新版本,这些版本使用MPI_Aint
或MPI_Count
(大整数类型)而不是int
。例如,MPI\u Get\u count\u x
取代MPI\u Get\u count
,并使用MPI\u count
而不是int
在这方面,MPI_Alltoallw
是一个旧调用(它来自MPI-2.0),它保留了使用int
偏移量的签名,而MPI_(I)Neighbor_Alltoallw
是一个新调用(它与MPI-3.0一起提供),它使用地址类型以便能够处理位于(几乎)内存中任何位置的数据
Fortran绑定也是如此。您的答案和sizeof(MPI_Aint)现在是8,这是有意义的,谢谢:)p.s:但是为什么这个解释不在标准中?通常这些事情会在公开的邮件列表和论坛上讨论。MPI标准不是用户指南,即使有时看起来是这样。有关说明,请参阅“使用MPI”书籍。