与科学计算相关的 c++20 新特性有哪些?
- 功能测试宏: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
有一个解引用运算符[]
。但也许它会将算法变成,或者将变成。我们也将能够使用希腊字母作为标识符。这可能会使映射论文的代码更容易一些。
C++ 是一种通用编程语言,因此在后续标准中所做的改进总的来说并不是特别针对科学计算,而是针对复杂软件编程的一般易用性。
也就是说,我认为有一些功能在科学软件中非常有用:
由于各种原因,许多科学软件包都被大量模板化。概念将使编写这样的包更容易,更容易调试。
std::span
对于以大块分配内存然后以特定方式解释它的软件来说,这是一个有用的抽象。这肯定会使与旧软件的接口变得更容易(尤其是 Fortran 软件)。
我认为 C++17 实际上是更大的一步,特别是因为:
- C++17 中的许多
std
函数在第一个参数是ExecutionPolicy
. 例如,参见std::foreach
。这可以更好地利用当今的多核机器。
还有一些 C++20 后的改进,使用起来会很有趣。这些目前是“Parallelism v2 Technical Specification”的一部分。一个例子是使用std::experimental::future::then()
. 这将使编写基于任务图的代码变得更加简单。