我需要使用
MPI_Alltoallv
,但我的 sendcounts (第二个参数)是一个长整数数组。然而,MPI_Alltoallv
要求它是一个整数数组。我不确定这是否是一个限制。有什么办法可以解决这个问题吗?
通常,如果您的数据太大以至于不适合整数大小,则使用普通 MPI 库发送它可能不安全。有一些非标准的工作可以使其成为可能,但如果您想坚持使用官方支持的方法,有几种方法可以安全地处理它。
INT_MAX
,那么您就可以完全避免这个问题。您只需发送更多消息即可。我喜欢韦斯的回答,因为它的完整性。 如果您想要一个程序如何处理大量计数的具体示例,请参阅我在 ROMIO 中的做法:
http://git.mpich.org/mpich.git/blob/HEAD:/src/mpi/romio/adio/common/utils.c
还值得指出的是,如果您要发送多个 GB 的数据,MPI_ALLTOALLV 不会比一堆 MPI_Isends 和 MPI_Irecv 调用更有效。
除了其他人的出色答案之外,您可以做的另一件事是使用 MPI_Neighbor_alltoallv,它具有 MPI_Aint 位移。我已经在 BigMPI 中使用了这个技巧,您可以轻松地重用我的 comm-to-(dist-graph-comm) 实用程序函数。
请注意,不保证 long 和 MPI_Aint 等效。目前我的机器上的 MPICH 3.2 确实如此,但在编写可移植代码时您不能依赖它。如果您使用邻域 v 集体,请复制您的位移向量或将其更改为 MPI_Aint。
今天这个问题的正确答案当然是使用 MPI_Alltoallv_c,它是 MPI-4 中引入的“大计数”例程之一。
我为无法使用 MPI-4 的人保留上面的原始答案