已知大小数组的基本代数运算
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
并且可能 ublas
、armadillo
或 lapack
能够解决这个问题。但是您必须自己检查它们,看看它们是否满足您给定平台的需要。
一如既往:如果您关心性能,请进行测量和比较。没有统一的答案。
我是一名从 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
并且可能、ublas
armadillo
或lapack
能够解决这个问题。但是您必须自己检查它们,看看它们是否满足您给定平台的需要。
一如既往:如果您关心性能,请进行测量和比较。没有统一的答案。