Matrix 英特尔扩展特征解算器(用于稀疏矩阵)速度极慢
我正试图找到相当大的稀疏矩阵的特征值,我已经安装了英特尔MKL库。我正在用Fortran 90编写。因为我的矩阵是稀疏的,所以我希望使用例程来找到特征值。然而,我发现它与密集的MKL例程相比非常慢。我编写了一个代码来生成各种大小的矩阵Matrix 英特尔扩展特征解算器(用于稀疏矩阵)速度极慢,matrix,fortran,sparse-matrix,lapack,intel-mkl,Matrix,Fortran,Sparse Matrix,Lapack,Intel Mkl,我正试图找到相当大的稀疏矩阵的特征值,我已经安装了英特尔MKL库。我正在用Fortran 90编写。因为我的矩阵是稀疏的,所以我希望使用例程来找到特征值。然而,我发现它与密集的MKL例程相比非常慢。我编写了一个代码来生成各种大小的矩阵2**nx2**N,并使用以下例程找到各种特征值: dsyev() dsyevr() dsyevd() dsyev_f95() dsyevr_f95() dsyevd_f95() dfeast_scsrev() 最后一个是扩展的特征解算器例程。我不希望LAPACK
2**nx2**N
,并使用以下例程找到各种特征值:
dsyev()
dsyevr()
dsyevd()
dsyev_f95()
dsyevr_f95()
dsyevd_f95()
dfeast_scsrev()
最后一个是扩展的特征解算器例程。我不希望LAPACK例程的f77和f95版本之间有任何区别,除了据我所知,dsyevr_f95()
没有JOBZ
参数,因此我不能告诉它只计算特征值(而不是特征向量)。就我所知,我也不能告诉dfeast\u scsrev()
例程只计算特征值
我为不同的矩阵大小对这些例程进行计时,发现dfeast\u scsrev()
比dsyevr\u f95()
花费的时间大约要长100倍,这已经比其他程序慢了10倍,因为它也在计算特征向量。这对我来说似乎完全是一件怪事,我想知道我是否有什么地方做错了。结果如下所示:
构建H的时间
是构建矩阵的时间
矩阵密度
是非零元素的分数
转换为稀疏格式的时间
是从密集格式转换为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
可以查看我的代码
我已经证实所有的程序都会产生相同的特征值
所以我的问题是,这是正确的吗?为什么稀疏特征解算器如此缓慢?我有没有做错什么,或者我可以做些什么来加速它?注意这里的一切都是按顺序运行的,没有并行化。最后,有人能推荐另一种稀疏特征解算器吗?考虑到这些矩阵的稀疏性(我希望达到
N=16
或更高),我认为稀疏解算器将比密集LAPACK解算器更有效。我对您使用的库没有经验,因此我无法评论其性能。如果要求代码使用Fortran,那么我已经在对称稀疏矩阵方面获得了很好的结果,使用它可以执行自动预处理,并且有相当简单的文档(与一些老派的东西(如ARPACK)相比)。如果你不用Fortran,我推荐你
编辑:看了你的测试数据后,我对你的结果并不感到惊讶。使用稀疏解算器会带来很大的性能开销,尤其是对于所使用的阵列的相对较小的尺寸。您通常会从内存中获益,因为对于大型稀疏阵列,稀疏存储方法会显著压缩您的数据。我不一定需要所有的特征对,但我正在使用LAPACK例程查找所有特征值,因此我很惊讶它们会快得多。我还没有测试过只寻找几个特征值。稀疏解算器查找所有特征值的速度较慢,这有什么原因吗?如果有必要,另外,在英特尔论坛上发布一个问题(稍晚一点…)可能非常有用。先生,两年后,您是否找到其他高性能稀疏解算器?你能给我一些建议吗?@XuHui不幸的是,我从来没有解决过这个问题,从那以后我就不需要稀疏的特征解算器,并且能够使用常规的特征解算器