优化 Eigen 中的大型矩阵乘法

Nau*_*cle 1 c++ algorithm matrix-multiplication eigen

我正在使用 Eigen 库在 C++ 中进行一些大型随机矩阵(至少 1000x1000)计算,我的代码由以下函数组成:

Eigen::VectorXd 网格(...); 使用快速排序算法和 ran1 算法(逐个元素)初始化对数正态分布值的排序向量,假设大小为 N,则所有矩阵的大小均为 NxN。

Eigen::VectorXd 条件网格(...); 返回包含网格向量减去时间相关值的向量的循环。

特征::MatrixXd xjkMatrix(...); 通过循环由两个向量构造的矩阵。

本征::MatrixXd qzMatrix(...); 使用 xjk 矩阵通过概率密度函数逐个元素构造一个新矩阵。

本征::MatrixXd q1zMatrix(...); 也使用 xjk 矩阵,使用概率密度函数逐个元素构造一个新矩阵。

本征::MatrixXd qjkMatrix(...); qz 和网格的组合,逐个元素循环。

本征::MatrixXd q1jkMatrix(...); qz、q1z 和网格的组合,逐个元素循环。

Eigen::MatrixXd mjkMatrix(...); 对 qjk 和 q1jk 中的元素逐个循环求和。

Eigen::MatrixXd globalMatrix(...); 循环除网格之外的所有函数(一般为 120 次),网格是固定的,并将 120 个 mjk 矩阵相乘以获得全局矩阵。

全局矩阵 200x200 大约需要 20 秒的计算时间,500x500 大约需要 200 秒。如何使我的代码运行得更快并优化我的矩阵乘法?(我尝试过稀疏矩阵,但花了更长的时间)。

我正在使用 MinGW64。

vso*_*tco 5

确保使用完全优化进行编译,例如,g++ -O3 -DEIGEN_NO_DEBUG如果使用 g++。此外,通过 OpenMP 打开并行化可能会有所帮助,使用-fopenmp在编译和链接时使用。

我使用以下代码来编译大多数 Eigen 代码(使用 g++):

g++ -I/path/to/eigen -O3 -DEIGEN_NO_DEBUG -fopenmp program.cpp
Run Code Online (Sandbox Code Playgroud)