矩阵乘法优化
Matrix multiplication optimization
本文关键字:优化 更新时间:2023-10-16
我正在执行一系列具有相当大矩阵的矩阵乘法。通过所有这些操作进行操作需要很长时间,我需要我的程序在大循环中执行此操作。我想知道是否有人有任何想法可以加快这一目标?我刚刚开始使用eigen,所以我的知识非常有限。
我正在使用root-cern内置的tmatrix类,但是执行矩阵操作的速度非常差。我使用特征元设置了一些对角矩阵,希望它以更优化的方式处理乘法操作。它可能,但我真的看不到性能差异。
// 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;
您在这里做的工作太多了。如果您的对角矩阵,仅存储对角线(并将其直接用于产品(。一旦将对角矩阵存储在方形矩阵中,结构的信息就会丢失给特征。
另外,您无需存储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
编译(。
相关文章:
- 空基优化子对象的地址
- 关闭||运算符优化
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 返回值优化:显式移动还是隐式
- 人脸跟踪arduino代码的优化
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 纯函数,为什么没有优化
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 如何以优化的方式同时迭代两个间距不相等的数组
- 小字符串优化(调试与发布模式)
- 浮点定向舍入和优化
- Visual Studio 调试优化如何工作?
- 为什么开关的优化方式与 c/c++ 中的链接不同?
- 线性优化目标函数中的绝对值
- GCC 会优化内联访问器吗?
- gcc 如何优化此循环?
- 如何防止 CUDA-GDB 中的<优化输出>值
- 为什么我的程序在 O0 和 O2 的优化级别返回不同的结果
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 使用 std::p air 进行返回值优化