首页 > 解决方案 > 已知大小数组的基本代数运算

问题描述

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

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

最好的,

标签: c++numeric

解决方案


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

这里真正的性能提升必须来自矢量化。

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

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

  • 一些库可能已经为此类操作提供了适当的矢量化代码。我希望Eigen并且可能ublasarmadillo或者lapack有这个想法。但是您必须自己检查它们,以及它们是否满足您对给定平台的需求。

一如既往:如果您关心性能,请衡量和比较。没有普遍的答案。


推荐阅读