C++;矩阵计算效率 我们试图优化C++代码,我们有以下矩阵计算(使用特征库)< /P>

C++;矩阵计算效率 我们试图优化C++代码,我们有以下矩阵计算(使用特征库)< /P>,c++,algorithm,performance,matrix,eigen,C++,Algorithm,Performance,Matrix,Eigen,作为 结果在使用gcc 6.2编译器的Linux ubuntu系统中,速度提高了约4-8倍。我意识到编译器可能不知道任何关于单位矩阵和I*P=P的事实,但仍然无法理解是什么使效率提高了这么多。有人知道做出如此重大改进的可能原因吗 首先,I.identity()不存在。您需要的是I.setIdentity(),或者P=(MatrixXd::Identity(30,30)-M)*P。 如果使用第一个选项,Eigen肯定需要对I和M进行30x30的全减(编译器很难看到与第二个表达式的等价性)。总的来说

作为


结果在使用gcc 6.2编译器的Linux ubuntu系统中,速度提高了约4-8倍。我意识到编译器可能不知道任何关于单位矩阵和I*P=P的事实,但仍然无法理解是什么使效率提高了这么多。有人知道做出如此重大改进的可能原因吗

首先,
I.identity()不存在。您需要的是
I.setIdentity()
,或者
P=(MatrixXd::Identity(30,30)-M)*P
。 如果使用第一个选项,Eigen肯定需要对
I
M
进行30x30的全减(编译器很难看到与第二个表达式的等价性)。总的来说,这将导致两个临时性(一个用于差异,一个用于产品)

如果您实际使用了
I.Identity()
,那么您调用的是一个静态函数,就像调用成员函数一样,您的编译器至少应该警告您这一点。这实际上不会修改
I
,您最终会在
I
中得到未初始化的值,这可能会包括一些NaN值或非规范值,这两个值都可能对浮点性能有害。当然,你的结果是错误的

总的来说,我认为写等式最简单的方法是

P -= M*P;


我不是专家,但仅使用P,m听起来比使用I,m,P更好。遗憾的是,这些优化非常复杂(给定一些目标体系结构),我假设矩阵的实际大小(可能还有内部类型)在这里也很重要!第二个版本可能匹配没有时间的单个函数调用,如
dgemm
,而第一个版本不匹配单个函数,因此它使用时间进行计算(首先计算
I-M
,然后乘以
P
,并替换
P
的旧值。请提供一个新的值,否则我们只是猜测。同时发布您的平台以及您是如何编译的。发布您的反汇编也会很有帮助。谢谢您的建议。我还包括一些代码!请您编译好吗在这两种情况下都使用此命令创建r文件,并比较汇编文件(.s)compile命令(g++-O2-s foo.c),感谢您指出错误(是的,应该是setIdentity(),尝试在移动设备上编辑帖子,这是一个大错误)和您的解释。我修改了我的帖子。
   P= (I- M)*P
   P = P-M*P
P -= M*P;
MatrixXd Pnew = P - M*P;