科学计算中的现代 C++?

计算科学 C++ 参考请求
2021-12-21 20:41:02

我正在寻找专门针对科学计算中 C++ 现代特性(移动语义、STL、迭代器、惰性求值等)使用的书籍或文章、博客文章或任何已发布的材料。你能提出任何建议吗?

我认为这些新功能将使编写高效代码变得更加容易,但我还没有找到真正的例子。我读过的大多数参考资料都是关于 C++ 的一般用途,并且不包含科学计算的示例。因此,我正在寻找使用 C++ 现代特性的科学计算代码的示例(不必是生产代码示例,只是教学示例,例如数字食谱级别)。

请注意,我不是在询问使用这些功能的库。我在询问有关如何在科学计算中利用这些功能的文章/书籍/等。

4个回答

使用现代 C++ 结构的两个库示例:

  • eigen 和 armadillo 库(线性代数)都使用了几种现代 C++ 结构。例如,他们使用两个表达式模板来简化算术表达式,有时可以消除一些临时性:

http://eigen.tuxfamily.org

http://arma.sourceforge.net/

http://hpac.rwth-aachen.de/teaching/sem-accg-14/Armadillo.pdf(关于犰狳表达式模板的介绍)

  • CGAL 库(计算几何)使用许多现代 C++ 功能(它大量使用模板和专业化):

http://www.cgal.org

笔记:

现代 C++ 结构非常优雅,使用起来非常有趣。这既是优点也是缺点:在使用它们时,添加几层模板/专业化/ lambda 是如此诱人,以至于最终您有时会在程序中获得比有效代码更多的“管理”(换句话说,你的程序更多地“谈论”问题而不是描述解决方案)。找到正确的平衡是非常微妙的。结论:需要通过测量来跟踪代码中“信噪比”的演变

  • 程序中有多少行代码?
  • 有多少类/模板?
  • 运行时间 ?
  • 内存消耗?

增加前两个的一切都可能被视为成本(因为它可能使程序更难理解和维护),减少后两个的一切都是增益

例如,引入抽象(虚拟类或模板)可以分解代码并使程序更简单(增益),但如果它从不只派生/实例化一次,那么它会引入没有相关增益的成本(再次是微妙的,因为收益可能会在程序的未来演变中出现,因此没有“黄金法则”)。

程序员的舒适度也是成本/收益平衡中需要考虑的一个重要因素:模板过多,编译时间可能会显着增加,并且错误消息变得难以解析。

也可以看看

使用 C++ 模板的通用和元编程在多大程度上在计算科学中有用?

我建议看看 Deal.II。它使用 STL、它自己的迭代器、共享指针等。

由于其设计方式,各种线性求解器可以使用各种矩阵。我没有遇到过移动语义的任何使用,但这并不意味着它们不存在。这是一个链接。

HPX大量使用了一系列 C++11 功能,例如移动构造函数,并且还旨在成为N4409(工作草案,并行 C++ 扩展技术规范)的完整实现。

他们的网站上有一份出版物清单,其中包括一些使用图书馆加速科学计算的例子。在这个CppCast 插曲中也有关于库的非常有趣的讨论以及它对现代 C++ 的使用

我建议看一下科学与工程 C++: Barton 和 Nackmann的高级技术和示例介绍

这本书出版于 1994 年的事实使它似乎违反了您对“现代技术”的标准。然而,Barton 和 Nackmann 在当时处于 C++ 模板的最前沿,他们为实现良好性能而设计的创新技术仍在最新的 C++ 类库中使用。