Skip to main content
QUICK REVIEW

[论文解读] The interface for functions in the dune-functions module

Christian Engwer, Carsten Gräser|arXiv (Cornell University)|Dec 18, 2015
Distributed and Parallel Computing Systems参考文献 1被引用 7
一句话总结

本文提出了一种基于C++的新函数接口,用于Dune有限元框架,以返回值方式(return-by-value)和通过operator()重载及std::function实现的类型擦除,取代了原有的基于引用的评估机制。新设计提升了代码可读性,并支持现代C++特性(如lambda表达式),性能测量表明在现代编译器优化下无运行时开销,其效率与原有接口相当。

ABSTRACT

The dune-functions Dune module introduces a new programmer interface for discrete and non-discrete functions. Unlike the previous interfaces considered in the existing Dune modules, it is based on overloading operator(), and returning values by-value. This makes user code much more readable, and allows the incorporation of newer C++ features such as lambda expressions. Run-time polymorphism is implemented not by inheritance, but by type erasure, generalizing the ideas of the std::function class from the C++11 standard library. We describe the new interface, show its possibilities, and measure the performance impact of type erasure and return-by-value.

研究动机与目标

  • 解决Dune原有函数接口可读性差的问题,其原有设计依赖于引用传递评估和复杂的语法。
  • 通过采用C++11特性(如lambda表达式和返回值语义)来现代化Dune的函数接口。
  • 通过类型擦除(受std::function启发)实现动态多态性,避免虚基类继承。
  • 评估新接口的性能是否与旧接口相当,特别是在返回值语义和类型擦除方面。
  • 通过引入局部坐标系支持,将接口扩展至支持可微函数和基于网格的函数。

提出的方法

  • 基于可调用对象设计新函数接口,采用operator()重载和返回值语义。
  • 通过static_assert进行概念检查,以强制接口契约并改善错误提示信息。
  • 使用类似std::function的包装器实现类型擦除,以支持动态多态性,避免虚继承。
  • 引入LocalFunction和GridViewFunction模板,以支持基于局部坐标系的网格化评估。
  • 通过通用的DerivativeTraits模板参数支持导数计算,使不同函数类型均可实现微分。
  • 通过复合中点积分规则对新旧接口进行基准测试,比较不同返回值大小和分发策略下的性能表现。

实验结果

研究问题

  • RQ1在C++中,与引用传递相比,返回值语义是否会产生可测量的性能开销?
  • RQ2现代编译器能否通过返回值优化(RVO)消除返回值语义的临时对象创建开销?
  • RQ3在有限元函数的上下文中,通过std::function实现的类型擦除性能是否与虚函数分发相当?
  • RQ4新接口能否在保持效率的同时支持可微函数和基于网格的函数?
  • RQ5使用性能指导优化(PGO)是否能弥合std::function与虚函数分发之间的性能差距?

主要发现

  • 使用静态分发的返回值语义与引用传递相比无运行时开销,因为现代编译器通过RVO消除了临时对象的创建。
  • 对于动态分发,std::function实现的类型擦除初始性能低于虚函数分发(尤其在小返回类型时),但该差距在使用性能指导优化(PGO)后被消除。
  • 经过PGO优化后,std::function实现的接口性能与虚函数分发相当或略优,表明类型擦除不会带来根本性的性能损失。
  • 新接口支持更清晰、更符合C++惯用法的代码表达,例如通过lambda表达式和operator()调用自然表达数学函数。
  • 在使用现代编译器优化时,新接口的性能与原有接口持平,验证了其在高性能科学计算中的实用性。
  • 通过LocalFunction和GridViewFunction模板,该设计成功扩展至可微函数和基于网格的函数,同时保持了表达力与效率。

更好的研究,从现在开始

从论文设计到论文写作,大幅缩短您的研究时间。

无需绑定信用卡

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