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。
确保使用完全优化进行编译,例如,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)