使用MPI :: Isend的语法
MPI::Request MPI::Comm::Isend(const void *buf, int count,
const MPI::Datatype& datatype,
int dest, int tag) const;
Run Code Online (Sandbox Code Playgroud)
是受限制的数据量
std::numeric_limits<int>::max()
Run Code Online (Sandbox Code Playgroud)
许多其他MPI函数都有int参数.这是MPI的限制吗?
Hri*_*iev 12
MPI-2.2将数据长度参数定义为int.这可能并且通常在大多数64位Unix系统上都是一个问题,因为int它仍然是32位.这种系统被称为LP64,这意味着long指针是64位长,而int长度是32位.与此相反,视窗64是一种LLP64系统,这意味着这两个int和long是32位长,而long long和指针是64位长.用于64位x86 CPU的Linux就是这种类似Unix的系统的一个例子,它是LP64.
鉴于MPI_SendMPI-2.2中的所有上述实现都具有2^31-1元素的消息大小限制.可以通过构造用户定义的类型(例如,连续类型)来克服该限制,这将减少数据元素的数量.例如,如果注册2^10一些基本MPI类型的连续类型的元素,然后MPI_Send用于发送2^30此新类型的元素,则会2^40生成基本类型元素的消息.如果它们用于int在内部处理元素计数,则某些MPI实现在这种情况下仍可能失败.它也会中断MPI_Get_elements,MPI_Get_count因为它们的输出count参数是类型的int.
MPI-3.0解决了其中一些问题.例如,它提供了使用typedef作为参数的操作MPI_Get_elements_x和MPI_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绑定或使用第三方C++绑定,例如Boost.MPI.
我还没有做过 MPI,但是,int 是数组的通常限制大小,我怀疑这就是限制的来源。
实际上,这是一个相当高的限制。您需要发送超过 4 GB 的数据吗?(在单个 Isend 中)
有关详细信息,请参阅C++ 中是否有最大数组长度限制?
请注意,link 引用的是 size_t,而不是 int(出于所有意图,至少在 2012 年,这允许几乎无限的数据) - 然而,在过去,“int”是此类计数的常用类型,而应该使用size_t,在实践中,很多代码仍然使用'int'。