已知大小数组的基本代数运算

Basic algebra operations on known size arrays

我是一名从 Fortran 过渡过来的 C++ 开发新手。 我正在尝试编写 最有效的 可能的函数来计算两个编译时已知大小 std::arrays 之差的范数(通常在 1 到 10 之间,通常 < 100 ).当然,一个简单的 for 循环很容易做到这一点,但我想知道它(在效率方面)与更现代的编程风格(可能使用 std::accumulate 或 std::inner_product 相比如何?)。

也许专用库(如 Boost 或 Eigen)中已经存在一个简单的解决方案?我对这些了解太少无法确定。

最佳,

手写循环和标准算法很可能会产生相同的代码。无论如何,我不希望在合理的编译器上有有意义的性能差异。

此处真正的性能提升必须来自矢量化。

  • 编译器之间的自动矢量化差异很大(对于浮点运算,默认情况下可能会关闭,因为它们不是关联的)。理论上,使用带有 std::execution::parallel_unsequenced_policy(或 C++20 中的 std::execution::unsequenced_policy)的标准算法应该向编译器提示它们 can/should 向量化循环代码,但编译器对此的采用率很低目前

  • 您可以手写矢量化代码,但这可能很难获得 good/right。除非您知道该部分对性能至关重要,否则这肯定不是您的时间投资。

  • 一些库可能已经为此类操作提供了适当的矢量化代码。我希望 Eigen 并且可能 ublasarmadillolapack 能够解决这个问题。但是您必须自己检查它们,看看它们是否满足您给定平台的需要。

一如既往:如果您关心性能,请进行测量和比较。没有统一的答案。