我正在做一些量子计算的数值模拟,我希望找到一个大的厄米特矩阵的本征向量(~2^14行/列)
我在一台24核/48线程的XEON机器上运行。代码最初是在Qutip库的帮助下编写的。我发现包含的eigenstates()
函数只在我的机器上使用一个线程,所以我试图找到一种更快的方法来实现这一点。在
我尝试过使用scipy.linalg
eig()
和{scipy.sparse.linalg
eig()
和{
我已经看到一些建议,我可能会从使用slepc4py得到一些加速,但是包的文档似乎非常缺乏。我不知道如何将numpy复数数组转换为SLEPC矩阵。在
A = PETSc.Mat().create()
A[:,:] = B[:,:]
# where B is a scipy array of complex type
^{pr2}$
QuTiP中的特征解算器使用SciPy特征解算器。使用多少线程取决于SciPy链接到的BLAS库,以及您使用的是稀疏解算器还是密集解算器。在稠密的情况下,如果底层BLA利用了优势(例如Intel MKL),eigensolver将使用多个核心。稀疏解算器主要使用稀疏matvec操作,这些操作的内存带宽有限,因此使用单个内核最有效。如果你想要所有的特征值,那么你基本上就只能使用密集解算器了。然而,如果你只需要几个,比如最低的几个本征态,那么稀疏就是最好的选择。在
我最终找到了一个更简单的方法来使用所有的核心,似乎qutip没有告诉mkl使用所有的核心。 在python代码中,我添加了:
这迫使英特尔mkl使用所有的核心,给了我一个很好的加速。在
(回答来自question)
相关问题 更多 >
编程相关推荐