4

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

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

我尝试使用scipy.linalg eig()andeigh()函数以及scipy.sparse.linalg eig()and ,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'
4

2 回答 2

1

QuTiP 中的特征求解器使用 SciPy 特征求解器。使用多少线程取决于 SciPy 链接到的 BLAS 库,以及您使用的是稀疏求解器还是密集求解器。在密集情况下,如果底层 BLAS 发挥优势(例如英特尔 MKL),本征求解器将使用多个内核。稀疏求解器主要使用内存带宽有限的稀疏 matvec 操作,因此使用单核最有效。如果您想要所有特征值,那么您基本上会使用密集求解器。但是,如果你只需要几个,比如最低的几个本征态,那么稀疏是要走的路。

于 2017-02-03T03:19:44.317 回答
0

我最终找到了一种更简单的方法来使用所有核心,似乎 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 使用所有内核,并给了我很好的加速。

(问题的答案

于 2017-02-05T11:59:05.310 回答