矩阵乘法优化
Matrix multiplication optimization
我正在对相当大的矩阵执行一系列矩阵乘法。要 运行 通过所有这些操作需要很长时间,我需要我的程序在一个大循环中执行此操作。我想知道是否有人有任何想法来加快速度?刚开始用Eigen,所以知识很有限
我使用的是 ROOT-cern 内置的 TMatrix class,但是执行矩阵运算的速度很差。我使用 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
)。
我正在对相当大的矩阵执行一系列矩阵乘法。要 运行 通过所有这些操作需要很长时间,我需要我的程序在一个大循环中执行此操作。我想知道是否有人有任何想法来加快速度?刚开始用Eigen,所以知识很有限
我使用的是 ROOT-cern 内置的 TMatrix class,但是执行矩阵运算的速度很差。我使用 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
)。