gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:15:07 34 4
gpt4 key购买 nike

我是一名从 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)一起使用应该向编译器提示他们可以/应该对循环代码进行矢量化,但目前编译器对此的采用率很低。

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

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

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

关于c++ - 已知大小数组的基本代数运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57305644/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com