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

2023-12-13

消息传递接口 API 始终使用int作为一个类型count变量。例如,原型为MPI_Send is:

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

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

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


我是 的首席开发人员BigMPI并共同撰写了一篇论文,题为到 INT_MAX...甚至更远!:探索 MPI 中的大计数支持这里对这个主题的讨论比篇幅所允许的要详细得多。

如果您无法免费访问 ACM DL,您可以下载阿贡预印本或结账纸质资源库.

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

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

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

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用接近“INT_MAX”的“count”值传送数据 的相关文章

  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • Python 中的二进制缓冲区

    在Python中你可以使用StringIO https docs python org library struct html用于字符数据的类似文件的缓冲区 内存映射文件 https docs python org library mmap
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐