MPI_(I)NEIGHBOR_ALLTOALLW() 中的 MPI_Aint 与 MPI_(I)ALLTOALLW() 中的 int

标签 mpi

通过MPI3.0引入邻里集体通信。 其中 2 个(MPI_NEIGHBOR_ALLTOALLWMPI_INEIGHBOR_ALLTOALLW)位移(sdisplsrdispls)是 数组常量 MPI_Aint。相反,相同但集体的函数(MPI_ALLTOALLWMPI_ALLTOALLW)是如何定义的 -const int 数组。

同时考虑 MPI 标准 v3.0 关于 MPI_Aint 的规定(第 16 页):

2.5.6 Addresses

Some MPI procedures use address arguments that represent an absolute address in the calling program. The datatype of such an argument is MPI_Aint in C and INTEGER (KIND=MPI_ADDRESS_KIND) in Fortran. These types must have the same width and encode address values in the same manner such that address values in one language may be passed directly to another language without conversion. There is the MPI constant MPI_BOTTOM to indicate the start of the address range.

我仍然不明白这一点,如果存在的话,intMPI_Aint之间的区别(此外MPI_Aint不能为负) !

最佳答案

MPI_Aint 是一种可移植的 C 数据类型,可以保存内存地址,并且它可能比通常的 int 更大。 MPI 论坛的政策是不更改现有 MPI 调用的签名(因为它可能会破坏现有应用程序 - 请参阅 here)。相反,引入了新的调用来取代旧的调用。其基本原理是,int 在 LP64 64 位架构流行之前就运行良好,此时 int 无法再用于寻址单个进程的整个虚拟地址空间。实现这一点后,一些 MPI 调用在更高版本中获得了使用 MPI_AintMPI_Count(大整数类型)而不是 int 的新版本。例如,MPI_Get_count_x 取代 MPI_Get_count 并使用 MPI_Count 而不是 int

在这方面,MPI_Alltoallw 是一个旧调用(它来自 MPI-2.0),它保留了使用 int 偏移量的签名,而 MPI_(I) Neighbor_alltoallw 是一种新类型(随 MPI-3.0 一起提供),它使用地址类型以便能够处理(几乎)位于内存中任何位置的数据。

这同样适用于 Fortran 绑定(bind)。

关于MPI_(I)NEIGHBOR_ALLTOALLW() 中的 MPI_Aint 与 MPI_(I)ALLTOALLW() 中的 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18358201/

相关文章:

CMake : Selecting mpich over openmpi

c++ - MPI 中矩阵列的 scatterv 和 sendreceive

c - 使用 GDB 进行 MPI 调试 - 当前上下文中没有符号 "i"

mpi - MPI 进程是如何启动的?

c - MPI分配奇数个处理器核时如何分配数据?

linux - 在 Linux 中使用 mpirun 时出现错误 “ssh: Name or service not known”

c - MPI 收集和排序

c - MPI 集体操作和进程生命周期 (C/C++)

c - 编译 p3dfft 驱动程序时未解析的 MPI Fortran 符号

python - 如何找到 MPI(4PY) 可用的内核数?