我试图找到相当大的稀疏矩阵的特征值,并且我安装了英特尔MKL库。我在Fortran 90中写作。由于我的矩阵很稀疏,我希望使用Extended Eigensolver例程来查找特征值。但是我发现与密集的MKL例程相比它非常慢。我编写了一个代码来生成各种大小2**N x 2**N
的矩阵,并使用以下例程以不同的方式找到特征值:
dsyev()
dsyevr()
dsyevd()
dsyev_f95()
dsyevr_f95()
dsyevd_f95()
dfeast_scsrev()
最后一个是Extended Eigensolver例程。我认为LAPACK例程的f77和f95版本之间没有任何区别,除了据我所知,dsyevr_f95()
没有JOBZ
参数,因此我无法告诉它仅计算特征值(而不是特征向量)。据我所知,我也不能告诉dfeast_scsrev()
例程只计算特征值。
我为各种矩阵大小计算了这些例程,我发现dfeast_scsrev()
比dsyevr_f95()
长约100倍,已经慢了10倍,因为它也在计算特征向量。这对我来说似乎很奇怪,我想知道我是不是在做某事。结果如下所示:
time to build H
是构建矩阵的时间
density of matrix
是非零元素的分数
time to convert to sparse
是从密集格式转换为CSR格式的时间(可忽略不计)。
表中列出的时间是调用调用相关LAPACK / MKL例程的子例程的时间。时间是在时钟时间,而不是时间
###############################################################################
N= 4
time to build H: 0
dimensions of matrix: 16 x 16
density of matrix: 0.140625000000000
time to convert to sparse: 0
time to run dfeast_scsrev: 1130
dsyev dsyevr dsyevd
----------------------------------------------------
f77 versions: 150 10 30
f95 versions: 30 30 20
sparse version : 1180
###############################################################################
N= 5
time to build H: 0
dimensions of matrix: 32 x 32
density of matrix: 0.109375000000000
time to convert to sparse: 0
time to run dfeast_scsrev: 50
dsyev dsyevr dsyevd
----------------------------------------------------
f77 versions: 20 30 40
f95 versions: 40 30 130
sparse version : 90
###############################################################################
N= 6
time to build H: 0
dimensions of matrix: 64 x 64
density of matrix: 6.250000000000000E-002
time to convert to sparse: 0
time to run dfeast_scsrev: 170
dsyev dsyevr dsyevd
----------------------------------------------------
f77 versions: 20 90 110
f95 versions: 30 60 90
sparse version : 340
###############################################################################
N= 7
time to build H: 0
dimensions of matrix: 128 x 128
density of matrix: 3.515625000000000E-002
time to convert to sparse: 0
time to run dfeast_scsrev: 520
dsyev dsyevr dsyevd
----------------------------------------------------
f77 versions: 180 140 140
f95 versions: 190 270 140
sparse version : 740
###############################################################################
N= 8
time to build H: 10
dimensions of matrix: 256 x 256
density of matrix: 1.739501953125000E-002
time to convert to sparse: 10
time to run dfeast_scsrev: 3750
dsyev dsyevr dsyevd
----------------------------------------------------
f77 versions: 350 270 520
f95 versions: 420 790 410
sparse version : 4240
###############################################################################
N= 9
time to build H: 0
dimensions of matrix: 512 x 512
density of matrix: 1.074218750000000E-002
time to convert to sparse: 10
time to run dfeast_scsrev: 33250
dsyev dsyevr dsyevd
----------------------------------------------------
f77 versions: 570 1050 820
f95 versions: 1060 2880 500
sparse version : 33670
###############################################################################
N= 10
time to build H: 10
dimensions of matrix: 1024 x 1024
density of matrix: 5.859375000000000E-003
time to convert to sparse: 80
time to run dfeast_scsrev: 222820
dsyev dsyevr dsyevd
----------------------------------------------------
f77 versions: 1870 2130 2230
f95 versions: 2290 8110 2010
sparse version : 223570
我的代码可以查看here
我已经确认所有例程都会产生相同的特征值。
所以我的问题是,这是正确的吗?为什么稀疏的eigensolver这么慢?有什么我做错了或我可以做些加速吗?注意这里的所有内容都按顺序运行,没有并行化。最后,任何人都可以推荐替代稀疏的eigensolver?鉴于这些矩阵的稀疏性(我想要达到N=16
或更多),我认为稀疏求解器比密集LAPACK求解器更有效。