可以使用 MPI::Send 发送的最大数据量

Maximum amount of data that can be sent using MPI::Send

本文关键字:数据 MPI Send 可以使      更新时间:2023-10-16

使用 MPI::Isend 的语法为

MPI::Request MPI::Comm::Isend(const void *buf, int count, 
const MPI::Datatype& datatype, 
int dest, int tag) const;

发送的数据量是否受限制

std::numeric_limits<int>::max()

许多其他 MPI 函数都有 int 参数。这是 MPI 的限制吗?

MPI-2.2将数据长度参数定义为int。在大多数 64 位 Unix 系统上,这可能是并且通常是一个问题,因为int仍然是 32 位。此类系统称为 LP64,这意味着long和指针的长度为 64 位,而int的长度为 32 位。相比之下,Windows x64 是 LLP64 系统,这意味着intlong的长度均为 32 位,而long long和指针的长度为 64 位。用于64位x86 CPU的Linux就是LP64这种类Unix系统的一个例子。

鉴于 MPI-2.2 实现中的所有上述MPI_Send的消息大小限制为2^31-1元素。可以通过构造用户定义的类型(例如连续类型)来克服限制,这将减少数据元素的数量。例如,如果注册某个基本 MPI 类型的2^10元素的连续类型,然后使用MPI_Send发送此新类型的2^30元素,则会产生一条包含基本类型的2^40元素的消息。在这种情况下,如果某些 MPI 实现使用int在内部处理元素计数,则它们仍可能失败。此外,它会中断MPI_Get_elementsMPI_Get_count,因为它们的输出count参数的类型为int

MPI-3.0 解决了其中一些问题。例如,它提供了使用MPI_Counttypedef 作为其count参数的MPI_Get_elements_xMPI_Get_count_x操作。 定义MPI_Count是为了能够保存指针值,这使得它在大多数 64 位系统上的长度为 64 位。还有其他扩展调用(均以_x结尾)接受MPI_Count而不是int。保留旧的MPI_Get_elements/MPI_Get_count操作,但现在如果计数大于int输出参数可以容纳的计数,它们将返回MPI_UNDEFINED(MPI-2.2 标准中不存在此澄清,并且在那里的未定义行为中使用非常大的计数)。

正如pyCthon已经指出的那样,C++绑定在MPI-2.2中被弃用,并从MPI-3.0中删除,因为MPI论坛不再支持。您应该使用 C 绑定或求助于第三方C++绑定,例如Boost.MPI.

我没有做过 MPI,但是,int 是数组的通常限制大小,我怀疑这就是限制的来源。

实际上,这是一个相当高的限制。 您是否需要发送超过 4 GB 的数据?(在单个Isend中)

有关更多信息,请参阅 C++ 中是否有最大数组长度限制?

请注意,链接引用的是size_t,而不是int(对于所有意图,至少在2012年,它允许几乎无限的数据) - 然而,在过去,"int"是此类计数的常用类型,虽然应该使用size_t,但在实践中,许多代码仍在使用"int"。

MPI_Send的最大大小将受您可以分配的最大内存量的限制

大多数 MPI 实现都支持sizeof(size_t)

此问题和一些解决方法(使用代码)将在 https://github.com/jeffhammond/BigMPI 上讨论。 特别是,该项目演示了如何通过用户定义的数据类型发送INT_MAX多个元素。