是否有人知道并行精确矩阵对角化的实现版本(可能使用scipy/numpy)(等效地,找到特征系统)?如果有帮助的话,我的矩阵是对称和稀疏的。我不愿意花一天的时间做无谓的工作。
编辑:我的矩阵至少是10,000x10,000(但是,最好是至少大20倍)。目前,我只能使用一台4核的英特尔机器(带有超线程,所以每核2个进程),每核3.0Ghz, 12GB RAM。我以后可能会访问128核节点~3.6Ghz/核,256GB RAM,所以单机/多核应该可以做到(对于我的其他并行任务,我一直在使用multiprocessing
)。我更希望算法能很好地扩展。
我确实需要精确对角化,所以scipy.sparse
例程不适合我(尝试过,没有很好地工作)。我一直在使用numpy.linalg.eigh
(我看到只有单核做所有的计算)。
或者(对于最初的问题):是否有在线资源可以让我找到更多关于编译SciPy以确保并行执行的信息?
对于对称稀疏矩阵特征值/特征向量查找,您可以使用scipy.sparse.linalg.eigsh
。它在幕后使用ARPACK,并且有并行的ARPACK实现。当然,如果您的SciPy安装使用的是串行版本,那么SciPy可以被编译。
然而,这不是一个好的答案,如果你需要矩阵的所有特征值和特征向量,因为稀疏版本使用Lanczos算法。
如果你的矩阵不是非常大,那么就使用numpy.linalg.eigh
。它使用LAPACK或BLAS,并且可以在内部使用并行代码。
如果你最终自己编写,请注意SciPy/NumPy使用不同的高度优化的线性代数包来完成所有繁重的工作,而不是纯Python。因此,性能和并行度在很大程度上取决于您的SciPy/NumPy安装所编译的库。
(你的问题并没有揭示你是否只想让并行代码在几个处理器上运行,或者在几台计算机上运行。此外,矩阵的大小对最佳方法也有很大影响。所以,这个答案可能完全不正确。