Eigens用中间变量进行懒惰评估

时间:2017-04-14 18:29:28

标签: c++ lazy-evaluation eigen

在Eigen文档中,当表达式被延迟评估时,我找不到确切的说明。对我来说,只有系数表达很有意思,即没有混叠的可能性。

拿走,例如ArrayXXf a(10000, 10000);,然后

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

在我的电脑上评估~250ms,与

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

,而

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

在~550ms内进行评估。

是否有一种状态,即当表达式分配给显式数组类型(例如ArrayXXf)时,表达式总是被计算?

代码是使用MinGW版本-O3

编译的

P.S。这是一个普遍的问题,这个例子刚刚结束

1 个答案:

答案 0 :(得分:2)

通常,如果您将表达式分配给Array<...>,则会明确评估它(除非编译器认为它可以完全优化掉该变量 - 可能就是这种情况,特别是对于小的固定大小的数组。 / p>

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

可能更好