MPI_不在MPI_(I)邻居_ALLTOALLW()中,而在MPI_(I)ALLTOALLW()中为int

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

在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 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”书籍。