在Eigen中优化大矩阵乘法
Optimize large matrices multiplication in Eigen
我正在C++中使用特征库进行一些大型随机矩阵(至少1000x1000)的计算,我的代码由以下函数组成:
特征::VectorXd网格(…);使用快速排序算法和ran1算法初始化(逐元素)对数正态分布值的排序向量,假设大小为N,则所有矩阵的大小都为NxN。
特征::VectorXd conditionGrid(…);一个循环,返回一个包含网格向量减去时间相关值的向量。
特征::MatrixXd-xjk矩阵(…);由两个向量通过循环构造的矩阵。
特征::MatrixXd-qzMatrix(…);使用xjk矩阵,使用概率密度函数逐元素构造新的矩阵。
特征::MatrixXd-q1zMatrix(…);也使用xjk矩阵,使用概率密度函数逐元素构造新的矩阵。
特征::MatrixXd-qjkMatrix(…);qz和网格的组合,逐元素循环。
特征::MatrixXd-q1jk矩阵(…);qz、q1z和网格的组合,逐元素循环。
特征::MatrixXd-mjkMatrix(…);逐元素循环求和来自qjk和q1jk的元素。
特征::MatrixXd-globalMatrix(…);循环除了固定的网格之外的所有上述函数(通常120次),并将120mjk矩阵相乘以获得全局矩阵。
全局矩阵200x200需要大约20秒的计算,500x500大约是200秒。如何使代码运行得更快,并优化矩阵乘法运算?(我尝试过稀疏矩阵,但花了更长的时间)。
我正在使用MinGW64。
确保使用完全优化进行编译,例如,如果使用g++,则使用g++ -O3 -DEIGEN_NO_DEBUG
。此外,通过OpenMP启用并行化可能会有所帮助,在编译和链接时使用-fopenmp
。
我使用以下代码来编译大多数特征码(使用g++):
g++ -I/path/to/eigen -O3 -DEIGEN_NO_DEBUG -fopenmp program.cpp
- 空基优化子对象的地址
- Eigen如何在容器循环中干净地附加矩阵
- 当在带有Eigen的C++中使用GDB时,我如何才能看到更多的大矩阵
- 关闭||运算符优化
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 返回值优化:显式移动还是隐式
- 使用Pybind11向Python公开Eigen::张量
- 人脸跟踪arduino代码的优化
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- 纯函数,为什么没有优化
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- Eigen:调用lpNorm()的正确方法
- 如何以优化的方式同时迭代两个间距不相等的数组
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- 小字符串优化(调试与发布模式)
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- Eigen c++ 三角形来自
- 在Eigen中优化大矩阵乘法
- 确定eigen是否为SSE指令优化了代码