与科学计算相关的 c++20 新特性有哪些?

计算科学 C++
2021-11-23 23:46:19

在我的研究部门,我们计划举办一个关于新 c++20 语言标准的小型研讨会。网上有详尽的列表 展示了语言标准的新特性,其中一些会引起这个社区的兴趣,有些则无关紧要。

我想我了解以下优点:

  • 概念 (wiki) - 代码库中(模板)接口的更清晰定义和模板解析中的隐蔽错误更少。我们可以明确说明模板类型应该带来什么,从而减少对鸭子类型的需求。
  • 关键字:[[likely]][[unlikely]] - 告诉编译器如何进行分支预测!
  • 模块- 收集模块中的标头(fortran 样式),(希望)有助于更好地包含管理并缩短编译时间
  • ...?

从数值计算的角度来看,还有哪些特别有用的 c++20 特性?

2个回答
  • 功能测试宏:HPC 通常停留在旧编译器或具有部分一致实现的编译器上。这有助于减轻在 HPC 中常见的自定义架构上工作的痛苦。例子:
#ifdef __cpp_lib_source_location
#include <source_location>
#endif
...
#ifdef
auto sl = std::source_location();
std::cerr << "Error at line " <<  sl.line() << " of file " << sl.file_name() << "\n";
#else
std::cerr << "Error at line " << __LINE__ << " of file " << __FILE__ << "\n";
#endif
  • 当我们这样做时,我真的很喜欢source_location标题;我个人一直在一遍又一遍地重新实现相同的功能。在科学计算中,我发现它特别相关,因为正确编写的错误消息可以将您直接带到发生正确错误的源代码行,这是非常宝贵的。

  • 数学常数:不再4*arctan(1)用于 pi;使用std::numbers::pi;.

  • 原子浮点操作。对于(例如)多线程蒙特卡罗集成非常有用。

  • 我还没有阅读stop_token提案,但据我所知,它可能非常有用。我曾经在一家商店工作,那里的 scicomp 都是多线程的,并且在计算过程中产生了可视化效果,当你可以看到你的模拟时,你学到的是,你开始的大约 90% 的计算出于某种原因或其他原因是错误的;也许这个问题很愚蠢,或者参数导致计算不合理。所以有一种优雅的取消方式是非常有用的。

  • 范围很高兴能够使用投影在“结构数组”上使用所有标准库算法。

  • 概念的另一个用途是防止性能错误。如果我说一个算法应该在 a 上工作RandomAccessContainer并且你传入一个std::list, pre-C++20 它应该编译,因为它std::list有一个解引用运算符[]但也许它会将算法变成,或者将变成O(1)O(n)O(n)O(n2)

  • 我们也将能够使用希腊字母作为标识符这可能会使映射论文的代码更容易一些。

C++ 是一种通用编程语言,因此在后续标准中所做的改进总的来说并不是特别针对科学计算,而是针对复杂软件编程的一般易用性。

也就是说,我认为有一些功能在科学软件中非常有用:

  • 由于各种原因,许多科学软件包都被大量模板化。概念将使编写这样的包更容易,更容易调试。

  • std::span对于以大块分配内存然后以特定方式解释它的软件来说,这是一个有用的抽象。这肯定会使与旧软件的接口变得更容易(尤其是 Fortran 软件)。

我认为 C++17 实际上是更大的一步,特别是因为:

  • C++17 中的许多std函数在第一个参数是ExecutionPolicy. 例如,参见std::foreach这可以更好地利用当今的多核机器。

还有一些 C++20 后的改进,使用起来会很有趣。这些目前是“Parallelism v2 Technical Specification”的一部分。一个例子是使用std::experimental::future::then(). 这将使编写基于任务图的代码变得更加简单。