我正在做一些量子计算的数值模拟,我希望找到一个大的埃尔米特矩阵的特征向量(~2 ^ 14行/列)
我正在运行24核/ 48线程的XEON机器.该代码最初是在Qutip库的帮助下编写的.我发现包含的eigenstates()函数只使用我机器上的一个线程,所以我试图找到一种更快的方法来做到这一点.
我尝试使用scipy.linalg eig()和eigh()函数以及scipy.sparse.linalg eig()和eigh(),但两者看起来都比Qutip中构建的函数慢.
我已经看到一些建议,我可能会从使用slepc4py获得一些加速,但是包的文档似乎非常缺乏.我无法找到如何将numpy复杂数组转换为SLEPC矩阵.
A = PETSc.Mat().create()
A[:,:] = B[:,:]
# where B is a scipy array of complex type
TypeError: Cannot cast array data from dtype('complex128') to dtype('float64') according to the rule 'safe'
解决方法:
QuTiP中的eigensolver使用SciPy eigensolver.使用了多少个线程取决于SciPy链接到的BLAS库,以及您是使用稀疏或密集求解器.在密集的情况下,如果底层BLAS利用(例如英特尔MKL),本征解析器将使用多个核心.稀疏求解器主要使用稀疏的matvec操作,这些操作是内存带宽有限的,因此使用单个核心是最有效的.如果你想要所有特征值,那么你基本上使用密集求解器.但是,如果你只需要几个.,比如最低的几个本征态,那么稀疏就是要走的路.