我們正在努力優化我們的C++代碼和我們有以下的矩陣運算(使用本徵庫)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;
}
在哪裏,他們都爲n×n矩陣,I是單位矩陣。 我們發現改寫上述矩陣運算
P= (I- M)*P
爲
P = P-M*P
導致〜4-8x使用GCC編譯器6.2在Linux Ubuntu系統加快。我意識到編譯器可能不知道任何關於單位矩陣和事實I * P = P的事實,但仍然無法圍繞什麼使得效率提高很多。任何人都知道可以做出如此重大改進的可能原因?
我不是專家,但僅使用P,M聽起來更好的高速緩存行爲比使用I,M,P。令人遺憾的是,這種優化非常複雜(給定一些目標體系結構),並且我假設您的矩陣的實際大小(以及內部類型)也很重要! – sascha
第二個版本可能與沒有節奏的單個函數調用相匹配,比如'dgemm' http://www.netlib.org/lapack/lapack-3.1.1/html/dgemm.f.html,第一個不會與之匹配的單一功能,因此它與臨時對象(首先計算'我是計算 - M'然後'P'乘以和更換P'的'舊值 – alfC
請提供[MCVE否則我們只是猜測。同時發佈平臺,以及如何編譯它。發佈你的拆卸也將是有益的 – xaxxon