使用 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 系统,这意味着int
和long
都是 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_elements
,MPI_Get_count
因为它们的输出count
参数是 type int
。
MPI-3.0 解决了其中一些问题。例如,它提供了使用typedef 作为参数的MPI_Get_elements_x
andMPI_Get_count_x
操作。被定义为能够保存指针值,这使得它在大多数 64 位系统上为 64 位长。还有其他扩展调用(全部以 结尾)代替. 旧的/操作被保留,但现在如果计数大于输出参数可以保存的值,它们将返回(此说明在 MPI-2.2 标准中不存在,并且在未定义的行为中使用非常大的计数)。MPI_Count
count
MPI_Count
_x
MPI_Count
int
MPI_Get_elements
MPI_Get_count
MPI_UNDEFINED
int
正如 pyCthon 已经指出的那样,C++ 绑定在 MPI-2.2 中已弃用,并已从 MPI-3.0 中删除,因为 MPI 论坛不再支持。您应该使用 C 绑定或求助于第 3 方 C++ 绑定,例如Boost.MPI
.
我没有做过 MPI,但是,int 是数组的通常限制大小,我怀疑这就是限制的来源。
在实践中,这是一个相当高的限制。您是否需要发送超过 4 GB 的数据?(在单个 Isend 中)
有关更多信息,请参阅C++ 中是否存在最大数组长度限制?
请注意,链接引用了 size_t,而不是 int(至少在 2012 年,它允许几乎无限的数据) - 然而,在过去,'int' 是此类计数的常用类型,而应该使用size_t,实际上,很多代码仍然使用'int'。
an 的最大大小MPI_Send
将受到您可以分配的最大内存量的限制
和大多数 MPI 实现支持sizeof(size_t)
在https://github.com/jeffhammond/BigMPI上讨论了这个问题和一些解决方法(带有代码)。特别是,该项目演示了如何通过用户定义的数据类型发送超过 INT_MAX 的元素。