【问题标题】:Matrix multiplication optimization矩阵乘法优化
【发布时间】:2019-05-15 12:56:44
【问题描述】:

我正在对相当大的矩阵执行一系列矩阵乘法。运行所有这些操作需要很长时间,我需要我的程序在一个大循环中执行此操作。我想知道是否有人有任何想法来加快速度?我刚开始使用 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::MatrixXf car = ((a.transpose().array().rowwise() * a.colwise().sum()).colwise() * a.rowwise().sum()).matrix().
  • 您真的希望将 8000x8000 矩阵乘以 16000x8000 会很快吗?除非您对矩阵的结构有所了解,并且可以利用某些东西,否则您获得良好速度的机会将很渺茫。
  • 没想到这么快。我希望我忽略了一些非常简单和明显的东西。看起来我是。感谢您的评论!

标签: c++ eigen


【解决方案1】:

你在这里做的太多了。如果您有对角矩阵,则仅存储对角线(并直接将其用于产品)。一旦将对角矩阵存储在方阵中,结构的信息就会丢失给 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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多