簡體   English   中英

矩陣乘法優化

[英]Matrix multiplication optimization

我正在使用相當大的矩陣執行一系列矩陣乘法。 要運行所有這些操作需要很長時間,我需要我的程序在大循環中執行此操作。 我想知道是否有人有任何想法加快這一點? 我剛開始使用Eigen,所以我的知識非常有限。

我使用的是ROOT-cern內置的TMatrix類,但執行矩陣操作的速度非常差。 我使用Eigen設置了一些對角矩陣,希望它以更優化的方式處理乘法運算。 它可能,但我不能真正看到性能差異。

// setup matrices
int size = 8000;

Eigen::MatrixXf a(size*2,size);

// fill matrix a....

Eigen::MatrixXf r(2*size,2*size); // diagonal matrix of row sums of a

// fill matrix r

Eigen::MatrixXf c(size,size); // diagonal matrix of col sums of a

// fill matrix c

// transpose a in place
a.transposeInPlace();

Eigen::MatrixXf c_dia;
c_dia = c.diagonal().asDiagonal();

Eigen::MatrixXf r_dia;
r_dia = r.diagonal().asDiagonal();

// calc car
Eigen::MatrixXf car;
car = c_dia*a*r_dia;

你在這里做的工作太多了。 如果你有對角矩陣,只存儲對角線(並直接用於產品)。 一旦將對角矩陣存儲在方陣中,結構的信息就會丟失到Eigen。

此外,你並不需要保存的換位變a ,只需使用a.transpose()產品內部(即只有一個小問題在這里...)

// setup matrices
int size = 8000;

Eigen::MatrixXf a(size*2,size);

// fill matrix a....
a.setRandom();

Eigen::VectorXf r = a.rowwise().sum(); // diagonal matrix of row sums of a
Eigen::VectorXf c = a.colwise().sum(); // diagonal matrix of col sums of a

Eigen::MatrixXf car = c.asDiagonal() * a.transpose() * r.asDiagonal();

最后,當然要確保在啟用優化的情況下進行編譯,並啟用矢量化(如果可用的話(使用gcc或clang編譯時使用-O2 -march=native )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM