6

使用 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 的限制吗?

4

4 回答 4

12

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可以通过构造用户定义的类型(例如连续类型)来克服限制,这将减少数据元素的数量。例如,如果您注册了2^10一些基本 MPI 类型的元素的连续类型,然后您使用MPI_Send发送2^30这种新类型的元素,则将产生2^40基本类型元素的消息。在这种情况下,如果某些 MPI 实现用于int在内部处理元素计数,它们可能仍然会失败。它也中断了MPI_Get_elementsMPI_Get_count因为它们的输出count参数是 type int

MPI-3.0 解决了其中一些问题。例如,它提供了使用typedef 作为参数的MPI_Get_elements_xandMPI_Get_count_x操作。被定义为能够保存指针值,这使得它在大多数 64 位系统上为 64 位长。还有其他扩展调用(全部以 结尾)代替. 旧的/操作被保留,但现在如果计数大于输出参数可以保存的值,它们将返回(此说明在 MPI-2.2 标准中不存在,并且在未定义的行为中使用非常大的计数)。MPI_CountcountMPI_Count_xMPI_CountintMPI_Get_elementsMPI_Get_countMPI_UNDEFINEDint

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

于 2012-11-26T12:20:20.510 回答
1

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

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

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

请注意,链接引用了 size_t,而不是 int(至少在 2012 年,它允许几乎无限的数据) - 然而,在过去,'int' 是此类计数的常用类型,而应该使用size_t,实际上,很多代码仍然使用'int'。

于 2012-11-26T05:00:00.033 回答
0

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

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

于 2012-11-26T05:07:19.370 回答
0

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

于 2014-09-09T07:23:28.450 回答