特征值法中大矩阵乘法的优化 我在C++中做了一些大的随机矩阵(至少1000×1000)的计算,使用特征库,我的代码由以下函数组成:

特征值法中大矩阵乘法的优化 我在C++中做了一些大的随机矩阵(至少1000×1000)的计算,使用特征库,我的代码由以下函数组成:,c++,algorithm,matrix-multiplication,eigen,C++,Algorithm,Matrix Multiplication,Eigen,本征::矢量xd网格(…);使用快速排序算法和ran1算法初始化(逐元素)对数正态分布值的排序向量,比如大小为N,然后所有矩阵的大小均为NxN 特征::矢量xd条件网格(…);返回一个向量的循环,该向量包含栅格向量减去一个时间相关值 特征::矩阵xxd xjk矩阵(…);通过循环由两个向量构成的矩阵 本征::矩阵qzMatrix(…);使用xjk矩阵使用概率密度函数逐元素构造新矩阵 本征::矩阵Q1Z矩阵(…);也使用xjk矩阵,使用概率密度函数逐元素构造一个新矩阵 特征::矩阵XXD QJK矩

本征::矢量xd网格(…);使用快速排序算法和ran1算法初始化(逐元素)对数正态分布值的排序向量,比如大小为N,然后所有矩阵的大小均为NxN

特征::矢量xd条件网格(…);返回一个向量的循环,该向量包含栅格向量减去一个时间相关值

特征::矩阵xxd xjk矩阵(…);通过循环由两个向量构成的矩阵

本征::矩阵qzMatrix(…);使用xjk矩阵使用概率密度函数逐元素构造新矩阵

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

特征::矩阵XXD QJK矩阵(…);qz和网格的组合,逐元素循环

本征::矩阵XXD矩阵(…);qz、q1z和网格的组合,逐元素循环

本征::矩阵xxd mjkMatrix(…);对qjk和q1jk中的元素逐个元素循环求和

本征::矩阵XXD全局矩阵(…);循环所有上述函数(通常为120次),网格除外,网格是固定的,并将120 mjk矩阵相乘以获得全局函数

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


我使用的是MinGW64。

如果使用g++,请确保编译时进行了充分优化,例如
g++-O3-DEIGEN\u NO\u DEBUG
。此外,通过OpenMP启用并行化可能会有所帮助,在编译和链接时使用
-fopenmp

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


记录在案,使用Egen的devel分支对大小为500^2的矩阵进行120次乘法需要0.5秒,甚至不使用多线程(2.6GHz core i7)。我实际上是将代码编译为单个.cpp文件(在代码块中),然后,为了尝试您的编译器选项,我创建了一个projet并添加了.cpp文件。奇怪的是,将代码编译为projet使其速度提高了10倍,我不知道如何或为什么(我是初学者),编译器选项没有太大的区别。这仍然不够快,但这是一个良好的开端。还有什么建议吗?@ggael你能详细说明一下吗?伊根的devel分支是什么?@Naucle,伊根的devel分支是开发分支,即下一个版本。当您将文件编译为项目时,编译器可能会为您插入一些优化标志。尝试在发布模式下编译。另外,我会尝试使用我告诉过你的标志从命令行编译文件。@vsoftco我确实这么做了,我得到的运行持续时间与编译的项目类似,但不使用-fopenmp。此选项在命令行中编译,但会提供更长的运行持续时间,并且会在代码块中产生错误。
g++ -I/path/to/eigen -O3 -DEIGEN_NO_DEBUG -fopenmp program.cpp