具有中间变量的本征惰性评估

Eigens lazy evaluation with intermediate variable

在 Eigen 文档中,我找不到对延迟计算表达式的确切情况的解释。就我而言,我只对系数表达式感兴趣(即不可能出现混叠)。

例如,给定 ArrayXXf a(10000, 10000);

a = a.cube() * a.cube();

在 ~250 毫秒内为我评估,与

相同
auto aCube = a.cube();
a = aCube * aCube;

ArrayXXf aCube = a.cube();
a = aCube * aCube;

评估需要 ~550 毫秒。

将表达式分配给显式数组类型(例如 ArrayXXf)是否总是强制对其求值?

代码是用MinGW release -O3编译的。

这是一个一般性问题;这个例子只是虚构的。

一般来说,是的,如果您将表达式分配给 Array<...>,它会被显式计算(除非编译器认为它可以完全优化掉该变量——情况可能如此,尤其是对于小型固定大小的数组.

分配给 auto 变量不会计算(除非你的表达式以 (...).eval() 结尾),这也意味着 aCube * aCube 将计算 aCube 的每个系数两次(尽管编译器可能足够聪明,可以弄清楚它可以重用该值)。在那种特殊情况下,写 a = aCube.square();

可能会更好