MPI_alltoallv,其中 sendcounts 作为长整型数组(不是整数值)

问题描述 投票:0回答:4

我需要使用

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

mpi
4个回答
2
投票

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

  • 使用 MPI 数据类型。这些将使您将数据封装成(理论上)任意大的数据类型。它们使用起来可能有点复杂,但如果您只发送大的、连续的内存区域,那么这并不太困难。
  • 以多个块的形式发送数据。如果您将消息的大小限制为
    INT_MAX
    ,那么您就可以完全避免这个问题。您只需发送更多消息即可。
  • 使用 BigMPI,Jeff Hammond 的一个库,它封装了发送大量数据的一些粗暴之处。我不认为他将该代码称为生产就绪,但您可以看一下它是否是您所需要的。

2
投票

我喜欢韦斯的回答,因为它的完整性。 如果您想要一个程序如何处理大量计数的具体示例,请参阅我在 ROMIO 中的做法:

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

还值得指出的是,如果您要发送多个 GB 的数据,MPI_ALLTOALLV 不会比一堆 MPI_Isends 和 MPI_Irecv 调用更有效。


0
投票

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

请注意,不保证 long 和 MPI_Aint 等效。目前我的机器上的 MPICH 3.2 确实如此,但在编写可移植代码时您不能依赖它。如果您使用邻域 v 集体,请复制您的位移向量或将其更改为 MPI_Aint。


0
投票

今天这个问题的正确答案当然是使用 MPI_Alltoallv_c,它是 MPI-4 中引入的“大计数”例程之一。

我为无法使用 MPI-4 的人保留上面的原始答案

© www.soinside.com 2019 - 2024. All rights reserved.