具有中间变量的本征惰性评估
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();
可能会更好
在 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();