Intel Extended Eigensolver(用于稀疏矩阵)非常慢

时间:2018-04-07 18:37:41

标签: matrix fortran sparse-matrix lapack intel-mkl

我试图找到相当大的稀疏矩阵的特征值,并且我安装了英特尔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求解器更有效。

1 个答案:

答案 0 :(得分:0)

我对您使用的库没有经验,因此我无法对其性能发表评论。如果要求代码在Fortran中,我使用JADAMILU在对称稀疏矩阵上获得了很好的结果,它执行自动预处理并且具有相当简单的文档(与ARPACK等一些旧学校的东西相比)。如果您可以远离使用Fortran,我建议PySparse

编辑:在查看您的测试数据后,我对您的结果并不感到惊讶。使用稀疏解算器会产生很大的性能开销,尤其是对于您使用的相对较小的阵列。您通常会从内存中获益,因为对于大型稀疏阵列,稀疏存储方法会显着压缩您的数据。