matrix - Intel Extended Eigensolver(用于稀疏矩阵)极慢

标签 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()

最后一个是扩展特征求解程序。我不认为 LAPACK 例程的 f77 和 f95 版本之间有任何区别,除了据我所知,dsyevr_f95() 没有 JOBZ 参数,因此我不能告诉它只计算特征值(而不是特征向量)。据我所知,我也不能告诉 dfeast_scsrev() 例程只计算特征值。

我为各种矩阵大小对这些例程进行计时,我发现 dfeast_scsrev()dsyevr_f95() 花费大约 100 倍的时间,这已经是原来的 10 倍比其他的慢,因为它也在计算特征向量。这对我来说似乎很奇怪,我想知道我是否做错了什么。结果如下所示:

time to build H就是构造矩阵的时间

矩阵的密度是非零元素的分数

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

我已确认所有例程都产生相同的特征值。

所以我的问题是,这是正确的吗?为什么稀疏特征求解器这么慢?我做错了什么或者我可以做些什么来加快速度吗?请注意,这里的所有内容都是按顺序运行的,没有并行化。最后,任何人都可以推荐一个替代的稀疏特征求解器吗?考虑到这些矩阵的稀疏性(并且我想达到 N=16 或更多),我认为稀疏求解器比密集的 LAPACK 求解器更有效。

最佳答案

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

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

关于matrix - Intel Extended Eigensolver(用于稀疏矩阵)极慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49710694/

相关文章:

arrays - 如何选择矩阵中除索引列表之外的行

android - 适用于 Android 的 OpenGL ES 2.0 翻译 - 似乎弄乱了矩阵

r - R中成对距离列表的距离矩阵

fortran - 结合 F77 和 F95 fortran 代码

c++ - 面向 MATLAB 用户的调试编译语言简介

fortran - 无需预处理即可通过子例程实现打印语句的强大功能?

python - 在 python 中将稀疏向量添加到稀疏数组太慢

r - 从 R 中的 Document-Term-Matrix 过滤行/文档

python - 有效地将稀疏 (csc) 矩阵列添加到形状正确的密集 numpy 数组中

python - 求解具有一些已知边界值的稀疏线性问题