gpt4 book ai didi

c++ - 使用接近于 `count` 的 `INT_MAX` 值通信数据

转载 作者:太空狗 更新时间:2023-10-29 19:58:16 24 4
gpt4 key购买 nike

消息传递接口(interface) API 始终使用 int 作为 count 变量的类型。例如,MPI_Send 的原型(prototype)是:

int MPI_Send(const void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm);

如果要发送或接收的元素数量增长到接近甚至超过 INT_MAX,这可能会出现问题。

当然,可以通过以下方式降低 count 的值来解决此问题:

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

无论如何,这两种方法都更像是一种 hack,而不是真正的解决方案,尤其是在使用简单的启发式方法实现时。因此我想问的是:

是否有更好的习惯用法来处理使用标准 MPI 调用的此类情况?如果不是,是否有人知道围绕 MPI 构建的一些(可靠的)包装器库来克服此限制?

最佳答案

我是 BigMPI 的首席开发人员并与人合着了一篇题为 To INT_MAX... and beyond!: exploring large-count support in MPI 的论文此处详细讨论了这个确切主题,篇幅所限。

如果您无法自由访问 ACM DL,您可以下载 Argonne preprint或查看 paper source repo .

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

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

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

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

  • 即使使用 BigMPI 或类似的基于数据类型的方法,实现也可能存在错误。这意味着做符合标准的事情是行不通的,因为在内部 MPI 实现可能会不正确地将诸如 count*sizeof(type) 之类的东西存储到 32b 值中,这可能会溢出一个有效计数例如,如果 sizeof(type) 为八,则为十亿。正如上述论文中所指出的,除了这些错误(这些错误在 MPICH 和 Open-MPI 的最新版本中似乎不存在)之外,POSIX 函数中还存在一些必须减轻的错误。

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

无论如何,我不希望将我们论文的全部内容转录到这篇文章中,特别是因为它是免费提供的,源代码也是如此。如果您觉得这篇文章不足,请发表评论,我稍后会尝试添加更多内容。

最后,BigMPI是研究代码,我不会说它已经完成了(但是,你不应该打未完成的代码)。强烈建议用户在用于生产之前对 BigMPI 和 MPI 实现执行自己的正确性测试。

关于c++ - 使用接近于 `count` 的 `INT_MAX` 值通信数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23611630/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com