我正在阅读本征文档,并发现了一个关于优化的小讨论。讨论位于文档页面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提供更多优化机会。
我不明白它如何进行优化以及它如何为优化提供更多机会?解释会很好。
答案 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被评估为临时产品。