Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
已知大小数组上的基本代数运算 我是一个新的C++开发人员,从FORTRAN过渡过来。 我试图编写一个最有效的函数来计算两个编译时已知大小的std::数组(通常介于1和10之间,通常_C++_Numeric - Fatal编程技术网

已知大小数组上的基本代数运算 我是一个新的C++开发人员,从FORTRAN过渡过来。 我试图编写一个最有效的函数来计算两个编译时已知大小的std::数组(通常介于1和10之间,通常

已知大小数组上的基本代数运算 我是一个新的C++开发人员,从FORTRAN过渡过来。 我试图编写一个最有效的函数来计算两个编译时已知大小的std::数组(通常介于1和10之间,通常,c++,numeric,C++,Numeric,也许一个简单的解决方案已经存在于一个专用的库中(比如Boost或Eigen)?我对这些了解太少,无法确定 最好的是,手写循环和标准算法很可能产生相同的代码。在任何情况下,我都不会期望在一个合理的编译器上出现有意义的性能差异 这里真正的性能增益必须来自矢量化 编译器之间的自动矢量化差异很大(默认情况下,浮点操作可能会禁用,因为它们不是关联的)。理论上,使用带有std::execution::parallel_unsequenced_policy(或C++20中的std::execution::u

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


最好的是,手写循环和标准算法很可能产生相同的代码。在任何情况下,我都不会期望在一个合理的编译器上出现有意义的性能差异

这里真正的性能增益必须来自矢量化

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

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

  • 某些库可能已经为此类操作提供了正确的矢量化代码。我希望
    Eigen
    和可能的
    armadillo
    lapack
    能够解决这个问题。但您必须亲自检查它们,以及它们是否满足您给定平台的需要


一如往常:如果你关心绩效,请衡量和比较。没有普遍的答案。

你必须衡量才能确定,但我想说它们应该是相等的。如果你想知道,下一步就是尝试这些替代方案并计时。对于有关效率的问题,确实没有普遍适用的答案。标准算法的性能通常不会比手写代码差。交易是:令人敬畏的零开销抽象。事实并非如此:自动地,您的代码会更快地解决问题(以及您想要解决问题的平台),您可以通过并行化获得一定的速度。许多标准算法允许通过(例如)进行并行化,您可以将其用于。如果您觉得没有什么合适的,那么有一些并行化库,比如。还没有提到的东西,如果您的数组在编译时被填充(或者可以被填充),那么您可以使用
constexpr
来计算这类东西(没有运行时成本!)。您必须为此编写自己的函数,因为标准函数还不是constexpr。有关详细信息,请参阅SMMH。实际上,我甚至没有想过矢量化。谢谢你的提示。