MPI_alltoallv,sendcounts为长数组(非整数值)

时间:2014-11-02 23:02:10

标签: mpi

我需要使用MPI_Alltoallv,但我的sendcounts(第二个参数)是一个长整数数组。但是,MPI_Alltoallv要求它是一个整数数组。我不确定这是不是一个限制。有什么方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

通常,如果您的数据太大而不适合整数大小,那么使用普通的MPI库发送数据可能不安全。有一些非标准的工作可以实现,但如果你想坚持官方支持的方法,有几种方法可以安全地处理它。

  • 使用MPI数据类型。这些将允许您将数据封装到可以(理论上)任意大的数据类型中。它们使用起来可能有点复杂,但如果你只发送大的,连续的内存区域,那就不难了。
  • 以多个块发送数据。如果您将邮件限制为INT_MAX大小,则可以完全避免此问题。你只需发送更多信息。
  • 使用BigMPI,Jeff Hammond的一个库,它封装了发送大量数据的一些重要性。我不认为他正在调用代码生产就绪,但你可以看看它是否符合你的要求。

答案 1 :(得分:2)

我喜欢Wes的完整答案。如果你想要一个关于程序如何处理大数量的具体例子,这就是我在ROMIO中的表现:

http://git.mpich.org/mpich.git/blob/HEAD:/src/mpi/romio/adio/common/utils.c

值得指出的是,如果你发送的是几千兆字节的数据,MPI_ALLTOALLV不会比一堆MPI_Isends和MPI_Irecv调用更有效。

答案 2 :(得分:0)

除了其他人的优秀答案之外,您可以做的另一件事是使用MPI_Neighbor_alltoallv,它具有MPI_Aint位移。我已经在BigMPI中使用了这个技巧,你可以轻松地重用我的comm-to-(dist-graph-comm)实用程序功能。

请注意,不能保证long和MPI_Aint是等效的。我的机器上的MPICH 3.2现在也是如此,但在编写可移植代码时,它不是你可以依赖的东西。如果您使用邻域v-collective,请复制您的置换向量或将其更改为MPI_Aint。