使用接近“INT_MAX”的“count”值传送数据

Mas*_*ano 4 c c++ int buffer mpi

消息传递接口 API 始终用作变量int的类型count。例如,原型是MPI_Send

int MPI_Send(const void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm);
Run Code Online (Sandbox Code Playgroud)

如果要发送或接收的元素数量接近甚至超过 INT_MAX,这可能会成为问题。

当然,可以通过以下任一方法降低 的值来解决该问题count

  1. 将单个呼叫拆分为多个呼叫
  2. 定义(不必要的)聚合MPI_Datatype

无论如何,这两种方法都更像是一种黑客行为,而不是真正的解决方案,特别是如果使用简单的启发式方法来实现。因此我想问的是:

是否有更好的习惯用标准 MPI 调用来处理此类情况?如果没有,有人知道一些围绕 MPI 构建的(实体)包装库来克服这个限制吗?

Jef*_*eff 5

我是BigMPI的首席开发人员,并与人合着了一篇题为《To INT_MAX... and Beyond!: Explore Large-count Support in MPI》的论文,该论文比此处篇幅所允许的更详细地讨论了这个确切的主题。

如果您无法免费访问 ACM DL,您可以下载Argonne 预印本或查看论文源存储库

以下是这项工作的主要亮点:

  • BigMPI 是 MPI 的一个相对高质量的接口,支持 64b 整数计数(该类型是技术上的,MPI_CountMPI_Aint在内部使用)。讽刺的是,它并没有利用 MPI-3 大计数功能。这是因为 BigMPI 并不完全通用,而是旨在支持最常见的使用模型。

  • BigMPI 的设计部​​分是为了教育目的。它采用极其宽松的MIT 许可证,使任何人都可以将代码从其中复制到另一个项目中,并可能进行更改以满足不可预见的需求。

  • 在 MPI-3 接口中超过 INT_MAX 不仅仅是一个小问题。这是无效的 ISO C 代码。与无符号整数不同,有符号整数的翻转行为是未定义的。因此,主要问题不在于 MPI,而在于 C 整数不能容纳大于 INT_MAX 的数字。例如,将 count 参数指定为 Cint类型(而不是 )是否是 MPI 的问题是一个有争议的问题。size_t在说 MPI 显然应该切换到 之前size_t,您需要了解 MPI 的历史以及ABI 兼容性对于 MPI 用户子集的重要性。

  • 即使使用 BigMPI 或类似的基于数据类型的方法,实现也可能存在错误。这意味着执行符合标准的操作将不起作用,因为在内部,MPI 实现可能会不正确地将某些内容存储count*sizeof(type)到 32b 值中,例如,如果sizeof(type)是 8,则该值可能会溢出,导致有效计数(例如 10 亿)。正如上述论文中所指出的,除了这些 bug(在最新版本的 MPICH 和 Open-MPI 中似乎不存在)之外,POSIX 函数中还存在必须缓解的 bug。

  • Fortran 的情况更为复杂。Fortran 默认整数大小未指定,理论上,MPI 实现应尊重编译器使用的任何内容。然而,实际情况往往并非如此。我相信由于int内部使用了 C,许多 MPI 实现在计数超过 INT_MAX 时就会被破坏。BigMPI 没有 Fortran 接口,尽管我希望有一天能编写一个。在那之前,请敦促 MPI 实现者在内部将 Fortran 转换为 C 类型时做正确的事情INTEGER

无论如何,我不想将我们论文的全部内容转录到这篇文章中,特别是因为它和源代码一样都是免费提供的。如果您觉得这篇文章有不足之处,请评论,我会在稍后尝试添加更多内容。

最后,BigMPI 是研究代码,我不会说它已经完成(但是,您不应该点击未完成的代码)。强烈鼓励用户在生产中使用之前对 BigMPI 和 MPI 实现进行自己的正确性测试。