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


22

我正在寻找书籍或文章,博客文章或任何已出版的一般材料,这些材料专门解决了科学计算中C ++现代功能(移动语义,STL,迭代器,惰性评估等)的使用。你能建议什么吗?

我认为这些新功能将使编写高效的代码更加容易,但是我还没有找到真正的例子。我阅读的大多数参考文献都是关于C ++的一般用法的,并不包含科学计算的示例。因此,我正在寻找使用C ++现代功能的科学计算代码的示例(不一定是生产代码示例,而仅是教学示例,例如在数字食谱方面)。

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


2
您是在从当今(相对于20年前)被认为是最佳实践的意义上询问“现代”,还是从C ++ 11/14的特定意义上询问“现代”?
基里尔

2
@Kirill我想都是。通常使用C ++ 11/14,但遵循最佳做法。
becko

Answers:


11

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

  • 本征库和犰狳库(线性代数)都使用几种现代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,以至于最终您有时会获得比程序中有效代码更多的“管理”权限(换句话说,您的程序比描述解决方案更多地谈论问题。找到正确的平衡是非常微妙的。结论:需要通过测量来跟踪代码中“信号/噪声”比的变化:

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

增加前两个值的所有内容都可以视为成本(因为这可能会使程序难以理解和维护),减少后两个值的所有内容都是收益

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

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

也可以看看

使用C ++模板的泛型和元编程在计算科学上有多大用处?


2
Armadillo和Eigen也一样,不是吗?
dr.blochwave

是的,您是对的(我刚刚查阅了Armadillo的文档,对此我不太熟悉)。我正在编辑帖子。
BrunoLevy

1
更长的编译时间是另一个值得一提的代价。
基里尔

@Kirill,是的,很好(编辑帖子中提到了),谢谢。
BrunoLevy 2015年

10

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

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


还有OpenFOAM-模板的大量使用。
tpg2114

1
deal.II不使用移动语义(因为它避免了使用C ++ 11语言功能,但是它使用的C ++ 11库功能在较早的编译器中已被BOOST取代)。但是,它几乎使用了所有其他C ++语言功能,包括原始问题中要求的所有功能。
Wolfgang Bangerth,2015年

详细了解大型图书馆似乎并不容易。
迈克尔

7

HPX库大量使用的范围内的C ++的11移动的构造等功能,并且还旨在是一个完整的实施N4409(用于C ++扩展为并行工作草案,技术规范)。

他们在自己的站点上有一份出版物列表,其中包括使用该库加快科学计算速度的许多示例。在CppCast情节中,关于库的讨论也很有趣,它也涉及到现代C ++的使用。


欢迎来到scicomp.se!如果您添加链接或引用一些讨论该库进行科学计算的文章/书籍/博客文章,我会很乐意为您的答案加分!
hardmath 2015年

5

我建议看看Barton和Nackmann撰写的《科学与工程C ++:高级技术入门与范例》。

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


4

除了Deal.ii(这里已经建议过),您还可以查看Dune库,该库大量使用了一些高级C ++功能,例如模板元编程,迭代器范围,智能指针等。JoachimSchöberl 最近发表了预印本,其中对使用C ++ 11功能(例如lambda函数)进行了评论,以简化NGSolve中有限元方法的实现。促进也有一些与科学编程相关的库,例如uBLAS,Graph等。我想在这些库中的大多数中,您会找到现代C ++用法的好例子。但是,请注意,您可能还会遇到使用高级/现代C ++的不良示例。在某些情况下,在阅读代码/文档时,我觉得有时为了展示诸如TMP之类的高级技能,事情过于笼统,对于99%的所有潜在应用程序,更简单的实现也可以做到。工作。


3

Pitt-Francis&Whiteley撰写的《 C ++科学计算指南》一书正是为了回答这类问题(使用STL,迭代器等),可以通过亚马逊获得,也可以作为发行商的电子书。

披露-我和作者在同一研究小组工作,但仍然认为这是一个非常好的资源!


1

我认为这本书对您来说是完美的,对我来说也是一样:探索现代C ++:彼得·戈特施林(Peter Gottschling)为科学家,工程师和程序员开设的强化课程(C ++深入),特别是与编程原理和实践使用结合使用时C ++第二版Bjarne Stroustrup。C ++自己的发明者。两者都应提供坚实的基础。


0

线性代数的Blaze库大量使用了演绎和尾随返回类型形式的C ++ 14。其他正在使用的现代C ++功能包括constexpr,别名模板以及使用表达式SFINAE进行的大量模板元编程。

您还可以对向量和矩阵使用初始化列表,例如

blaze::DynamicVector<int> x{ 4, -1, 3 };

有关更多详细信息,请参见其入门页面

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.