在Eigen中优化大矩阵乘法

Optimize large matrices multiplication in Eigen

本文关键字:Eigen 优化      更新时间:2023-10-16

我正在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