我们正在尝试优化我们的C++代码,我们有以下矩阵计算(使用本征库)
#include<Eigen/Dense>
int main(){
MatrixXd P = MatrixXd::Random(30,30); // a random double 30 x 30 matrix P
MatrixXd M = MatrixXd::Random(30,30); // a random double 30 x 30 matrix M
Matrix<double, 30, 30> I;
I.setIdentity(); // I is an 30 x 30 identity matirx
P = (I-M)*P
return 0;
}其中它们都是nxn矩阵,而i是恒等矩阵。我们发现重写了上面的矩阵计算。
P= (I- M)*P作为
P = P-M*P在Linux系统中,使用gcc 6.2编译器实现了4-8x的加速。我意识到,编译器可能不知道任何关于恒等矩阵和I*P = P的事实,但仍然无法理解是什么使效率提高了很多。有谁知道作出如此重大改进的可能原因吗?
发布于 2017-04-25 08:45:54
首先,I.identity();不存在。您想要的要么是I.setIdentity(),要么是P = (MatrixXd::Identity(30,30)-M)*P。如果使用第一个选项,Eigen肯定需要对I和M进行完整的30x30减法(编译器很难看到与第二个表达式的等价性)。总的来说,这将导致两个临时人员(一个用于差异,一个用于产品)。
如果您实际使用I.Identity(),您将调用一个静态函数,就像调用一个成员函数一样,您的编译器至少应该对此发出警告。这实际上不会修改I,您最终会在I中得到未初始化的值,这很可能包括一些NaN或去正态分布值,这对浮点性能都有影响。当然你的结果是错误的。
总的来说,我认为写方程的最简单的方法是
P -= M*P;或
MatrixXd Pnew = P - M*P;https://stackoverflow.com/questions/43599468
复制相似问题