可以使用 MPI::Send 发送的最大数据量
Maximum amount of data that can be sent using MPI::Send
使用 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
元素。可以通过构造用户定义的类型(例如连续类型)来克服限制,这将减少数据元素的数量。例如,如果注册某个基本 MPI 类型的2^10
元素的连续类型,然后使用MPI_Send
发送此新类型的2^30
元素,则会产生一条包含基本类型的2^40
元素的消息。在这种情况下,如果某些 MPI 实现使用int
在内部处理元素计数,则它们仍可能失败。此外,它会中断MPI_Get_elements
和MPI_Get_count
,因为它们的输出count
参数的类型为int
。
MPI-3.0 解决了其中一些问题。例如,它提供了使用MPI_Count
typedef 作为其count
参数的MPI_Get_elements_x
和MPI_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多个元素。
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 如何通过 mpi c++ 发送布尔数据类型?
- 使用MPI/OpenMP的C 程序带有派生数据类型(嵌套类对象)容器
- 分段错误:C++中的结构序列化和 MPI 数据传输
- 具有灵活大小的结构的 MPI 派生数据类型
- C MPI在不同机器上派生的数据类型
- 可以使用 MPI::Send 发送的最大数据量
- 如何使用某些MPI命令(或组合命令)之间在两个处理器之间交换2D数组中存储的数据
- 在MPI-IO上交错来自不同处理器的二进制数据
- C++,mpi:创建随机数据的最简单方法
- 如何在MPI中从结构类型创建新的派生数据类型
- 使用 MPI 和 C++ 从不同节点收集数据
- 二维数组的 MPI 数据类型
- 如何在 MPI 中使用共享的全局数据集
- 如何将MPI派生的数据类型用于三维数组
- MPI大数据处理
- 使用MPI临时接收数据,然后返回结果
- MPI进程之间的数据交换(halo)
- C++在MPI进程之间共享大型数组和数据结构
- 如何使用MPI在多个独立启动的程序之间传输数据