Skip to main content
QUICK REVIEW

[论文解读] Runtime-Flexible Multi-dimensional Arrays and Views for C++98 and C++0x

Bjoern Andres, Ullrich Koethe|arXiv (Cornell University)|Aug 17, 2010
Parallel Computing and Optimization Techniques参考文献 8被引用 6
一句话总结

本文提出 Marray,一个兼容 C++98 和 C++0x 的库,用于运行时灵活的多维数组和视图,通过基于视图的抽象实现动态维度。它通过将视图作为一等抽象,结合 C++0x 的模板别名、可变参数模板和列表初始化功能,实现 C++ 风格的性能与易用性,提升表达力和类型安全性。

ABSTRACT

Multi-dimensional arrays are among the most fundamental and most useful data structures of all. In C++, excellent template libraries exist for arrays whose dimension is fixed at runtime. Arrays whose dimension can change at runtime have been implemented in C. However, a generic object-oriented C++ implementation of runtime-flexible arrays has so far been missing. In this article, we discuss our new implementation called Marray, a package of class templates that fills this gap. Marray is based on views as an underlying concept. This concept brings some of the flexibility known from script languages such as R and MATLAB to C++. Marray is free both for commercial and non-commercial use and is publicly available from www.andres.sc/marray

研究动机与目标

  • 解决缺乏通用、面向对象的 C++ 实现方案的问题,这些方案用于维度在编译时未固定为常量的多维数组。
  • 在保持高性能和类型安全的前提下,实现数组维度的运行时灵活性。
  • 通过引入基于视图的抽象,弥合 C++ 模板库(如 Boost、Blitz++)与脚本语言(如 R、MATLAB)之间的易用性差距。
  • 支持多变量数据和函数的实际用例,其中数组维度取决于用户输入或运行时条件。
  • 在支持 C++98 的同时,集成现代 C++0x 特性,以提升代码清晰度和安全性。

提出的方法

  • 基于维度、形状、步长和偏移量(d, s, t, p₀)的数学框架建模数组和视图,实现灵活的内存布局解释。
  • 通过类模板实现视图,抽象对底层数据的访问,实现子数组和重新解释布局而无需数据复制。
  • 使用模板特化和继承模式支持常量和可变视图,并利用 C++0x 的模板别名减少代码冗余。
  • 通过可变参数模板支持任意数量坐标参数的 operator(),提升相较于 C++98 有限函数重载的易用性。
  • 集成 C++0x 的列表初始化功能,允许使用统一初始化语法直接初始化形状和大小,提升代码清晰度。
  • 通过预处理器宏(NO_DEBUG, NO_ARG_TEST)有条件启用断言和参数检查,允许在性能关键的构建中移除断言。

实验结果

研究问题

  • RQ1如何在不依赖编译时模板特化的情况下,高效且安全地在 C++ 中实现维度动态变化的多维数组?
  • RQ2在保持 C++ 性能和类型安全的前提下,C++ 中基于视图的抽象在多大程度上可以复制 R 和 MATLAB 等脚本语言的灵活性?
  • RQ3哪些最有效的 C++0x 语言特性(如模板别名、可变参数模板、列表初始化)能够提升通用多维数组库的表达力和可维护性?
  • RQ4是否可以设计一个统一的、通用的接口,用于数组和视图,使其同时支持固定维度和运行时维度的数据结构?
  • RQ5如何在不牺牲开发阶段正确性的前提下,将性能关键的运行时检查在生产构建中条件编译移除?

主要发现

  • Marray 在 C++98 和 C++0x 中成功实现了一个通用、面向对象且运行时灵活的多维数组与视图系统,填补了 C++ 科学计算库中长期存在的空白。
  • 通过将视图作为核心抽象,实现了无需运行时开销的动态维度和子数组访问,性能可与原生 C++ 数组相媲美。
  • C++0x 扩展(如模板别名、可变参数模板和列表初始化)显著提升了代码清晰度和类型安全性,尤其在高维访问模式下表现突出。
  • 该库通过统一接口同时支持编译时和运行时维度,可无缝集成到现有 C++ 代码库中。
  • 通过 NO_DEBUG 和 NO_ARG_TEST 的条件编译,可在生产构建中移除运行时检查,确保最优性能,同时不牺牲开发阶段的安全性。
  • 该库公开可用且为开源,目前正积极开发 HDF5 集成和 C 兼容数组互操作功能,显示出在高性能计算和科学计算领域广泛采用的潜力。

更好的研究,从现在开始

从阅读论文到最终审阅,大幅缩短您的研究时间。

无需绑定信用卡

本解读由 AI 生成,并经人工编辑审核。