特征:乘法和加法的简单优化

时间:2016-05-12 10:34:33

标签: c++ eigen

我正在阅读本征文档,并发现了一个关于优化的小讨论。讨论位于文档页面http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html

的标题“ adapter.notifyDataSetChanged(); for(int i = 0;i<adapter.getCount();i++){ try{ tablayout.getTabAt(i).setText(adapter.getPageTitle(i)); } catch(IndexOutOfBoundException e){ tablayout.addTab(tablayout.newTab().setText(adapter.getPageTitle(i)); } } ”下

它给出了一个例子

A note about expression templates

最后它说

  

因此,您不应该害怕使用具有Eigen的相对较大的算术表达式:它只会为Eigen提供更多优化机会。

我不明白它如何进行优化以及它如何为优化提供更多机会?解释会很好。

1 个答案:

答案 0 :(得分:1)

根据您引用的页面和Writing efficient matrix product expressions页面,如果您可以选择:

<强> MethodOne

VectorXf a(50), b(50), c(50), d(50);
...
a = 3*b + 4*c + 5*d;

<强> MethodTwo

VectorXf a(50), b(50), c(50), d(50);
...
a = 3*b + 4*c;
a += 5*d;

你应该更喜欢MethodOne。

因此,允许软件优化通过向量获得迭代

  

Eigen将它编译为只有一个for循环,因此数组只遍历一次。

此外,通过.noalias()调用可以获得更多优化空间,并将表达式简化为单个评估(如果可能,存在限制):

  

使用.noalias()告诉Eigen结果,右手边不要别名。否则,产品m2 * m3被评估为临时产品。