在HPC上快速使用Qutip和slepc4py找出特征向量

2024-05-14 08:50:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一些量子计算的数值模拟,我希望找到一个大的厄米特矩阵的本征向量(~2^14行/列)

我在一台24核/48线程的XEON机器上运行。代码最初是在Qutip库的帮助下编写的。我发现包含的eigenstates()函数只在我的机器上使用一个线程,所以我试图找到一种更快的方法来实现这一点。在

我尝试过使用scipy.linalgeig()和{}函数,以及scipy.sparse.linalgeig()和{}函数,但两者似乎都比Qutip中构建的函数慢。在

我已经看到一些建议,我可能会从使用slepc4py得到一些加速,但是包的文档似乎非常缺乏。我不知道如何将numpy复数数组转换为SLEPC矩阵。在

A = PETSc.Mat().create()
A[:,:] = B[:,:]
# where B is a scipy array of complex type
^{pr2}$

Tags: 方法函数代码机器量子矩阵scipy线程
2条回答

QuTiP中的特征解算器使用SciPy特征解算器。使用多少线程取决于SciPy链接到的BLAS库,以及您使用的是稀疏解算器还是密集解算器。在稠密的情况下,如果底层BLA利用了优势(例如Intel MKL),eigensolver将使用多个核心。稀疏解算器主要使用稀疏matvec操作,这些操作的内存带宽有限,因此使用单个内核最有效。如果你想要所有的特征值,那么你基本上就只能使用密集解算器了。然而,如果你只需要几个,比如最低的几个本征态,那么稀疏就是最好的选择。在

我最终找到了一个更简单的方法来使用所有的核心,似乎qutip没有告诉mkl使用所有的核心。 在python代码中,我添加了:

import ctypes
mkl_rt = ctypes.CDLL('libmkl_rt.so')
mkl_get_max_threads = mkl_rt.mkl_get_max_threads
mkl_rt.mkl_set_num_threads(ctypes.byref(ctypes.c_int(48)))

这迫使英特尔mkl使用所有的核心,给了我一个很好的加速。在

(回答来自question

相关问题 更多 >

    热门问题